package com.distantfuture.videos.mainactivity;
import android.app.Activity;
import android.app.FragmentManager;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.distantfuture.videos.R;
import com.distantfuture.videos.content.Content;
import com.distantfuture.videos.imageutils.ToolbarIcons;
import java.util.Map;
public class DrawerManager {
private DrawerLayout mDrawerLayout;
private View mDrawerContainer;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
private DrawerManagerListener mListener;
private FragmentManager mFragmentManager;
public DrawerManager(Activity activity, Content content, DrawerManagerListener listener) {
super();
mListener = listener;
mDrawerLayout = (DrawerLayout) activity.findViewById(R.id.drawer_layout);
mDrawerContainer = activity.findViewById(R.id.drawer_container);
mDrawerList = (ListView) activity.findViewById(R.id.left_drawer);
// set a custom shadow that overlays the main content when the drawer opens
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
// set up the drawer's list view with items and click listener
mDrawerList.setAdapter(new DrawerAdapter(activity, content));
mDrawerList.setOnItemClickListener(new ListView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mListener.onDrawerClick(position);
closeDrawer();
}
});
// seems insane, is this the best way of having a variable drawable resource by theme?
int[] attrs = new int[]{R.attr.nav_drawer_menu_drawable};
TypedArray ta = activity.obtainStyledAttributes(attrs);
int resID = ta.getResourceId(0, 0);
ta.recycle();
// ActionBarDrawerToggle ties together the the proper interactions
// between the sliding drawer and the action bar app icon
mDrawerToggle = new ActionBarDrawerToggle(activity, /* host Activity */
mDrawerLayout, /* DrawerLayout object */
resID, /* nav drawer image to replace 'Up' caret */
R.string.drawer_open, /* "open drawer" description for accessibility */
R.string.drawer_close /* "close drawer" description for accessibility */) {
public void onDrawerClosed(View view) {
mListener.onDrawerOpen(false);
}
public void onDrawerOpened(View drawerView) {
mListener.onDrawerOpen(true);
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
mFragmentManager = activity.getFragmentManager();
mFragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
int backStackEntryCount = mFragmentManager.getBackStackEntryCount();
mDrawerToggle.setDrawerIndicatorEnabled(backStackEntryCount == 0);
}
});
}
public void setDrawerIndicatorEnabled(boolean set) {
mDrawerToggle.setDrawerIndicatorEnabled(set);
}
public boolean onOptionsItemSelected(MenuItem item) {
if (mDrawerToggle.isDrawerIndicatorEnabled() && mDrawerToggle.onOptionsItemSelected(item)) {
return true;
} else if (item.getItemId() == android.R.id.home && mFragmentManager.popBackStackImmediate()) {
return true;
}
return false;
}
public void openDrawer() {
mDrawerLayout.openDrawer(mDrawerContainer);
}
public void closeDrawer() {
mDrawerLayout.closeDrawer(mDrawerContainer);
}
public void setItemChecked(int position, boolean checked) {
mDrawerList.setItemChecked(position, checked);
}
public void syncState() {
mDrawerToggle.syncState();
}
public void onConfigurationChanged(Configuration newConfig) {
mDrawerToggle.onConfigurationChanged(newConfig);
}
public interface DrawerManagerListener {
public void onChannelClick();
public void onDrawerClick(int position);
public void onDrawerOpen(boolean openOrClose);
}
private static class DrawerAdapter extends ArrayAdapter<Map> {
private LayoutInflater inflater;
private Content mContent;
private int mIconColor;
public DrawerAdapter(Context context, Content content) {
super(context, R.layout.drawer_list_item);
inflater = LayoutInflater.from(context);
mIconColor = context.getResources().getColor(R.color.drawer_icon_color);
mContent = content;
for (Map item : mContent.drawerTitles()) {
add(item);
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View result = convertView;
if (result == null)
result = inflater.inflate(R.layout.drawer_list_item, parent, false);
TextView textView = (TextView) result.findViewById(android.R.id.text1);
Map item = getItem(position);
ToolbarIcons.IconID icon = ToolbarIcons.IconID.NONE;
Object iconInt = item.get("icon");
if (iconInt != null)
icon = (ToolbarIcons.IconID) iconInt; // cast Integer to Enum, better way?
textView.setText((String) item.get("title"));
ImageView imageView = (ImageView) result.findViewById(android.R.id.icon);
Drawable sharedDrawable = ToolbarIcons.iconBitmap(getContext(), icon, mIconColor, 30);
imageView.setImageDrawable(sharedDrawable);
return result;
}
}
}