package com.ikimuhendis.ldrawer; import android.app.ActionBar; import android.app.Activity; import android.content.res.Configuration; import android.graphics.drawable.Drawable; import android.os.Build; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.util.Log; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import java.lang.reflect.Method; public class ActionBarDrawerToggle extends android.support.v4.app.ActionBarDrawerToggle { private static final String TAG = ActionBarDrawerToggle.class.getName(); protected Activity mActivity; protected DrawerLayout mDrawerLayout; protected int mOpenDrawerContentDescRes; protected int mCloseDrawerContentDescRes; protected DrawerArrowDrawable mDrawerImage; protected boolean animateEnabled; public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, int drawerImageRes, int openDrawerContentDescRes, int closeDrawerContentDescRes) { super(activity, drawerLayout, drawerImageRes, openDrawerContentDescRes, closeDrawerContentDescRes); } public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, DrawerArrowDrawable drawerImage, int openDrawerContentDescRes, int closeDrawerContentDescRes) { super(activity, drawerLayout, R.drawable.ic_drawer, openDrawerContentDescRes, closeDrawerContentDescRes); mActivity = activity; mDrawerLayout = drawerLayout; mOpenDrawerContentDescRes = openDrawerContentDescRes; mCloseDrawerContentDescRes = closeDrawerContentDescRes; mDrawerImage = drawerImage; animateEnabled = true; } public void syncState() { if (mDrawerImage == null) { super.syncState(); return; } if (animateEnabled) { if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) { mDrawerImage.setProgress(1.f); } else { mDrawerImage.setProgress(0.f); } } setActionBarUpIndicator(); setActionBarDescription(); } public void setDrawerIndicatorEnabled(boolean enable) { if (mDrawerImage == null) { super.setDrawerIndicatorEnabled(enable); return; } setActionBarUpIndicator(); setActionBarDescription(); } public boolean isDrawerIndicatorEnabled() { if (mDrawerImage == null) { return super.isDrawerIndicatorEnabled(); } return true; } public void onConfigurationChanged(Configuration newConfig) { if (mDrawerImage == null) { super.onConfigurationChanged(newConfig); return; } syncState(); } public boolean onOptionsItemSelected(MenuItem item) { return super.onOptionsItemSelected(item); } @Override public void onDrawerSlide(View drawerView, float slideOffset) { if (mDrawerImage == null) { super.onDrawerSlide(drawerView, slideOffset); return; } if (animateEnabled) { mDrawerImage.setVerticalMirror(!mDrawerLayout.isDrawerOpen(GravityCompat.START)); mDrawerImage.setProgress(slideOffset); } } @Override public void onDrawerOpened(View drawerView) { if (mDrawerImage == null) { super.onDrawerOpened(drawerView); return; } if (animateEnabled) { mDrawerImage.setProgress(1.f); } setActionBarDescription(); } @Override public void onDrawerClosed(View drawerView) { if (mDrawerImage == null) { super.onDrawerClosed(drawerView); return; } if (animateEnabled) { mDrawerImage.setProgress(0.f); } setActionBarDescription(); } protected void setActionBarUpIndicator() { if (mActivity != null) { try { Method setHomeAsUpIndicator = ActionBar.class.getDeclaredMethod("setHomeAsUpIndicator", Drawable.class); setHomeAsUpIndicator.invoke(mActivity.getActionBar(), mDrawerImage); return; } catch (Exception e) { Log.e(TAG, "setActionBarUpIndicator error", e); } final View home = mActivity.findViewById(android.R.id.home); if (home == null) { return; } final ViewGroup parent = (ViewGroup) home.getParent(); final int childCount = parent.getChildCount(); if (childCount != 2) { return; } final View first = parent.getChildAt(0); final View second = parent.getChildAt(1); final View up = first.getId() == android.R.id.home ? second : first; if (up instanceof ImageView) { ImageView upV = (ImageView) up; upV.setImageDrawable(mDrawerImage); } } } protected void setActionBarDescription() { if (mActivity != null && mActivity.getActionBar() != null) { try { Method setHomeActionContentDescription = ActionBar.class.getDeclaredMethod( "setHomeActionContentDescription", Integer.TYPE); setHomeActionContentDescription.invoke(mActivity.getActionBar(), mDrawerLayout.isDrawerOpen(GravityCompat.START) ? mOpenDrawerContentDescRes : mCloseDrawerContentDescRes); if (Build.VERSION.SDK_INT <= 19) { mActivity.getActionBar().setSubtitle(mActivity.getActionBar().getSubtitle()); } } catch (Exception e) { Log.e(TAG, "setActionBarUpIndicator", e); } } } public void setAnimateEnabled(boolean enabled) { this.animateEnabled = enabled; } public boolean isAnimateEnabled() { return this.animateEnabled; } }