package org.cnodejs.android.md.ui.activity; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.view.View; import android.widget.CheckedTextView; import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.Glide; import com.melnykov.fab.FloatingActionButton; import org.cnodejs.android.md.R; import org.cnodejs.android.md.model.entity.TabType; import org.cnodejs.android.md.model.entity.Topic; import org.cnodejs.android.md.model.storage.LoginShared; import org.cnodejs.android.md.model.storage.SettingShared; import org.cnodejs.android.md.presenter.contract.IMainPresenter; import org.cnodejs.android.md.presenter.implement.MainPresenter; import org.cnodejs.android.md.ui.adapter.TopicListAdapter; import org.cnodejs.android.md.ui.base.FullLayoutActivity; import org.cnodejs.android.md.ui.dialog.AlertDialogUtils; import org.cnodejs.android.md.ui.listener.DoubleClickBackToContentTopListener; import org.cnodejs.android.md.ui.listener.NavigationOpenClickListener; import org.cnodejs.android.md.ui.util.Navigator; import org.cnodejs.android.md.ui.util.RefreshUtils; import org.cnodejs.android.md.ui.util.ThemeUtils; import org.cnodejs.android.md.ui.util.ToastUtils; import org.cnodejs.android.md.ui.view.IBackToContentTopView; import org.cnodejs.android.md.ui.view.IMainView; import org.cnodejs.android.md.ui.viewholder.LoadMoreFooter; import org.cnodejs.android.md.ui.widget.ListView; import org.cnodejs.android.md.util.FormatUtils; import org.cnodejs.android.md.util.HandlerUtils; import java.util.List; import butterknife.BindView; import butterknife.BindViews; import butterknife.ButterKnife; import butterknife.OnClick; public class MainActivity extends FullLayoutActivity implements IMainView, IBackToContentTopView, SwipeRefreshLayout.OnRefreshListener, LoadMoreFooter.OnLoadMoreListener { // 抽屉导航布局 @BindView(R.id.drawer_layout) protected DrawerLayout drawerLayout; // 导航部分的个人信息 @BindView(R.id.img_avatar) protected ImageView imgAvatar; @BindView(R.id.tv_login_name) protected TextView tvLoginName; @BindView(R.id.tv_score) protected TextView tvScore; @BindView(R.id.badge_nav_notification) protected TextView tvBadgeNotification; @BindView(R.id.btn_logout) protected View btnLogout; @BindView(R.id.btn_theme_dark) protected ImageView imgThemeDark; @BindView(R.id.img_nav_top_background) protected ImageView imgTopBackground; // 主要导航项 @BindViews({ R.id.btn_nav_all, R.id.btn_nav_good, R.id.btn_nav_share, R.id.btn_nav_ask, R.id.btn_nav_job }) protected List<CheckedTextView> navMainItemList; // 内容部分 @BindView(R.id.toolbar) protected Toolbar toolbar; @BindView(R.id.refresh_layout) protected SwipeRefreshLayout refreshLayout; @BindView(R.id.list_view) protected ListView listView; @BindView(R.id.icon_no_data) protected View iconNoData; @BindView(R.id.fab_create_topic) protected FloatingActionButton fabCreateTopic; private LoadMoreFooter loadMoreFooter; private TopicListAdapter adapter; private IMainPresenter mainPresenter; // 当前分页位置 private int page = 0; // 首次按下返回键时间戳 private long firstBackPressedTime = 0; // 是否启用夜间模式 private boolean enableThemeDark; @Override protected void onCreate(Bundle savedInstanceState) { enableThemeDark = ThemeUtils.configThemeBeforeOnCreate(this, R.style.AppThemeLight_FitsStatusBar, R.style.AppThemeDark_FitsStatusBar); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); drawerLayout.setDrawerShadow(R.drawable.navigation_drawer_shadow, GravityCompat.START); drawerLayout.addDrawerListener(drawerListener); toolbar.setNavigationOnClickListener(new NavigationOpenClickListener(drawerLayout)); toolbar.setOnClickListener(new DoubleClickBackToContentTopListener(this)); loadMoreFooter = new LoadMoreFooter(this, listView, this); adapter = new TopicListAdapter(this); listView.setAdapter(adapter); fabCreateTopic.attachToListView(listView); mainPresenter = new MainPresenter(this, this); updateUserInfoViews(); imgThemeDark.setImageResource(enableThemeDark ? R.drawable.ic_wb_sunny_white_24dp : R.drawable.ic_brightness_3_white_24dp); imgTopBackground.setVisibility(enableThemeDark ? View.INVISIBLE : View.VISIBLE); RefreshUtils.init(refreshLayout, this); RefreshUtils.refresh(refreshLayout, this); } @Override protected void onResume() { super.onResume(); mainPresenter.getMessageCountAsyncTask(); // 判断是否需要切换主题 if (SettingShared.isEnableThemeDark(this) != enableThemeDark) { ThemeUtils.notifyThemeApply(this, true); } } private final DrawerLayout.DrawerListener drawerListener = new DrawerLayout.SimpleDrawerListener() { @Override public void onDrawerOpened(View drawerView) { updateUserInfoViews(); mainPresenter.getUserAsyncTask(); mainPresenter.getMessageCountAsyncTask(); } @Override public void onDrawerClosed(View drawerView) { TabType tab = TabType.all; for (CheckedTextView navItem : navMainItemList) { if (navItem.isChecked()) { switch (navItem.getId()) { case R.id.btn_nav_all: tab = TabType.all; break; case R.id.btn_nav_good: tab = TabType.good; break; case R.id.btn_nav_share: tab = TabType.share; break; case R.id.btn_nav_ask: tab = TabType.ask; break; case R.id.btn_nav_job: tab = TabType.job; break; default: throw new AssertionError("Unknow tab."); } break; } } mainPresenter.switchTab(tab); } }; @Override public void onRefresh() { mainPresenter.refreshTopicListAsyncTask(); } @Override public void onLoadMore() { mainPresenter.loadMoreTopicListAsyncTask(page + 1); } /** * 主导航项单击事件 */ @OnClick({ R.id.btn_nav_all, R.id.btn_nav_good, R.id.btn_nav_share, R.id.btn_nav_ask, R.id.btn_nav_job }) public void onNavigationMainItemClick(CheckedTextView itemView) { for (CheckedTextView navItem : navMainItemList) { navItem.setChecked(navItem.getId() == itemView.getId()); } drawerLayout.closeDrawers(); } /** * 次要菜单导航 */ @OnClick({ R.id.btn_nav_notification, R.id.btn_nav_setting, R.id.btn_nav_about }) public void onNavigationItemOtherClick(View itemView) { switch (itemView.getId()) { case R.id.btn_nav_notification: if (LoginActivity.checkLogin(this)) { notificationAction.startDelayed(); drawerLayout.closeDrawers(); } break; case R.id.btn_nav_setting: settingAction.startDelayed(); drawerLayout.closeDrawers(); break; case R.id.btn_nav_about: aboutAction.startDelayed(); drawerLayout.closeDrawers(); break; } } private class OtherItemAction implements Runnable { private Class gotoClz; protected OtherItemAction(Class gotoClz) { this.gotoClz = gotoClz; } @Override public void run() { if (gotoClz == NotificationActivity.class) { Navigator.NotificationWithAutoCompat.start(MainActivity.this); } else { startActivity(new Intent(MainActivity.this, gotoClz)); } } public void startDelayed() { HandlerUtils.handler.postDelayed(this, 400); } } private OtherItemAction notificationAction = new OtherItemAction(NotificationActivity.class); private OtherItemAction settingAction = new OtherItemAction(SettingActivity.class); private OtherItemAction aboutAction = new OtherItemAction(AboutActivity.class); /** * 注销按钮 */ @OnClick(R.id.btn_logout) protected void onBtnLogoutClick() { AlertDialogUtils.createBuilderWithAutoTheme(this) .setMessage(R.string.logout_tip) .setPositiveButton(R.string.logout, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { LoginShared.logout(MainActivity.this); tvBadgeNotification.setText(null); // 未读消息清空 updateUserInfoViews(); } }) .setNegativeButton(R.string.cancel, null) .show(); } /** * 主题按钮 */ @OnClick(R.id.btn_theme_dark) protected void onBtnThemeDarkClick() { SettingShared.setEnableThemeDark(this, !enableThemeDark); ThemeUtils.notifyThemeApply(this, false); } /** * 用户信息按钮 */ @OnClick(R.id.layout_info) protected void onBtnInfoClick() { if (TextUtils.isEmpty(LoginShared.getAccessToken(this))) { LoginActivity.startForResult(this); } else { UserDetailActivity.startWithTransitionAnimation(this, LoginShared.getLoginName(this), imgAvatar, LoginShared.getAvatarUrl(this)); } } /** * 发帖按钮 */ @OnClick(R.id.fab_create_topic) protected void onBtnCreateTopicClick() { if (LoginActivity.checkLogin(this)) { startActivity(new Intent(this, CreateTopicActivity.class)); } } /** * 判断登录是否成功 */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == LoginActivity.REQUEST_LOGIN && resultCode == RESULT_OK) { updateUserInfoViews(); mainPresenter.getUserAsyncTask(); } } /** * 返回键关闭导航 */ @Override public void onBackPressed() { if (drawerLayout.isDrawerOpen(GravityCompat.START)) { drawerLayout.closeDrawer(GravityCompat.START); } else { long secondBackPressedTime = System.currentTimeMillis(); if (secondBackPressedTime - firstBackPressedTime > 2000) { ToastUtils.with(this).show(R.string.press_back_again_to_exit); firstBackPressedTime = secondBackPressedTime; } else { super.onBackPressed(); } } } @Override public void onSwitchTabOk(@NonNull TabType tab) { page = 0; toolbar.setTitle(tab.getNameId()); adapter.getTopicList().clear(); adapter.notifyDataSetChanged(); loadMoreFooter.setState(LoadMoreFooter.STATE_DISABLED); iconNoData.setVisibility(View.VISIBLE); fabCreateTopic.show(true); refreshLayout.setRefreshing(true); onRefresh(); } @Override public void onRefreshTopicListOk(@NonNull List<Topic> topicList) { adapter.getTopicList().clear(); adapter.getTopicList().addAll(topicList); adapter.notifyDataSetChanged(); if (adapter.getTopicList().isEmpty()) { loadMoreFooter.setState(LoadMoreFooter.STATE_DISABLED); iconNoData.setVisibility(View.VISIBLE); } else { loadMoreFooter.setState(LoadMoreFooter.STATE_ENDLESS); iconNoData.setVisibility(View.GONE); } page = 1; } @Override public void onRefreshTopicListFinish() { refreshLayout.setRefreshing(false); } @Override public void onLoadMoreTopicListOk(@NonNull List<Topic> topicList) { adapter.getTopicList().addAll(topicList); adapter.notifyDataSetChanged(); page++; } @Override public void onLoadMoreTopicListFinish(@LoadMoreFooter.State int state) { loadMoreFooter.setState(state); } @Override public void updateUserInfoViews() { if (TextUtils.isEmpty(LoginShared.getAccessToken(this))) { Glide.with(this).load(R.drawable.image_placeholder).placeholder(R.drawable.image_placeholder).dontAnimate().into(imgAvatar); tvLoginName.setText(R.string.click_avatar_to_login); tvScore.setText(null); btnLogout.setVisibility(View.GONE); } else { Glide.with(this).load(LoginShared.getAvatarUrl(this)).placeholder(R.drawable.image_placeholder).dontAnimate().into(imgAvatar); tvLoginName.setText(LoginShared.getLoginName(this)); tvScore.setText(getString(R.string.score_$d, LoginShared.getScore(this))); btnLogout.setVisibility(View.VISIBLE); } } @Override public void updateMessageCountViews(int count) { tvBadgeNotification.setText(FormatUtils.getNavigationDisplayCountString(count)); } @Override public void backToContentTop() { listView.setSelection(0); } }