package io.github.droidkaigi.confsched.activity;
import android.app.Activity;
import android.app.Notification;
import android.content.Intent;
import android.content.res.Configuration;
import android.databinding.DataBindingUtil;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.annotation.StringRes;
import android.support.design.widget.NavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.GravityCompat;
import android.support.v7.app.ActionBarDrawerToggle;
import android.view.MenuItem;
import javax.inject.Inject;
import io.github.droidkaigi.confsched.R;
import io.github.droidkaigi.confsched.databinding.ActivityMainBinding;
import io.github.droidkaigi.confsched.fragment.SessionsFragment;
import io.github.droidkaigi.confsched.fragment.SettingsFragment;
import io.github.droidkaigi.confsched.fragment.StackedPageListener;
import io.github.droidkaigi.confsched.model.MainContentStateBrokerProvider;
import io.github.droidkaigi.confsched.model.Page;
import io.github.droidkaigi.confsched.util.AnalyticsTracker;
import io.github.droidkaigi.confsched.util.AppUtil;
import io.github.droidkaigi.confsched.util.LocaleUtil;
import rx.subscriptions.CompositeSubscription;
public class MainActivity extends BaseActivity
implements NavigationView.OnNavigationItemSelectedListener, FragmentManager.OnBackStackChangedListener {
private static final String EXTRA_SHOULD_REFRESH = "should_refresh";
private static final String EXTRA_MENU = "menu";
private static final long DRAWER_CLOSE_DELAY_MILLS = 300L;
@Inject
AnalyticsTracker analyticsTracker;
@Inject
MainContentStateBrokerProvider brokerProvider;
@Inject
CompositeSubscription subscription;
private ActivityMainBinding binding;
static void start(@NonNull Activity activity, boolean shouldRefresh) {
Intent intent = new Intent(activity, MainActivity.class);
intent.putExtra(EXTRA_SHOULD_REFRESH, shouldRefresh);
activity.startActivity(intent);
activity.overridePendingTransition(R.anim.activity_fade_enter, R.anim.activity_fade_exit);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
LocaleUtil.initLocale(this);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LocaleUtil.initLocale(this);
boolean shouldRefresh = getIntent().getBooleanExtra(EXTRA_SHOULD_REFRESH, false);
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
DataBindingUtil.bind(binding.navView.getHeaderView(0));
getComponent().inject(this);
subscription.add(brokerProvider.get().observe().subscribe(page -> {
toggleToolbarElevation(page.shouldToggleToolbar());
changePage(page.getTitleResId(), page.createFragment());
binding.navView.setCheckedItem(page.getMenuId());
}));
initView();
if (savedInstanceState == null) {
if (getIntent().hasCategory(Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES)) {
AppUtil.setTaskDescription(this, getString(R.string.settings), AppUtil.getThemeColorPrimary(this));
replaceFragment(SettingsFragment.newInstance());
} else {
AppUtil.setTaskDescription(this, getString(R.string.all_sessions), AppUtil.getThemeColorPrimary(this));
replaceFragment(SessionsFragment.newInstance(shouldRefresh));
}
} else if (savedInstanceState.getInt(EXTRA_MENU) != 0) {
Page page = Page.forMenuId(savedInstanceState.getInt(EXTRA_MENU));
binding.toolbar.setTitle(page.getTitleResId());
toggleToolbarElevation(page.shouldToggleToolbar());
}
getSupportFragmentManager().addOnBackStackChangedListener(this);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Fragment current = getSupportFragmentManager().findFragmentById(R.id.content_view);
if (current != null) {
outState.putInt(EXTRA_MENU, Page.forName(current).getMenuId());
}
}
@Override
protected void onDestroy() {
super.onDestroy();
getSupportFragmentManager().removeOnBackStackChangedListener(this);
subscription.unsubscribe();
}
private void initView() {
setSupportActionBar(binding.toolbar);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this,
binding.drawer, binding.toolbar, R.string.open, R.string.close);
binding.drawer.setDrawerListener(toggle);
toggle.syncState();
binding.navView.setNavigationItemSelectedListener(this);
binding.navView.setCheckedItem(R.id.nav_all_sessions);
}
private void replaceFragment(Fragment fragment) {
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.fragment_fade_enter, R.anim.fragment_fade_exit);
ft.replace(R.id.content_view, fragment, fragment.getClass().getSimpleName());
ft.addToBackStack(null);
ft.commit();
}
@Override
protected void onStart() {
super.onStart();
analyticsTracker.sendScreenView("main");
}
@Override
public void onBackPressed() {
if (binding.drawer.isDrawerOpen(GravityCompat.START)) {
binding.drawer.closeDrawer(GravityCompat.START);
return;
}
FragmentManager fm = getSupportFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
fm.popBackStack();
return;
}
super.onBackPressed();
}
@Override
public boolean onNavigationItemSelected(MenuItem item) {
binding.drawer.closeDrawer(GravityCompat.START);
if (item.getItemId() == R.id.nav_questionnaire) {
new Handler().postDelayed(() -> {
AppUtil.showWebPage(this, getString(R.string.about_inquiry_url));
}, DRAWER_CLOSE_DELAY_MILLS);
} else {
Page page = Page.forMenuId(item);
toggleToolbarElevation(page.shouldToggleToolbar());
changePage(page.getTitleResId(), page.createFragment());
}
return true;
}
private void toggleToolbarElevation(boolean enable) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
float elevation = enable ? getResources().getDimension(R.dimen.elevation) : 0;
binding.toolbar.setElevation(elevation);
}
}
private void changePage(@StringRes int titleRes, @NonNull Fragment fragment) {
new Handler().postDelayed(() -> {
binding.toolbar.setTitle(titleRes);
AppUtil.setTaskDescription(this, getString(titleRes), AppUtil.getThemeColorPrimary(this));
replaceFragment(fragment);
}, DRAWER_CLOSE_DELAY_MILLS);
}
@Override
public void finish() {
super.finish();
overridePendingTransition(R.anim.activity_fade_enter, R.anim.activity_fade_exit);
}
@Override
public void onBackStackChanged() {
FragmentManager fm = getSupportFragmentManager();
Fragment current = fm.findFragmentById(R.id.content_view);
if (current == null) {
// no more fragments in the stack. finish.
finish();
return;
}
Page page = Page.forName(current);
binding.navView.setCheckedItem(page.getMenuId());
binding.toolbar.setTitle(page.getTitleResId());
toggleToolbarElevation(page.shouldToggleToolbar());
if (current instanceof StackedPageListener) {
StackedPageListener l = (StackedPageListener) current;
l.onTop();
}
}
}