com.jun.elephant.ui.main.MainActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.jun.elephant.ui.main.MainActivity.java

Source

/*
 * Copyright 2016 Freelander
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.jun.elephant.ui.main;

import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.google.gson.Gson;
import com.jun.elephant.R;
import com.jun.elephant.api.Networks;
import com.jun.elephant.common.BaseActivity;
import com.jun.elephant.entity.DrawerMenuEntity;
import com.jun.elephant.entity.user.UserInfoEntity;
import com.jun.elephant.global.Constants;
import com.jun.elephant.global.UserConstant;
import com.jun.elephant.ui.adapter.DrawerMenuAdapter;
import com.jun.elephant.ui.login.LoginActivity;
import com.jun.elephant.ui.topic.list.TopicListByForumFragment;
import com.jun.elephant.ui.topic.list.TopicListByMeFragment;
import com.jun.elephant.ui.user.info.UserInfoActivity;
import com.jun.elephant.ui.user.message.UserMessageActivity;
import com.jun.elephant.ui.widget.MySimpleDraweeView;
import com.jun.elephant.ui.widget.ThemeDialog;
import com.jun.elephant.util.OpenWebViewUtils;
import com.jun.elephant.util.PermissionsChecker;
import com.jun.elephant.util.SharePreferencesHelper;

import java.util.ArrayList;
import java.util.List;

import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;

import static com.jun.elephant.util.PermissionsChecker.REQUEST_STORAGE_PERMISSION;

/**
 * Created by Jun on 2016/3/1.
 */
