package com.hannesdorfmann.mosby3.sample.mail; import android.animation.LayoutTransition; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.widget.Toolbar; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import com.hannesdorfmann.mosby3.sample.mail.base.view.BaseActivity; import com.hannesdorfmann.mosby3.sample.mail.details.DetailsFragment; import com.hannesdorfmann.mosby3.sample.mail.details.DetailsFragmentBuilder; import com.hannesdorfmann.mosby3.sample.mail.mails.MailsFragment; import com.hannesdorfmann.mosby3.sample.mail.mails.MailsFragmentBuilder; import com.hannesdorfmann.mosby3.sample.mail.model.contact.Person; import com.hannesdorfmann.mosby3.sample.mail.model.mail.Label; import com.hannesdorfmann.mosby3.sample.mail.model.mail.Mail; import com.hannesdorfmann.mosby3.sample.mail.model.mail.MailProvider; import butterknife.BindView; import butterknife.ButterKnife; import icepick.Icepick; import icepick.Icicle; import javax.inject.Inject; public class MainActivity extends BaseActivity { public static final String KEY_SHOW_ACTION = "com.hannesdorfmann.mosby.sample.mail.MainActivity.SHOW_ACTION"; public static final String KEY_SHOW_ACTION_MAIL_DETAILS = "com.hannesdorfmann.mosby.sample.mail.MainActivity.SHOW_ACTION_MAIL_DETAILS"; public static final String KEY_DATA_MAIL_DETAILS = "com.hannesdorfmann.mosby.sample.mail.MainActivity.MAIL"; public static final String KEY_SHOW_ACTION_MAILS_OF_LABEL = "com.hannesdorfmann.mosby.sample.mail.MainActivity.SHOW_ACTION_MAILS_OF_LABEL"; public static final String KEY_DATA_MAILS_OF_LABEL = "com.hannesdorfmann.mosby.sample.mail.MainActivity.LABEL"; public static final String FRAGMENT_TAG_DETAILS = "detailsFragmentTag"; public static final String FRAGMENT_TAG_LABEL = "labelFragmentTag"; Fragment detailsFragment; MailsFragment labelFragment; @Icicle String toolbarTitle; @Inject IntentStarter intentStarter; @BindView(R.id.drawerLayout) DrawerLayout drawerLayout; @BindView(R.id.toolbar) Toolbar toolbar; @BindView(R.id.leftPane) ViewGroup leftPane; @Nullable @BindView(R.id.rightPane) ViewGroup rightPane; // contains leftPane + rightPane @Nullable @BindView(R.id.paneContainer) ViewGroup paneContainer; ActionBarDrawerToggle drawerToggle; private MainActivityComponent mainActivityComponent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Toolbar toolbar.inflateMenu(R.menu.search_menu); toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem menuItem) { if (menuItem.getItemId() == R.id.search) { intentStarter.showSearch(MainActivity.this); return true; } return false; } }); drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close); drawerLayout.setDrawerListener(drawerToggle); if (toolbarTitle != null) { toolbar.setTitle(toolbarTitle); } // Check for previous fragments detailsFragment = findDetailsFragment(); labelFragment = (MailsFragment) getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG_LABEL); if (detailsFragment != null) { // details fragment available, so make it visible rightPane.setVisibility(View.VISIBLE); } if (paneContainer != null) { // Enable animation LayoutTransition transition = new LayoutTransition(); transition.enableTransitionType(LayoutTransition.CHANGING); paneContainer.setLayoutTransition(transition); } if (labelFragment == null) { // First app start, so start with this showMails(MailProvider.INBOX_LABEL, true); } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Icepick.saveInstanceState(this, outState); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); String showAction = intent.getStringExtra(KEY_SHOW_ACTION); if (KEY_SHOW_ACTION_MAIL_DETAILS.equals(showAction)) { Mail mail = intent.getParcelableExtra(KEY_DATA_MAIL_DETAILS); showMail(mail); } else if (KEY_SHOW_ACTION_MAILS_OF_LABEL.equals(showAction)) { Label label = intent.getParcelableExtra(KEY_DATA_MAILS_OF_LABEL); showMails(label, true); } } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // Sync the toggle state after onRestoreInstanceState has occurred. drawerToggle.syncState(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); drawerToggle.onConfigurationChanged(newConfig); } private void showMails(Label label, boolean removeDetailsFragment) { toolbarTitle = label.getName(); toolbar.setTitle(toolbarTitle); if (drawerLayout.isDrawerOpen(GravityCompat.START)) { drawerLayout.closeDrawer(GravityCompat.START); } getSupportFragmentManager().beginTransaction() .replace(R.id.leftPane, new MailsFragmentBuilder(label).build(), FRAGMENT_TAG_LABEL) .commit(); if (removeDetailsFragment) { removeDetailsFragment(); } } private void showMail(Mail mail) { rightPane.setVisibility(View.VISIBLE); Person sender = mail.getSender(); DetailsFragment fragment = new DetailsFragmentBuilder(mail.getDate().getTime(), mail.getId(), sender.getEmail(), sender.getName(), sender.getImageRes(), mail.isStarred(), mail.getSubject()).build(); getSupportFragmentManager().beginTransaction() .replace(R.id.rightPane, fragment, FRAGMENT_TAG_DETAILS) .commit(); } private Fragment findDetailsFragment() { return getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG_DETAILS); } /** * @return true if a fragment has been removed, otherwise false */ private boolean removeDetailsFragment() { Fragment detailsFragment = findDetailsFragment(); if (detailsFragment != null) { rightPane.setVisibility(View.GONE); getSupportFragmentManager().beginTransaction().remove(detailsFragment).commit(); return true; } return false; } @Override public void onBackPressed() { // TODO make this easier to read if (!removeDetailsFragment()) { super.onBackPressed(); } } protected void injectDependencies() { mainActivityComponent = DaggerMainActivityComponent.create(); mainActivityComponent.inject(this); } }