package com.ponyvillelive.pvlmobile.ui;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v4.app.FragmentManager;
import android.support.v4.media.session.MediaControllerCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.app.MediaRouteButton;
import android.support.v7.widget.Toolbar;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import com.ponyvillelive.pvlmobile.PvlApp;
import com.ponyvillelive.pvlmobile.R;
import com.ponyvillelive.pvlmobile.util.ResourceHelper;
import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.Optional;
import timber.log.Timber;
/**
* Created by berwyn on 14/03/15.
*/
public abstract class ActionBarCastActivity extends AppCompatActivity {
public static final int DELAY_MILLIS = 1000;
private static final String TAG = ActionBarCastActivity.class.getSimpleName();
// TODO: Add the Cast manager here
@InjectView(R.id.toolbar)
Toolbar toolbar;
@Optional
@InjectView(R.id.drawer_layout)
DrawerLayout drawerLayout;
@Optional
@InjectView(R.id.drawer_list)
ListView drawerList;
private MenuItem mediaRouteMenuItem;
private ActionBarDrawerToggle drawerToggle;
private DrawerMenuContents drawerMenuContents;
private MediaControllerCompat mediaController;
private boolean toolbarInitialised;
private int itemToOpenWhenDrawerCloses = -1;
private DrawerLayout.DrawerListener drawerListener = new DrawerLayout.DrawerListener() {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
if (drawerToggle != null) drawerToggle.onDrawerSlide(drawerView, slideOffset);
}
@Override
public void onDrawerOpened(View drawerView) {
if (drawerToggle != null) drawerToggle.onDrawerOpened(drawerView);
getSupportActionBar().setTitle(R.string.app_name);
}
@Override
public void onDrawerClosed(View drawerView) {
if (drawerToggle != null) drawerToggle.onDrawerClosed(drawerView);
int position = itemToOpenWhenDrawerCloses;
if (position >= 0) {
Bundle extras = ActivityOptionsCompat.makeCustomAnimation(
ActionBarCastActivity.this, R.anim.fade_in, R.anim.fade_out).toBundle();
Class activityClass = drawerMenuContents.getActivity(position);
ActivityCompat.startActivity(ActionBarCastActivity.this,
new Intent(ActionBarCastActivity.this, activityClass), extras);
}
}
@Override
public void onDrawerStateChanged(int newState) {
if (drawerToggle != null) drawerToggle.onDrawerStateChanged(newState);
}
};
private FragmentManager.OnBackStackChangedListener onBackStackChangedListener = this::updateDrawerToggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Timber.d(TAG, "Activity OnCreate");
PvlApp.get(this).inject(this);
}
@Override
protected void onStart() {
super.onStart();
if (!toolbarInitialised) {
throw new IllegalStateException(
"You must run super#initializeToolbar in your onCreate method");
}
}
@Override
public void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
if (drawerToggle != null) {
drawerToggle.syncState();
}
}
@Override
protected void onResume() {
super.onResume();
getSupportFragmentManager().addOnBackStackChangedListener(onBackStackChangedListener);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (drawerToggle != null) {
drawerToggle.onConfigurationChanged(newConfig);
}
}
@Override
protected void onPause() {
super.onPause();
getSupportFragmentManager().removeOnBackStackChangedListener(onBackStackChangedListener);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (drawerToggle != null && drawerToggle.onOptionsItemSelected(item)) {
return true;
}
if (item != null && item.getItemId() == android.R.id.home) {
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
if (drawerLayout != null && drawerLayout.isDrawerOpen(Gravity.START)) {
drawerLayout.closeDrawers();
return;
}
FragmentManager fragmentManager = getSupportFragmentManager();
if (fragmentManager.getBackStackEntryCount() > 0) {
fragmentManager.popBackStack();
} else {
super.onBackPressed();
}
}
@Override
public void setTitle(CharSequence title) {
super.setTitle(title);
toolbar.setTitle(title);
}
@Override
public void setTitle(int titleId) {
super.setTitle(titleId);
toolbar.setTitle(titleId);
}
public MediaControllerCompat getMediaControllerCompat() {
return mediaController;
}
public void setMediaControllerCompat(MediaControllerCompat mediaController) {
this.mediaController = mediaController;
}
protected void initializeToolbar() {
ButterKnife.inject(this);
if (toolbar == null) {
throw new IllegalStateException(
"Your layout must include a Toolbar with id `toolbar`");
}
toolbar.inflateMenu(R.menu.main);
if (drawerLayout != null) {
if (drawerList == null) {
throw new IllegalStateException(
"A layout with a drawer must include a list with id `drawer_list");
}
drawerToggle = new ActionBarDrawerToggle(this, drawerLayout,
toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawerLayout.setDrawerListener(drawerListener);
drawerLayout.setStatusBarBackgroundColor(
ResourceHelper.getThemeColor(this, R.attr.colorPrimary, android.R.color.black));
populateDrawerItems();
setSupportActionBar(toolbar);
updateDrawerToggle();
} else {
setSupportActionBar(toolbar);
}
toolbarInitialised = true;
}
private void populateDrawerItems() {
drawerMenuContents = new DrawerMenuContents(this);
final int selectedPosition = drawerMenuContents.getPosition(this.getClass());
final int unselectedColor = getResources().getColor(android.R.color.white);
final int selectedColor = getResources().getColor(R.color.drawer_item_selected_background);
SimpleAdapter adapter = new SimpleAdapter(this, drawerMenuContents.getItems(),
R.layout.drawer_list_item,
new String[]{DrawerMenuContents.FIELD_TITLE, DrawerMenuContents.FIELD_ICON},
new int[]{R.id.drawer_item_title, R.id.drawer_item_icon}) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
int color = unselectedColor;
if (position == selectedPosition) {
color = selectedColor;
}
view.setBackgroundColor(color);
return view;
}
};
drawerList.setOnItemClickListener((parent, view, position, id) -> {
if (position != selectedPosition) {
view.setBackgroundColor(getResources().getColor(
R.color.drawer_item_selected_background));
itemToOpenWhenDrawerCloses = position;
}
drawerLayout.closeDrawers();
});
drawerList.setAdapter(adapter);
}
protected void updateDrawerToggle() {
if (drawerToggle == null) {
return;
}
boolean isRoot = getFragmentManager().getBackStackEntryCount() == 0;
drawerToggle.setDrawerIndicatorEnabled(isRoot);
getSupportActionBar().setDisplayShowHomeEnabled(!isRoot);
getSupportActionBar().setDisplayHomeAsUpEnabled(!isRoot);
getSupportActionBar().setHomeButtonEnabled(!isRoot);
if (isRoot) {
drawerToggle.syncState();
}
}
/**
* The first time the app opens, we wanna
* highlight that sexy cast button
*/
private void showFtu() {
Menu menu = toolbar.getMenu();
View view = menu.findItem(R.id.action_cast).getActionView();
if (view != null && view instanceof MediaRouteButton) {
// TODO: ShowcaseView
}
}
}