package im.zico.wingtwitter.ui.fragment; import android.app.Activity; import android.app.ActivityOptions; import android.content.Intent; import android.content.res.Configuration; import android.content.res.TypedArray; import android.os.Bundle; import android.app.Fragment; import android.os.Handler; import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.ViewDragHelper; import android.support.v7.app.ActionBarDrawerToggle; import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ExpandableListView; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.squareup.picasso.Picasso; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import im.zico.wingtwitter.R; import im.zico.wingtwitter.WingApp; import im.zico.wingtwitter.adapter.DrawerListAdapter; import im.zico.wingtwitter.dao.WingStore; import im.zico.wingtwitter.ui.ProfileActivity; public class DrawerFragment extends Fragment { private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position"; private NavigationDrawerCallbacks mCallbacks; private int mCurrentSelectedPosition = 0; private int mCurrentSelectedChildPosition = 0; private DrawerLayout mDrawerLayout; private View mFragmentContainerView; private ImageView avatarView; private TextView userName; private boolean mFromSavedInstanceState; private ExpandableListView expListView; private DrawerListAdapter listAdapter; private ActionBarDrawerToggle mDrawerToggle; public DrawerFragment() { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION); mFromSavedInstanceState = true; } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View contentView = inflater.inflate(R.layout.fragment_drawer, container, false); expListView = (ExpandableListView) contentView.findViewById(R.id.explist_drawer); prepareListData(); listAdapter = new DrawerListAdapter(getActivity(), parentMenus, parentMenuIcons, childMenuItems); expListView.setAdapter(listAdapter); View headerCover = getActivity().getLayoutInflater().inflate(R.layout.drawer_menu_header, null); avatarView = (ImageView) headerCover.findViewById(R.id.drawer_user_avatar); userName = (TextView) headerCover.findViewById(R.id.drawer_user_name); expListView.addHeaderView(headerCover); View footerView = getActivity().getLayoutInflater().inflate(R.layout.drawer_menu_footer, null); expListView.addFooterView(footerView); // Picasso.with(getActivity()).load(WingApp.getCurrentAccountUser().avatar).into(avatarView); // userName.setText(WingApp.getCurrentAccountUser().name); headerCover.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent profileIntent = new Intent(getActivity(), ProfileActivity.class); ActivityOptions options = ActivityOptions .makeSceneTransitionAnimation(getActivity(), Pair.create((View) avatarView, "avatar")); getActivity().startActivity(profileIntent, options.toBundle()); new Handler().postDelayed(new Runnable() { @Override public void run() { mDrawerLayout.closeDrawers(); } }, 400); } }); expListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { if (groupPosition == 2 || groupPosition == 3) { return false; // expListView.setItemChecked(groupPosition + 1, true); // expListView.setItemChecked(groupPosition + 1, false); } else { selectItem(groupPosition, -1); } return false; } }); expListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { if (groupPosition == 2 || groupPosition == 3) { selectItem(groupPosition, childPosition); expListView.setItemChecked(groupPosition + 1, true); return true; } return false; } }); selectItem(mCurrentSelectedPosition, -1); return contentView; } private List<String> parentMenus; private HashMap<String, List<String>> childMenuItems; private TypedArray parentMenuIcons; private void prepareListData() { parentMenus = Arrays.asList(getResources().getStringArray(R.array.drawer_menu_group)); parentMenuIcons = getResources().obtainTypedArray(R.array.draw_menu_icons); childMenuItems = new HashMap<String, List<String>>(); List<String> listChild = Arrays.asList(getResources().getStringArray(R.array.user_list_sample)); List<String> emptyChild = new ArrayList<String>(); for (int i = 0; i < parentMenus.size(); i++) { childMenuItems.put(parentMenus.get(i), emptyChild); } childMenuItems.put(parentMenus.get(2), listChild); } /** * Select the drawer item * * @param groupPos * @param childPos */ private void selectItem(final int groupPos, final int childPos) { mCurrentSelectedPosition = groupPos; mCurrentSelectedChildPosition = childPos; if (expListView != null) { if (childPos == -1) { expListView.setItemChecked(groupPos + 1, true); } } if (mDrawerLayout != null) { mDrawerLayout.closeDrawer(mFragmentContainerView); } if (mCallbacks != null) { new Handler().postDelayed(new Runnable() { @Override public void run() { mCallbacks.onNavigationDrawerItemSelected(groupPos, childPos); } }, 250); } } @Override public void onAttach(Activity activity) { super.onAttach(activity); try { mCallbacks = (NavigationDrawerCallbacks) activity; } catch (ClassCastException e) { throw new ClassCastException("Activity must implement NavigationDrawerCallbacks."); } } @Override public void onDetach() { super.onDetach(); mCallbacks = null; } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // Forward the new configuration the drawer toggle component. mDrawerToggle.onConfigurationChanged(newConfig); } public void setUp(int drawer_resId, DrawerLayout drawerLayout) { mDrawerLayout = drawerLayout; drawerLayout.setFitsSystemWindows(true); drawerLayout.setStatusBarBackgroundColor(getResources().getColor(android.R.color.transparent)); mFragmentContainerView = getActivity().findViewById(drawer_resId); mDrawerToggle = new ActionBarDrawerToggle(getActivity(), drawerLayout, R.string.open, R.string.close); mDrawerToggle.setDrawerIndicatorEnabled(true); // Defer code dependent on restoration of previous instance state. mDrawerLayout.post(new Runnable() { @Override public void run() { mDrawerToggle.syncState(); } }); drawerLayout.setDrawerListener(mDrawerToggle); // enlargeDrawerDragger(drawerLayout); } // /** // * Enlarge the trigger edge for the sliding drawer // * // * @param mDrawerLayout // */ // private void enlargeDrawerDragger(DrawerLayout mDrawerLayout) { // Field mDragger = null; // try { // mDragger = ((Object) mDrawerLayout).getClass().getDeclaredField( // "mLeftDragger"); // } catch (NoSuchFieldException e) { // e.printStackTrace(); // } // mDragger.setAccessible(true); // // ViewDragHelper draggerObj = null; // try { // draggerObj = (ViewDragHelper) mDragger // .get(mDrawerLayout); // Field mEdgeSize = draggerObj.getClass().getDeclaredField( // "mEdgeSize"); // mEdgeSize.setAccessible(true); // int edge = mEdgeSize.getInt(draggerObj); // // mEdgeSize.setInt(draggerObj, edge * 3); // } catch (IllegalAccessException e) { // e.printStackTrace(); // } catch (NoSuchFieldException e) { // e.printStackTrace(); // } // // } public ActionBarDrawerToggle getToggle() { return mDrawerToggle; } /** * Callbacks interface that all activities using this fragment must implement. */ public static interface NavigationDrawerCallbacks { /** * Called when an item in the navigation drawer is selected. */ void onNavigationDrawerItemSelected(int groupPos, int childPos); } }