From a76a866f4d92a07d84faa2eae1404d504a6ff2c5 Mon Sep 17 00:00:00 2001 From: David Luhmer Date: Sun, 13 Jun 2021 20:36:21 +0200 Subject: Fix #972 - light theme issues (Light theme is incompatible with incognito mode) Signed-off-by: David Luhmer --- .../owncloudnewsreader/NewsDetailActivity.java | 50 +++++++++++++++------- .../owncloudnewsreader/helper/ThemeChooser.java | 6 +-- .../owncloudnewsreader/helper/ThemeUtils.java | 46 +++++++++++++++++++- 3 files changed, 82 insertions(+), 20 deletions(-) (limited to 'News-Android-App/src/main/java') diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsDetailActivity.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsDetailActivity.java index 74b066b6..9357ae86 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsDetailActivity.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsDetailActivity.java @@ -48,7 +48,6 @@ import androidx.viewpager.widget.ViewPager; import java.lang.ref.WeakReference; import java.util.HashSet; -import java.util.Objects; import java.util.Set; import javax.inject.Inject; @@ -57,6 +56,7 @@ import de.greenrobot.dao.query.LazyList; import de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm; import de.luhmer.owncloudnewsreader.database.model.RssItem; import de.luhmer.owncloudnewsreader.databinding.ActivityNewsDetailBinding; +import de.luhmer.owncloudnewsreader.helper.ThemeChooser; import de.luhmer.owncloudnewsreader.helper.ThemeUtils; import de.luhmer.owncloudnewsreader.model.PodcastItem; import de.luhmer.owncloudnewsreader.model.TTSItem; @@ -392,25 +392,28 @@ public class NewsDetailActivity extends PodcastFragmentActivity { menuItem_PlayPodcast.setVisible(podcastAvailable); } + boolean isDark = ThemeChooser.isDarkTheme(this); + boolean darkIcons = !isDark && !mShowFastActions; + if (menuItem_Starred != null) { if (isStarred) { - menuItem_Starred.setIcon(R.drawable.ic_action_star_dark); - binding.faDetailBar.faStar.setImageResource(R.drawable.ic_action_star_dark); + menuItem_Starred.setIcon(darkIcons ? R.drawable.ic_action_star_light : R.drawable.ic_action_star_dark); + binding.faDetailBar.faStar.setImageResource(darkIcons ? R.drawable.ic_action_star_light : R.drawable.ic_action_star_dark); } else { - menuItem_Starred.setIcon(R.drawable.ic_action_star_border_dark); - binding.faDetailBar.faStar.setImageResource(R.drawable.ic_action_star_border_dark); + menuItem_Starred.setIcon(darkIcons ? R.drawable.ic_action_star_border_light : R.drawable.ic_action_star_border_dark); + binding.faDetailBar.faStar.setImageResource(darkIcons ? R.drawable.ic_action_star_border_light : R.drawable.ic_action_star_border_dark); } } if (menuItem_Read != null) { if (isRead) { - menuItem_Read.setIcon(R.drawable.ic_checkbox_white); + menuItem_Read.setIcon(darkIcons ? R.drawable.ic_checkbox_black : R.drawable.ic_checkbox_white); menuItem_Read.setChecked(true); - binding.faDetailBar.faMarkAsRead.setImageResource(R.drawable.ic_checkbox_white); + binding.faDetailBar.faMarkAsRead.setImageResource(darkIcons ? R.drawable.ic_checkbox_black : R.drawable.ic_checkbox_white); } else { - menuItem_Read.setIcon(R.drawable.ic_checkbox_outline_white); + menuItem_Read.setIcon(darkIcons ? R.drawable.ic_checkbox_outline_black : R.drawable.ic_checkbox_outline_white); menuItem_Read.setChecked(false); - binding.faDetailBar.faMarkAsRead.setImageResource(R.drawable.ic_checkbox_outline_white); + binding.faDetailBar.faMarkAsRead.setImageResource(darkIcons ? R.drawable.ic_checkbox_outline_black : R.drawable.ic_checkbox_outline_white); } } } @@ -460,10 +463,11 @@ public class NewsDetailActivity extends PodcastFragmentActivity { } } - updateActionBarIcons(); initIncognitoMode(); + updateActionBarIcons(); + return true; } @@ -543,7 +547,6 @@ public class NewsDetailActivity extends PodcastFragmentActivity { share.putExtra(Intent.EXTRA_TEXT, content); startActivity(Intent.createChooser(share, "Share Item")); - } /** @@ -617,18 +620,35 @@ public class NewsDetailActivity extends PodcastFragmentActivity { } public void initIncognitoMode() { + boolean isLightTheme = !ThemeChooser.isDarkTheme(this); + int color = getResources().getColor(isIncognitoEnabled() ? R.color.material_grey_900 : R.color.colorPrimary); ThemeUtils.colorizeToolbar(binding.toolbarLayout.toolbar, color); + if (isLightTheme) { + // the first three menu items are from the fast actions (if enabled) + int skipItems = mShowFastActions ? 3 : 0; + if (isIncognitoEnabled()) { + int white = getResources().getColor(android.R.color.white); + ThemeUtils.colorizeToolbarForeground(binding.toolbarLayout.toolbar, white, skipItems); + clearLightStatusBar(getWindow().getDecorView()); + } else { + int primaryTextColor = getResources().getColor(R.color.primaryTextColor); + ThemeUtils.colorizeToolbarForeground(binding.toolbarLayout.toolbar, primaryTextColor, skipItems); + setLightStatusBar(getWindow().getDecorView()); + } + } + getWindow().setStatusBarColor(color); + + //ThemeUtils.colorizeToolbar(bottomAppBar, color); //ThemeUtils.changeStatusBarColor(this, color); //getWindow().setNavigationBarColor(color); - getWindow().setStatusBarColor(color); + /* switch (ThemeChooser.getSelectedTheme()) { case LIGHT: Log.d(TAG, "initIncognitoMode: LIGHT"); - setLightStatusBar(getWindow().getDecorView()); getWindow().setStatusBarColor(Color.WHITE); break; case DARK: @@ -645,7 +665,7 @@ public class NewsDetailActivity extends PodcastFragmentActivity { */ } - /* + private void setLightStatusBar(@NonNull View view) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { int flags = view.getSystemUiVisibility(); // get current flag @@ -661,7 +681,7 @@ public class NewsDetailActivity extends PodcastFragmentActivity { view.setSystemUiVisibility(flags); } } - */ + /** * A {@link FragmentPagerAdapter} that returns a fragment corresponding to diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/ThemeChooser.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/ThemeChooser.java index 23965e43..cf16c6f9 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/ThemeChooser.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/ThemeChooser.java @@ -126,8 +126,8 @@ public class ThemeChooser { return themeChanged || oledChanged; } - private static boolean isDarkTheme(Context context) { - switch(AppCompatDelegate.getDefaultNightMode()) { + public static boolean isDarkTheme(Context context) { + switch (AppCompatDelegate.getDefaultNightMode()) { case AppCompatDelegate.MODE_NIGHT_YES: Log.v(TAG, "MODE_NIGHT_YES (Dark Theme)"); return true; @@ -136,7 +136,7 @@ public class ThemeChooser { case AppCompatDelegate.MODE_NIGHT_AUTO: //Log.v(TAG, "MODE_NIGHT_AUTO"); int nightModeFlags = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; - if(Configuration.UI_MODE_NIGHT_YES == nightModeFlags) { + if (Configuration.UI_MODE_NIGHT_YES == nightModeFlags) { Log.v(TAG, "MODE_NIGHT_AUTO (Dark Theme)"); return true; } diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/ThemeUtils.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/ThemeUtils.java index 0aa0e0c7..4188b15d 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/ThemeUtils.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/helper/ThemeUtils.java @@ -22,13 +22,17 @@ package de.luhmer.owncloudnewsreader.helper; import android.app.Activity; +import android.graphics.ColorFilter; import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; import android.os.Build; import android.util.Log; +import android.view.Menu; import android.view.View; import android.view.Window; import android.view.WindowManager; +import android.widget.ImageButton; import android.widget.SearchView; import android.widget.TextView; @@ -110,16 +114,54 @@ public class ThemeUtils { v.setBackgroundColor(toolbarBackgroundColor); - if(v instanceof ActionMenuView) { - for(int j = 0; j < ((ActionMenuView)v).getChildCount(); j++) { + if (v instanceof ActionMenuView) { + for (int j = 0; j < ((ActionMenuView) v).getChildCount(); j++) { v.setBackgroundColor(toolbarBackgroundColor); } } } } + /** + * Use this method to colorize the toolbar to the desired target color + * + * @param toolbarView toolbar view being colored + * @param toolbarForegroundColor the target background color + * @param skipMenuItems how many menu items should not be colored + */ + public static void colorizeToolbarForeground(Toolbar toolbarView, @ColorInt int toolbarForegroundColor, int skipMenuItems) { + toolbarView.setTitleTextColor(toolbarForegroundColor); + + ColorFilter cf = new PorterDuffColorFilter(toolbarForegroundColor, PorterDuff.Mode.SRC_IN); + Drawable drawable = toolbarView.getOverflowIcon(); + if (drawable != null) { + drawable.setColorFilter(cf); + } + + for (int i = 0; i < toolbarView.getChildCount(); i++) { + final View v = toolbarView.getChildAt(i); + if (v instanceof ImageButton) { + ((ImageButton) v).setColorFilter(cf); + } else if (v instanceof ActionMenuView) { + Menu menu = ((ActionMenuView) v).getMenu(); + for (int x = skipMenuItems; x < menu.size(); x++) { + Drawable d = menu.getItem(x).getIcon(); + if (d != null) { + d.setColorFilter(cf); + } + } + } + /* + else { + Log.d(TAG, v.toString()); + } + */ + } + } + /** * Use this method to colorize the status bar to the desired target color + * * @param activity * @param statusBarColor */ -- cgit v1.2.3