From 306c676e8b5879917e08607d14a6c02ca44ab0ac Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Tue, 14 Jul 2015 05:12:05 +0200 Subject: [PATCH] Fixed the MainActivity PopupMenu's checkboxes and radio buttons not being tinted with the accent color. --- .../ui/activities/MainActivity.java | 42 ++++--------------- .../kabouzeid/gramophone/util/ViewUtil.java | 41 +++++++++++++++++- 2 files changed, 48 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index ece99c9d..afeed734 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -21,9 +21,6 @@ import android.support.v4.view.ViewPager; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBarDrawerToggle; -import android.support.v7.internal.view.menu.MenuPopupHelper; -import android.support.v7.widget.ActionMenuPresenter; -import android.support.v7.widget.ActionMenuView; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.KeyEvent; @@ -349,12 +346,20 @@ public class MainActivity extends AbsSlidingMusicPanelActivity return true; } + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + ViewUtil.invalidateToolbarPopupMenuTint(toolbar); + return super.onPrepareOptionsMenu(menu); + } + @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { if (drawerToggle.onOptionsItemSelected(item)) { return true; } + ViewUtil.invalidateToolbarPopupMenuTint(toolbar); + if (handleGridSize(item)) return true; int id = item.getItemId(); @@ -564,37 +569,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity return super.dispatchKeyEvent(event); } - @Override - public boolean onMenuOpened(int featureId, Menu menu) { - toolbar.post(new Runnable() { - @Override - public void run() { - try { - Field f1 = Toolbar.class.getDeclaredField("mMenuView"); - f1.setAccessible(true); - ActionMenuView actionMenuView = (ActionMenuView) f1.get(toolbar); - - Field f2 = ActionMenuView.class.getDeclaredField("mPresenter"); - f2.setAccessible(true); - ActionMenuPresenter presenter = (ActionMenuPresenter) f2.get(actionMenuView); - - Field f3 = presenter.getClass().getDeclaredField("mOverflowPopup"); - f3.setAccessible(true); - MenuPopupHelper overflowMenuPopupHelper = (MenuPopupHelper) f3.get(presenter); - ViewUtil.setCheckBoxTintForMenu(overflowMenuPopupHelper); - - Field f4 = presenter.getClass().getDeclaredField("mActionButtonPopup"); - f4.setAccessible(true); - MenuPopupHelper subMenuPopupHelper = (MenuPopupHelper) f4.get(presenter); - ViewUtil.setCheckBoxTintForMenu(subMenuPopupHelper); - } catch (Exception e) { - e.printStackTrace(); - } - } - }); - return super.onMenuOpened(featureId, menu); - } - @Override public MaterialCab openCab(final int menu, final MaterialCab.Callback callback) { if (cab != null && cab.isActive()) cab.finish(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java index 07506661..3a225183 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/ViewUtil.java @@ -7,6 +7,11 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.internal.view.menu.ListMenuItemView; import android.support.v7.internal.view.menu.MenuPopupHelper; +import android.support.v7.widget.ActionMenuPresenter; +import android.support.v7.widget.ActionMenuView; +import android.support.v7.widget.Toolbar; +import android.view.Menu; +import android.view.MenuItem; import android.view.View; import android.view.ViewTreeObserver; import android.view.animation.PathInterpolator; @@ -78,7 +83,41 @@ public class ViewUtil { }); } - public static void setCheckBoxTintForMenu(@Nullable MenuPopupHelper menuPopupHelper) { + /** + * Should be called in {@link android.app.Activity#onPrepareOptionsMenu(Menu)} and {@link android.app.Activity#onOptionsItemSelected(MenuItem)} + * + * @param toolbar the toolbar to apply the tint on + */ + public static void invalidateToolbarPopupMenuTint(@NonNull final Toolbar toolbar) { + toolbar.post(new Runnable() { + @Override + public void run() { + try { + Field f1 = Toolbar.class.getDeclaredField("mMenuView"); + f1.setAccessible(true); + ActionMenuView actionMenuView = (ActionMenuView) f1.get(toolbar); + + Field f2 = ActionMenuView.class.getDeclaredField("mPresenter"); + f2.setAccessible(true); + ActionMenuPresenter presenter = (ActionMenuPresenter) f2.get(actionMenuView); + + Field f3 = presenter.getClass().getDeclaredField("mOverflowPopup"); + f3.setAccessible(true); + MenuPopupHelper overflowMenuPopupHelper = (MenuPopupHelper) f3.get(presenter); + ViewUtil.setTintForMenuPopupHelper(overflowMenuPopupHelper); + + Field f4 = presenter.getClass().getDeclaredField("mActionButtonPopup"); + f4.setAccessible(true); + MenuPopupHelper subMenuPopupHelper = (MenuPopupHelper) f4.get(presenter); + ViewUtil.setTintForMenuPopupHelper(subMenuPopupHelper); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public static void setTintForMenuPopupHelper(@Nullable MenuPopupHelper menuPopupHelper) { if (menuPopupHelper != null) { final ListView listView = menuPopupHelper.getPopup().getListView(); listView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {