package party.danyang.nationalgeographic.ui.home; import android.app.SharedElementCallback; import android.content.Intent; import android.databinding.DataBindingUtil; import android.os.Build; import android.os.Bundle; import android.support.design.widget.NavigationView; import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityOptionsCompat; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.GravityCompat; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AppCompatActivity; import android.view.MenuItem; import android.view.View; import android.view.ViewTreeObserver; import com.umeng.analytics.MobclickAgent; import java.util.List; import java.util.Map; import io.realm.Realm; import party.danyang.nationalgeographic.R; import party.danyang.nationalgeographic.adapter.AlbumListAdapter; import party.danyang.nationalgeographic.adapter.AlbumListUSAdapter; import party.danyang.nationalgeographic.databinding.ActivityHomeBinding; import party.danyang.nationalgeographic.ui.AboutActivity; import party.danyang.nationalgeographic.ui.AlbumActivity; import party.danyang.nationalgeographic.ui.RandomAlbumActivity; import party.danyang.nationalgeographic.ui.SettingsActivity; import party.danyang.nationalgeographic.utils.SettingsModel; import party.danyang.nationalgeographic.utils.Utils; import party.danyang.nationalgeographic.utils.singleton.PicassoHelper; import party.danyang.nationalgeographic.widget.OnStateChangedListener; public class HomeActivity extends AppCompatActivity { private static final String TAG = HomeActivity.class.getSimpleName(); private static final String TAG_TW = "tag.tw"; private static final String TAG_US = "tag.us"; private static final String SAVED_INSTANCE_STATE_TYPE = "savedInstanceState.type"; private Type type = Type.TW; private ActivityHomeBinding binding; public Realm realm; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_home); realm = Realm.getDefaultInstance(); initViews(); changeFragmentToType(type); setExitAnimator(); } @Override public void onResume() { super.onResume(); MobclickAgent.onResume(this); PicassoHelper.getInstance(this).resumeTag(AlbumListAdapter.TAG_HOME); PicassoHelper.getInstance(this).resumeTag(AlbumListUSAdapter.TAG_LIST_US); } @Override public void onPause() { super.onPause(); MobclickAgent.onPause(this); PicassoHelper.getInstance(this).pauseTag(AlbumListAdapter.TAG_HOME); PicassoHelper.getInstance(this).pauseTag(AlbumListUSAdapter.TAG_LIST_US); } @Override protected void onDestroy() { super.onDestroy(); PicassoHelper.getInstance(this).cancelTag(AlbumListAdapter.TAG_HOME); PicassoHelper.getInstance(this).cancelTag(AlbumListUSAdapter.TAG_LIST_US); realm.close(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(SAVED_INSTANCE_STATE_TYPE, type.ordinal()); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); if (savedInstanceState != null) { type = Type.valueOf(savedInstanceState.getInt(SAVED_INSTANCE_STATE_TYPE)); changeFragmentToType(type); } } private void initViews() { setupToolbar(); setupDrawer(); } public void setupToolbar() { setSupportActionBar(binding.toolbarContent.toolbar); //双击toolbar recyclerView回滚 binding.toolbarContent.toolbar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { onToolbarClicked(); } }); } private void setupDrawer() { final ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, binding.drawerLayout, binding.toolbarContent.toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); binding.drawerLayout.addDrawerListener(toggle); // binding.drawerLayout.setDrawerListener(toggle); if (type == Type.TW) { binding.navView.setCheckedItem(R.id.nav_group_pic); } else if (type == Type.US) { binding.navView.setCheckedItem(R.id.nav_single_pic_us); } toggle.syncState(); binding.navView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem item) { onNavItemSelected(item); binding.drawerLayout.closeDrawer(GravityCompat.START); return true; } }); binding.toolbarContent.toolbarLayout.setOnStateChangedListener(new OnStateChangedListener() { @Override public void onExpanded() { toggle.setDrawerIndicatorEnabled(false); } @Override public void onCollapsed() { toggle.setDrawerIndicatorEnabled(true); } @Override public void onInternediate() { toggle.setDrawerIndicatorEnabled(false); } }); } private void onNavItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.nav_group_pic: if (type == Type.TW) break; type = Type.TW; changeFragmentToType(type); break; case R.id.nav_single_pic_us: if (type == Type.US) break; type = Type.US; changeFragmentToType(type); break; case R.id.nav_random_pic: Intent intent1 = new Intent(this, RandomAlbumActivity.class); ActivityOptionsCompat options1 = ActivityOptionsCompat .makeCustomAnimation(this, R.anim.slide_right_in, R.anim.slide_right_out); ActivityCompat.startActivity(this, intent1, options1.toBundle()); break; case R.id.nav_settings: Intent intent = new Intent(this, SettingsActivity.class); ActivityOptionsCompat options = ActivityOptionsCompat .makeCustomAnimation(this, R.anim.slide_right_in, R.anim.slide_right_out); ActivityCompat.startActivity(this, intent, options.toBundle()); break; case R.id.nav_about: Intent i = new Intent(this, AboutActivity.class); ActivityOptionsCompat opts = ActivityOptionsCompat .makeCustomAnimation(this, R.anim.slide_right_in, R.anim.slide_right_out); ActivityCompat.startActivity(this, i, opts.toBundle()); break; } } private RecyclerViewTWFragment getTWFragment() { return (RecyclerViewTWFragment) getSupportFragmentManager().findFragmentByTag(TAG_TW); } private RecyclerViewUSFragment getUSFragment() { return (RecyclerViewUSFragment) getSupportFragmentManager().findFragmentByTag(TAG_US); } private void changeFragmentToType(Type type) { FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); Fragment tw = getTWFragment(); Fragment us = getUSFragment(); if (type == Type.TW) { if (tw != null) { //TW added if (us != null) { //US added transaction.hide(us).show(tw).commit(); } else { //US not added transaction.show(tw).commit(); } } else { //TW not added if (us != null) { //US added transaction.hide(us).add(R.id.recycler_content_fragment, RecyclerViewTWFragment.getInstance(), TAG_TW).commit(); } else { //US not added transaction.add(R.id.recycler_content_fragment, RecyclerViewTWFragment.getInstance(), TAG_TW).commit(); } } } else if (type == Type.US) { if (us != null) { if (tw != null) { transaction.hide(tw).show(us).commit(); } else { transaction.show(us).commit(); } } else { if (tw != null) { transaction.hide(tw).add(R.id.recycler_content_fragment, RecyclerViewUSFragment.getInstance(), TAG_US).commit(); } else { transaction.add(R.id.recycler_content_fragment, RecyclerViewUSFragment.getInstance(), TAG_US).commit(); } } } } //double click back to exit private long lastClickBackTime; @Override public void onBackPressed() { if (SettingsModel.getDoubleClickExit(this)) { if (System.currentTimeMillis() - lastClickBackTime < 500) { supportFinishAfterTransition(); } else { Utils.makeSnackBar(binding.getRoot(), R.string.click_ono_more_to_exit, true); lastClickBackTime = System.currentTimeMillis(); } } else { supportFinishAfterTransition(); } } //click toolbar then scroll to top private long lastClickToolbarTime; private void onToolbarClicked() { if (System.currentTimeMillis() - lastClickToolbarTime < 400) { if (type == Type.TW && getTWFragment() != null) { getTWFragment().binding.recycler.smoothScrollToPosition(0); } else if (type == Type.US && getUSFragment() != null) { getUSFragment().binding.recycler.smoothScrollToPosition(0); } } else { lastClickToolbarTime = System.currentTimeMillis(); } } //animation between activities //just used when type is US private Bundle reenterState; private void setExitAnimator() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { setExitSharedElementCallback(new SharedElementCallback() { @Override public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) { if (type == Type.US && reenterState != null) { int position = reenterState.getInt(AlbumActivity.INTENT_INDEX, 0); //判空 if (getUSFragment() == null || getUSFragment().adapter == null || position >= getUSFragment().adapter.size()) return; sharedElements.clear(); sharedElements.put(getUSFragment().adapter.get(position).getUrl(), getUSFragment().layoutManager.findViewByPosition(position)); reenterState = null; } } }); } } @Override public void onActivityReenter(int resultCode, Intent data) { super.onActivityReenter(resultCode, data); if (type == Type.US && getUSFragment() != null) { reenterState = new Bundle(data.getExtras()); int position = reenterState.getInt(AlbumActivity.INTENT_INDEX, 0); if (getUSFragment().binding == null || position >= getUSFragment().adapter.size()) return; supportPostponeEnterTransition(); getUSFragment().binding.recycler.scrollToPosition(position); getUSFragment().binding.recycler.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { getUSFragment().binding.recycler.getViewTreeObserver().removeOnPreDrawListener(this); getUSFragment().binding.recycler.requestLayout(); supportStartPostponedEnterTransition(); return true; } }); } } }