diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedActionBarActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedActionBarActivity.java index adeb17ef4..4678e62bd 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedActionBarActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedActionBarActivity.java @@ -86,7 +86,7 @@ public abstract class ThemedActionBarActivity extends ActionBarActivity implemen @Override public void onSupportActionModeStarted(android.support.v7.view.ActionMode mode) { super.onSupportActionModeStarted(mode); - ThemeUtils.applySupportActionModeBackground(mode, this, getCurrentThemeResourceId(), + ThemeUtils.applySupportActionModeColor(mode, this, getCurrentThemeResourceId(), getCurrentThemeColor(), getThemeBackgroundOption(), true); } diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java index 35aedac26..2c69e2f32 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java @@ -59,6 +59,7 @@ import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBarActivity; +import android.support.v7.widget.ActionMenuView; import android.support.v7.widget.Toolbar; import android.text.Html; import android.text.TextUtils; @@ -1452,7 +1453,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener toolbar.setTitleTextColor(itemColor); toolbar.setSubtitleTextColor(itemColor); ThemeUtils.setActionBarOverflowColor(toolbar, itemColor); - ThemeUtils.wrapToolbarMenuIcon(toolbar, itemColor, itemColor); + ThemeUtils.wrapToolbarMenuIcon(ViewUtils.findViewByType(actionBarView, ActionMenuView.class), itemColor, itemColor); } mPagerIndicator.updateAppearance(); } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/ThemeUtils.java b/twidere/src/main/java/org/mariotaku/twidere/util/ThemeUtils.java index 6686cf49c..75317d090 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/ThemeUtils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/ThemeUtils.java @@ -34,6 +34,7 @@ import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Build; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v4.app.FragmentActivity; import android.support.v4.view.ViewCompat; import android.support.v7.internal.app.WindowDecorActionBar; @@ -41,8 +42,8 @@ import android.support.v7.internal.app.WindowDecorActionBar.ActionModeImpl; import android.support.v7.internal.view.SupportActionModeWrapper; import android.support.v7.internal.view.SupportActionModeWrapperTrojan; import android.support.v7.internal.view.menu.ActionMenuItemView; +import android.support.v7.internal.widget.ActionBarContextView; import android.support.v7.internal.widget.ActionBarOverlayLayout; -import android.support.v7.internal.widget.DecorToolbar; import android.support.v7.widget.ActionMenuView; import android.support.v7.widget.Toolbar; import android.text.SpannableStringBuilder; @@ -187,19 +188,20 @@ public class ThemeUtils implements Constants { textView.setText(builder); } - public static void applySupportActionModeBackground(ActionMode mode, FragmentActivity activity, - int themeRes, int accentColor, - String backgroundOption, boolean outlineEnabled) { + public static void applySupportActionModeColor(ActionMode mode, FragmentActivity activity, + int themeRes, int accentColor, + String backgroundOption, boolean outlineEnabled) { // Very dirty implementation if (!(mode instanceof SupportActionModeWrapper) || !(activity instanceof IThemedActivity)) return; final android.support.v7.view.ActionMode modeCompat = SupportActionModeWrapperTrojan.getWrappedObject((SupportActionModeWrapper) mode); - applySupportActionModeBackground(modeCompat, activity, themeRes, accentColor, backgroundOption, outlineEnabled); + applySupportActionModeColor(modeCompat, activity, themeRes, accentColor, backgroundOption, outlineEnabled); } - public static void applySupportActionModeBackground(android.support.v7.view.ActionMode modeCompat, - FragmentActivity activity, int themeRes, - int accentColor, String backgroundOption, boolean outlineEnabled) { + public static void applySupportActionModeColor(android.support.v7.view.ActionMode modeCompat, + FragmentActivity activity, int themeRes, + int accentColor, String backgroundOption, + boolean outlineEnabled) { // Very dirty implementation if (!(modeCompat instanceof ActionModeImpl)) return; try { @@ -215,20 +217,29 @@ public class ThemeUtils implements Constants { if (actionBar == null) return; final Context context = actionBar.getThemedContext(); final Field contextViewField = WindowDecorActionBar.class.getDeclaredField("mContextView"); - final Field decorToolbarField = WindowDecorActionBar.class.getDeclaredField("mDecorToolbar"); contextViewField.setAccessible(true); - decorToolbarField.setAccessible(true); final View contextView = (View) contextViewField.get(actionBar); - final DecorToolbar decorToolbar = (DecorToolbar) decorToolbarField.get(actionBar); - if (contextView == null || decorToolbar == null) return; - final Toolbar toolbar = (Toolbar) decorToolbar.getViewGroup(); + if (!(contextView instanceof ActionBarContextView)) return; + final ActionBarContextView actionBarContextView = (ActionBarContextView) contextView; + final TextView actionBarTitleView = (TextView) contextView.findViewById(android.support.v7.appcompat.R.id.action_bar_title); + final TextView actionBarSubtitleView = (TextView) contextView.findViewById(android.support.v7.appcompat.R.id.action_bar_subtitle); + final ImageView actionModeCloseButton = (ImageView) contextView.findViewById(android.support.v7.appcompat.R.id.action_mode_close_button); + final ActionMenuView menuView = ViewUtils.findViewByType(contextView, ActionMenuView.class); + if (actionBarTitleView == null || actionBarSubtitleView == null || actionModeCloseButton == null || menuView == null) + return; final int actionBarColor; if (isDarkTheme(themeRes)) { actionBarColor = context.getResources().getColor(R.color.background_color_action_bar_dark); } else { actionBarColor = accentColor; } - toolbar.setTitleTextColor(getContrastActionBarTitleColor(context, themeRes, actionBarColor)); + final int titleColor = getContrastActionBarTitleColor(context, themeRes, actionBarColor); + final int itemColor = getContrastActionBarItemColor(context, themeRes, actionBarColor); + actionBarTitleView.setTextColor(titleColor); + actionBarSubtitleView.setTextColor(titleColor); + actionModeCloseButton.setColorFilter(itemColor, Mode.SRC_ATOP); + setActionBarOverflowColor(menuView, itemColor); + ThemeUtils.wrapToolbarMenuIcon(menuView, itemColor, itemColor); ViewUtils.setBackground(contextView, getActionBarBackground(activity, themeRes, accentColor, backgroundOption, outlineEnabled)); } catch (Exception e) { e.printStackTrace(); @@ -929,7 +940,6 @@ public class ThemeUtils implements Constants { setActionBarTitleTextColor(window, itemColor); } - @SuppressLint("NewApi") public static void setActionBarOverflowColor(Toolbar toolbar, int itemColor) { if (toolbar == null) return; final ActionMenuView actionMenuView = ViewUtils.findViewByType(toolbar, ActionMenuView.class); @@ -949,6 +959,23 @@ public class ThemeUtils implements Constants { drawable.setColorFilter(itemColor, Mode.SRC_ATOP); } + public static void setActionBarOverflowColor(ActionMenuView actionMenuView, int itemColor) { + if (actionMenuView == null) return; + View overflowView = null; + for (int i = 0, j = actionMenuView.getChildCount(); i < j; i++) { + final View child = actionMenuView.getChildAt(i); + final ActionMenuView.LayoutParams lp = (ActionMenuView.LayoutParams) child.getLayoutParams(); + if (lp.isOverflowButton) { + overflowView = child; + break; + } + } + if (!(overflowView instanceof ImageView)) return; + final Drawable drawable = ((ImageView) overflowView).getDrawable(); + if (drawable == null) return; + drawable.setColorFilter(itemColor, Mode.SRC_ATOP); + } + public static void setActionBarSubtitleTextColor(Window window, int itemColor) { final View actionBarView = window.findViewById(android.support.v7.appcompat.R.id.action_bar); if (actionBarView instanceof Toolbar) { @@ -1070,7 +1097,8 @@ public class ThemeUtils implements Constants { item.setIcon(newIcon); } - public static void wrapToolbarMenuIcon(Toolbar view, int itemColor, int popupItemColor, int... excludeGroups) { + public static void wrapToolbarMenuIcon(@Nullable ActionMenuView view, int itemColor, int popupItemColor, int... excludeGroups) { + if (view == null) return; final Menu menu = view.getMenu(); final int childCount = view.getChildCount(); for (int i = 0, j = menu.size(), k = 0; i < j; i++) {