public class MainActivity extends BaseActivity
        implements Toolbar.OnMenuItemClickListener, ThemeDialog.OnThemeChangeListener,
        DrawerMenuAdapter.OnMenuItemClickListener, MaterialDialog.SingleButtonCallback {

    @Bind(R.id.toolBar)
    Toolbar mToolBar;
    @Bind(R.id.container)
    FrameLayout mContainer;
    @Bind(R.id.main_content)
    LinearLayout mMainContentLl;
    @Bind(R.id.name_tv)
    TextView mNameTv;
    @Bind(R.id.user_email_tv)
    TextView mUserEmailTv;
    @Bind(R.id.menu_down_iv)
    ImageView mMenuDownIv;
    @Bind(R.id.drawer_menu_rc)
    RecyclerView mDrawerMenuRc;
    @Bind(R.id.navigation_view)
    LinearLayout mNavigationView;
    @Bind(R.id.drawerLayout)
    DrawerLayout mDrawerLayout;
    @Bind(R.id.user_iv)
    MySimpleDraweeView mUserImgIv;
    @Bind(R.id.login_tv)
    TextView mLoginTv;
    @Bind(R.id.login_success_rl)
    RelativeLayout mLoginShowRl;

    private List<DrawerMenuEntity> mMainMenuList, mMyMenuList;

    private DrawerMenuAdapter mMenuAdapter;

    private TopicListByForumFragment mCommonFragment;

    private TopicListByMeFragment mTopicListByMeFragment;

    private UserInfoEntity mUserInfoEntity;

    private ThemeDialog mThemeDialog;

    private MaterialDialog.Builder mExitLoginDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        setFrameId(R.id.container);
        setExit(true);
    }

    @Override
    public void initData() {
        super.initData();

        mThemeDialog = new ThemeDialog(this);
        mExitLoginDialog = new MaterialDialog.Builder(this);

        mCommonFragment = new TopicListByForumFragment();
        mTopicListByMeFragment = new TopicListByMeFragment();

        String token = SharePreferencesHelper.getInstance(this).getString(Constants.Key.TOKEN);
        if (!TextUtils.isEmpty(token)) {
            Networks.setToken(token);
        }

        mMainMenuList = new ArrayList<>();
        mMainMenuList.add(new DrawerMenuEntity(getString(R.string.menu_recommend), R.mipmap.ic_main_recommend));
        mMainMenuList.add(new DrawerMenuEntity(getString(R.string.menu_hot), R.mipmap.ic_main_hot));
        mMainMenuList.add(new DrawerMenuEntity(getString(R.string.menu_newest), R.mipmap.ic_main_newest));
        mMainMenuList.add(new DrawerMenuEntity(getString(R.string.menu_nobody), R.mipmap.ic_main_nobody));
        mMainMenuList.add(new DrawerMenuEntity(getString(R.string.menu_jobs), R.mipmap.ic_main_work));
        mMainMenuList.add(new DrawerMenuEntity(getString(R.string.menu_wiki), R.mipmap.ic_main_wiki));

        mMyMenuList = new ArrayList<>();
        mMyMenuList.add(new DrawerMenuEntity(getString(R.string.menu_vote), R.mipmap.ic_my_vote));
        mMyMenuList.add(new DrawerMenuEntity(getString(R.string.menu_topic), R.mipmap.ic_my_topic));
        mMyMenuList.add(new DrawerMenuEntity(getString(R.string.menu_revert), R.mipmap.ic_my_reply));

        mMenuAdapter = new DrawerMenuAdapter(this, mMainMenuList);

    }

    @Override
    public void initView() {
        initExitLoginDialog();
        initToolbar();

        if (getUserConstant().isLogin()) {
            mUserInfoEntity = UserConstant.getInstance(this).getUserData();

            Uri uri = Uri.parse(mUserInfoEntity.getData().getAvatar());
            mUserImgIv.setImageURI(uri);
            mUserEmailTv.setText(mUserInfoEntity.getData().getEmail());
            mNameTv.setText(mUserInfoEntity.getData().getName());

            mLoginShowRl.setVisibility(View.VISIBLE);
            mLoginTv.setVisibility(View.GONE);

            mMainMenuList.addAll(mMyMenuList);
        }

        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
        mDrawerMenuRc.setLayoutManager(layoutManager);
        mDrawerMenuRc.setAdapter(mMenuAdapter);

        Bundle bundle = new Bundle();
        bundle.putString(Constants.Key.TOPIC_TYPE, Constants.Topic.EXCELLENT);
        mCommonFragment.setArguments(bundle);
        setCurrFragment(mCommonFragment);
        toFragment(mCommonFragment);
    }

    private void initToolbar() {
        mToolBar.inflateMenu(R.menu.menu_main);
        Resources.Theme theme = getTheme();
        TypedValue navIcon = new TypedValue();
        TypedValue overFlowIcon = new TypedValue();

        theme.resolveAttribute(R.attr.navIcon, navIcon, true);
        theme.resolveAttribute(R.attr.overFlowIcon, overFlowIcon, true);

        mToolBar.setNavigationIcon(navIcon.resourceId);
        mToolBar.setOverflowIcon(ContextCompat.getDrawable(this, overFlowIcon.resourceId));
    }

    private void initExitLoginDialog() {
        mExitLoginDialog.content(getString(R.string.dialog_exit_login)).positiveColorRes(R.color.colorPrimary)
                .negativeColorRes(R.color.colorPrimary).positiveText(getString(R.string.dialog_exit_positive_text))
                .negativeText(getString(R.string.dialog_exit_negative_text));
    }

    @Override
    public void initListener() {
        mToolBar.setOnMenuItemClickListener(this);
        mToolBar.setNavigationOnClickListener(this);
        mThemeDialog.setOnThemeChangeListener(this);
        mMenuAdapter.setOnMenuItemClickListener(this);
        mExitLoginDialog.onPositive(this);
    }

    private void toUserFragment() {
        toFragment(mTopicListByMeFragment);
        if (mTopicListByMeFragment.isAdded()) {
            mTopicListByMeFragment.getData();
        }
    }

    private void toCommonFragment() {
        toFragment(mCommonFragment);
        if (mCommonFragment.isAdded()) {
            mCommonFragment.getData();
        }
    }

    @OnClick({ R.id.login_tv, R.id.login_success_rl, R.id.user_iv, R.id.setting_ll, R.id.login_help_ll })
    @Override
    public void onClick(View v) {
        super.onClick(v);
        switch (v.getId()) {
        case R.id.login_success_rl:
            mExitLoginDialog.show();
            break;

        case R.id.login_tv:
        case R.id.user_iv:
            if (getUserConstant().isLogin()) {
                startActivity(UserInfoActivity.newIntent(this, getUserConstant().getUserData().getData().getId()));
                return;
            }
            //????
            if (PermissionsChecker.lacksPermissions(this, PermissionsChecker.photosPermissions)) {
                Intent intent = new Intent(this, LoginActivity.class);
                startActivityForResult(intent, Constants.Activity.LoginActivity);
            }
            break;
        case R.id.setting_ll:
            mThemeDialog.show();
            break;
        case R.id.login_help_ll:
            OpenWebViewUtils.loginHelp(this);
            break;
        default:
            if (mDrawerLayout.isDrawerOpen(Gravity.LEFT)) {
                mDrawerLayout.closeDrawers();
            } else {
                mDrawerLayout.openDrawer(Gravity.LEFT);
            }
            break;
        }
    }

    /**
     *  dialog ?
     * @param dialog
     * @param which
     */
    @Override
    public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
        switch (which) {
        case POSITIVE:
            if (getUserConstant().logout()) { //
                mLoginShowRl.setVisibility(View.GONE);
                mLoginTv.setVisibility(View.VISIBLE);
                mMainMenuList.removeAll(mMyMenuList);
                mMenuAdapter.notifyDataSetChanged();
                mUserImgIv.setImageURI(Uri.parse("res://com.jun.elephant/" + R.color.main_bg));
                dialog.dismiss();
            }
            break;
        case NEGATIVE:
            dialog.dismiss();
            break;
        }
    }

    /**
     * DrawerLayout menu click callback
     * @param position menu click position
     */
    @Override
    public void onMenuItemClick(int position) {
        switch (position) {
        case 0:
            switchFragment(getString(R.string.menu_recommend), Constants.Topic.EXCELLENT);
            break;
        case 1:
            switchFragment(getString(R.string.menu_hot), Constants.Topic.VOTE);
            break;
        case 2:
            switchFragment(getString(R.string.menu_newest), Constants.Topic.NEWEST);
            break;
        case 3:
            switchFragment(getString(R.string.menu_nobody), Constants.Topic.NOBODY);
            break;
        case 4:
            switchFragment(getString(R.string.menu_jobs), Constants.Topic.JOBS);
            break;
        case 5:
            switchFragment(getString(R.string.menu_wiki), Constants.Topic.WIKI);
            break;
        case 6:
            mToolBar.setTitle(getString(R.string.menu_vote));
            mTopicListByMeFragment.TYPE = Constants.User.USER_TOPIC_VOTES;
            toUserFragment();
            break;
        case 7:
            mToolBar.setTitle(getString(R.string.menu_topic));
            mTopicListByMeFragment.TYPE = Constants.User.USER_TOPIC_MY;
            toUserFragment();
            break;
        case 8:
            OpenWebViewUtils.myReply(MainActivity.this, mUserInfoEntity.getData().getLinks().getReplies_web_view());
            break;
        }

        if (position != 8) {
            mMenuAdapter.setSelectPosition(position);
            mMenuAdapter.notifyDataSetChanged();
            mDrawerLayout.closeDrawers();
        }
    }

    /**
     * toolbar menu click callback
     * @param item menu item
     * @return true
     */
    @Override
    public boolean onMenuItemClick(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.action_notice:
            if (getUserConstant().isLogin()) {
                openActivity(UserMessageActivity.class);
            } else {
                showShortToast(getString(R.string.toast_no_login));
            }
            break;

        case R.id.action_about:
            OpenWebViewUtils.aboutMe(this);
            break;

        case R.id.action_search:
            showShortToast(getString(R.string.toast_adorn));
            break;

        case R.id.action_settings:
            openActivity(SettingActivity.class);
            break;
        }
        return true;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == RESULT_OK && requestCode == Constants.Activity.LoginActivity) {
            mUserInfoEntity = data.getExtras().getParcelable(Constants.Key.USER_DATA);

            assert mUserInfoEntity != null;
            Uri uri = Uri.parse(mUserInfoEntity.getData().getAvatar());
            mUserImgIv.setImageURI(uri);
            mUserEmailTv.setText(mUserInfoEntity.getData().getEmail());
            mNameTv.setText(mUserInfoEntity.getData().getName());

            getUserConstant().saveUserData(new Gson().toJson(mUserInfoEntity));

            mLoginShowRl.setVisibility(View.VISIBLE);
            mLoginTv.setVisibility(View.GONE);

            mMainMenuList.addAll(mMyMenuList);
            mMenuAdapter.notifyDataSetChanged();
        }
    }

    /**
     * ? fragment ?
     * @param title 
     * @param type 
     */
    private void switchFragment(String title, String type) {
        mCommonFragment.TYPE = type;
        mToolBar.setTitle(title);
        toCommonFragment();
    }

    /**
     * ?
     */
    private void changeTheme() {
        refreshUI();
        mCommonFragment.refreshUI();
        mDrawerLayout.closeDrawers();
    }

    /**
     *  UI
     * ??view?
     */
    private void refreshUI() {
        TypedValue themeColor = new TypedValue(); //
        TypedValue statusColor = new TypedValue(); //??
        TypedValue toolbarTextColor = new TypedValue(); //??
        TypedValue navIcon = new TypedValue(); //toolbar 
        TypedValue searchIcon = new TypedValue(); //toolbar ?
        TypedValue noticeIcon = new TypedValue(); //toolbar 
        TypedValue overFlowIcon = new TypedValue(); //toolbar 

        //????
        Resources.Theme theme = getTheme();
        theme.resolveAttribute(R.attr.elephantTheme, themeColor, true);
        theme.resolveAttribute(R.attr.elephantStatus, statusColor, true);
        theme.resolveAttribute(R.attr.elephantToolbarText, toolbarTextColor, true);
        theme.resolveAttribute(R.attr.navIcon, navIcon, true);
        theme.resolveAttribute(R.attr.menuSearch, searchIcon, true);
        theme.resolveAttribute(R.attr.menuNotice, noticeIcon, true);
        theme.resolveAttribute(R.attr.overFlowIcon, overFlowIcon, true);

        //??
        mToolBar.getMenu().findItem(R.id.action_search).setIcon(searchIcon.resourceId);
        mToolBar.getMenu().findItem(R.id.action_notice).setIcon(noticeIcon.resourceId);
        mToolBar.setNavigationIcon(navIcon.resourceId);
        mToolBar.setOverflowIcon(ContextCompat.getDrawable(this, overFlowIcon.resourceId));
        mToolBar.setBackgroundColor(ContextCompat.getColor(this, themeColor.resourceId));
        mToolBar.setTitleTextColor(ContextCompat.getColor(this, toolbarTextColor.resourceId));

        changeStatusColor(statusColor.resourceId);
    }

    /**
     * ???
     * @param colorValue 
     */
    private void changeStatusColor(int colorValue) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = getWindow();
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(ContextCompat.getColor(this, colorValue));
        }
    }

    @Override
    public void onChangeTheme(View view) {
        switch (view.getId()) {
        case R.id.theme_blue:
            setTheme(R.style.BlueTheme); //
            mThemeUtil.setTheme(Constants.Theme.Blue); //??
            break;
        case R.id.theme_gray:
            setTheme(R.style.GrayTheme);
            mThemeUtil.setTheme(Constants.Theme.Gray);
            break;
        case R.id.theme_white:
            setTheme(R.style.WhiteTheme);
            mThemeUtil.setTheme(Constants.Theme.White);
            break;
        }
        changeTheme();
    }

    /**
     * ???
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
            @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_STORAGE_PERMISSION) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { //?
                Intent intent = new Intent(this, LoginActivity.class);
                startActivityForResult(intent, Constants.Activity.LoginActivity);
            } else { // ?
                showShortToast(getString(R.string.toast_permission_fail));
            }
        }
    }

}