package com.xiaomai.geek.ui;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.NavigationView;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TextInputLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.text.TextUtils;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.tencent.bugly.beta.Beta;
import com.xiaomai.geek.GeekApplication;
import com.xiaomai.geek.R;
import com.xiaomai.geek.common.wrapper.ImageLoader;
import com.xiaomai.geek.data.module.User;
import com.xiaomai.geek.data.pref.AccountPref;
import com.xiaomai.geek.data.pref.PasswordPref;
import com.xiaomai.geek.di.IComponent;
import com.xiaomai.geek.di.component.DaggerMainComponent;
import com.xiaomai.geek.di.component.MainComponent;
import com.xiaomai.geek.di.module.ActivityModule;
import com.xiaomai.geek.event.AccountEvent;
import com.xiaomai.geek.ui.base.BaseActivity;
import com.xiaomai.geek.ui.module.AboutUsFragment;
import com.xiaomai.geek.ui.module.articel.ArticleContainerFragment;
import com.xiaomai.geek.ui.module.github.GitHubContainerFragment;
import com.xiaomai.geek.ui.module.github.UserActivity;
import com.xiaomai.geek.ui.module.password.PasswordContainerFragment;
import com.xiaomai.geek.ui.module.video.VideoContainerFragment;
import com.xiaomai.geek.ui.widget.EditTextDialog;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import butterknife.BindView;
import butterknife.ButterKnife;
public class MainActivity extends BaseActivity
implements NavigationView.OnNavigationItemSelectedListener, IComponent<MainComponent> {
public static final String SYSTEM_REASON = "reason";
public static final String SYSTEM_HOME_KEY = "homekey";
public static final String SYSTEM_HOME_KEY_LONG = "recentapps";
private static final String TAG = "MainActivity";
@BindView(R.id.fl_container)
FrameLayout flContainer;
@BindView(R.id.nav_view)
NavigationView navView;
@BindView(R.id.drawer_layout)
DrawerLayout drawerLayout;
private FragmentManager mFragmentManager = getSupportFragmentManager();
private Fragment mCurrentFragment;
private int mCurrentPosition = 0;
private boolean runInBackground;
private boolean mIsDialogShowing;
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (TextUtils.equals(action, Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
String reason = intent.getStringExtra(SYSTEM_REASON);
if (TextUtils.equals(reason, SYSTEM_HOME_KEY)) {
// 表示按了home键
Log.e(TAG, "onReceive: home press");
runInBackground = true;
} else if (TextUtils.equals(reason, SYSTEM_HOME_KEY_LONG)) {
// 表示长按home键
}
}
}
};
private long mLastBackTime = 0L;
private ImageView mUserHeadImage;
private TextView mTvUserName;
public static void launch(Context context) {
context.startActivity(new Intent(context, MainActivity.class));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
initViews();
registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
EventBus.getDefault().register(this);
}
private void initViews() {
View headerView = navView.getHeaderView(0);
mUserHeadImage = (ImageView) headerView.findViewById(R.id.userHead);
mTvUserName = (TextView) headerView.findViewById(R.id.userName);
updateHeadView();
headerView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (AccountPref.checkLogin(MainActivity.this)) {
UserActivity.launch(MainActivity.this, AccountPref.getLoginUser(MainActivity.this));
}
}
});
navView.setNavigationItemSelectedListener(this);
changeFragment(ArticleContainerFragment.class.getName());
}
private void updateHeadView() {
if (AccountPref.isLogin(this)) {
User user = AccountPref.getLoginUser(this);
ImageLoader.loadWithCircle(this, user.getAvatar_url(), mUserHeadImage, R.drawable.github);
mTvUserName.setText(user.getLogin());
} else {
mUserHeadImage.setImageResource(R.drawable.github);
mTvUserName.setText("登录");
}
}
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_article:
changeFragment(ArticleContainerFragment.class.getName());
mCurrentPosition = 0;
break;
case R.id.menu_gitHub:
changeFragment(GitHubContainerFragment.class.getName());
mCurrentPosition = 1;
break;
case R.id.menu_video:
changeFragment(VideoContainerFragment.class.getName());
mCurrentPosition = 2;
break;
case R.id.menu_password_manage:
openPassword();
break;
case R.id.menu_about:
changeFragment(AboutUsFragment.class.getName());
mCurrentPosition = 4;
break;
case R.id.menu_upgrade:
// 第一个参数:是否为用户手动点击,第二个参数:是否提示用户正在检查更新
Beta.checkUpgrade(true, false);
return true;
}
drawerLayout.closeDrawer(GravityCompat.START);
return true;
}
private void openPassword() {
new EditTextDialog.Builder(mContext)
.setTitle(PasswordPref.hasPassword(mContext) ? "打开密码箱" : "设置密码")
.setCancelable(!runInBackground)
.setOnNegativeButtonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!runInBackground) {
navView.getMenu().getItem(mCurrentPosition).setChecked(true);
} else {
finish();
}
}
}).setOnPositiveButtonClickListener(
new EditTextDialog.Builder.OnPositiveButtonClickListener() {
@Override
public void onClick(EditTextDialog dialog,
TextInputLayout textInputLayout, String password) {
if (PasswordPref.hasPassword(mContext)) {
if (PasswordPref.isPasswordCorrect(mContext, password)) {
dialog.dismiss();
changeFragment(PasswordContainerFragment.class.getName());
mCurrentPosition = 3;
runInBackground = false;
mIsDialogShowing = false;
} else {
textInputLayout.setError("密码错误");
}
} else {
if (password.length() < 6) {
textInputLayout.setError("密码长度不能小于6");
} else {
PasswordPref.savePassword(mContext, password);
dialog.dismiss();
changeFragment(PasswordContainerFragment.class.getName());
mCurrentPosition = 3;
Snackbar.make(flContainer, "密码设置成功,请牢记密码",
Snackbar.LENGTH_LONG).show();
}
}
}
})
.create().show();
mIsDialogShowing = true;
}
private void changeFragment(String fragmentName) {
Fragment fragment = mFragmentManager.findFragmentByTag(fragmentName);
if (fragment != null) {
if (fragment == mCurrentFragment) {
return;
} else {
mFragmentManager.beginTransaction().show(fragment).commit();
}
} else {
fragment = Fragment.instantiate(mContext, fragmentName);
mFragmentManager.beginTransaction().add(R.id.fl_container, fragment, fragmentName)
.commit();
}
if (mCurrentFragment != null) {
mFragmentManager.beginTransaction().hide(mCurrentFragment).commit();
}
mCurrentFragment = fragment;
}
@Override
public void onBackPressed() {
if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
drawerLayout.closeDrawer(GravityCompat.START);
return;
}
if (System.currentTimeMillis() - mLastBackTime < 1000) {
finish();
} else {
mLastBackTime = System.currentTimeMillis();
Toast.makeText(this, "再按一次退出应用", Toast.LENGTH_SHORT).show();
}
}
public void openDrawer() {
drawerLayout.openDrawer(GravityCompat.START);
}
@Override
protected void onResume() {
super.onResume();
if (mCurrentFragment == mFragmentManager
.findFragmentByTag(PasswordContainerFragment.class.getName()) && runInBackground
&& !mIsDialogShowing) {
openPassword();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mReceiver != null)
unregisterReceiver(mReceiver);
EventBus.getDefault().unregister(this);
}
@Override
public MainComponent getComponent() {
return DaggerMainComponent.builder()
.applicationComponent(GeekApplication.get(this).getComponent())
.activityModule(new ActivityModule(this))
.build();
}
@Subscribe
public void onHandleAccountEvent(AccountEvent accountEvent) {
updateHeadView();
}
}