From 7631a19a87b353688d6c42822a284e2deda70df0 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Tue, 3 Mar 2020 09:11:18 -0600 Subject: [PATCH] Use theme picker dialog in widget config --- .../org/tasks/dialogs/ColorPalettePicker.kt | 1 - .../org/tasks/dialogs/ColorPickerAdapter.kt | 3 +- .../org/tasks/dialogs/ThemePickerDialog.kt | 17 +++- .../preferences/fragments/ScrollableWidget.kt | 10 +- .../java/org/tasks/themes/ThemeCache.java | 20 ---- .../java/org/tasks/themes/ThemeColor.java | 2 + .../java/org/tasks/themes/WidgetTheme.java | 91 ------------------- .../tasks/widget/ScrollableViewsFactory.java | 16 ++-- .../widget/ScrollableWidgetUpdateService.java | 5 +- .../java/org/tasks/widget/TasksWidget.java | 23 +++-- app/src/main/res/values/arrays.xml | 2 +- 11 files changed, 46 insertions(+), 144 deletions(-) delete mode 100644 app/src/main/java/org/tasks/themes/WidgetTheme.java diff --git a/app/src/main/java/org/tasks/dialogs/ColorPalettePicker.kt b/app/src/main/java/org/tasks/dialogs/ColorPalettePicker.kt index a13e33aee..97389fda3 100644 --- a/app/src/main/java/org/tasks/dialogs/ColorPalettePicker.kt +++ b/app/src/main/java/org/tasks/dialogs/ColorPalettePicker.kt @@ -96,7 +96,6 @@ class ColorPalettePicker : InjectingDialogFragment() { Palette.WIDGET -> ThemeColor.COLORS.mapIndexed { index, color -> ThemeColor(context, index, ContextCompat.getColor(context!!, color), false) } - Palette.WIDGET_BACKGROUND -> themeCache.widgetThemes } val iconPickerAdapter = ColorPickerAdapter( diff --git a/app/src/main/java/org/tasks/dialogs/ColorPickerAdapter.kt b/app/src/main/java/org/tasks/dialogs/ColorPickerAdapter.kt index 830f632dd..39aa04d4f 100644 --- a/app/src/main/java/org/tasks/dialogs/ColorPickerAdapter.kt +++ b/app/src/main/java/org/tasks/dialogs/ColorPickerAdapter.kt @@ -18,8 +18,7 @@ class ColorPickerAdapter( COLORS, ACCENTS, LAUNCHERS, - WIDGET, - WIDGET_BACKGROUND + WIDGET } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): IconPickerHolder { diff --git a/app/src/main/java/org/tasks/dialogs/ThemePickerDialog.kt b/app/src/main/java/org/tasks/dialogs/ThemePickerDialog.kt index 9f526ea98..e2665b242 100644 --- a/app/src/main/java/org/tasks/dialogs/ThemePickerDialog.kt +++ b/app/src/main/java/org/tasks/dialogs/ThemePickerDialog.kt @@ -28,10 +28,17 @@ class ThemePickerDialog : InjectingDialogFragment() { companion object { const val EXTRA_SELECTED = "extra_selected" - - fun newThemePickerDialog(target: Fragment, rc: Int, selected: Int): ThemePickerDialog { + const val EXTRA_WIDGET = "extra_widget" + + fun newThemePickerDialog( + target: Fragment, + rc: Int, + selected: Int, + widget: Boolean = false + ): ThemePickerDialog { val args = Bundle() args.putInt(EXTRA_SELECTED, selected) + args.putBoolean(EXTRA_WIDGET, widget) val dialog = ThemePickerDialog() dialog.setTargetFragment(target, rc) dialog.arguments = args @@ -52,9 +59,11 @@ class ThemePickerDialog : InjectingDialogFragment() { override fun inject(component: DialogFragmentComponent) = component.inject(this) override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val themes = resources.getStringArray(R.array.base_theme_names) - selected = savedInstanceState?.getInt(EXTRA_SELECTED) ?: arguments!!.getInt(EXTRA_SELECTED) + val widget = arguments?.getBoolean(EXTRA_WIDGET) ?: false + val themes = resources.getStringArray( + if (widget) R.array.widget_themes else R.array.base_theme_names + ) adapter = object : ArrayAdapter(activity!!, R.layout.simple_list_item_single_choice, themes) { override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { diff --git a/app/src/main/java/org/tasks/preferences/fragments/ScrollableWidget.kt b/app/src/main/java/org/tasks/preferences/fragments/ScrollableWidget.kt index 9c1388343..15e5bba53 100644 --- a/app/src/main/java/org/tasks/preferences/fragments/ScrollableWidget.kt +++ b/app/src/main/java/org/tasks/preferences/fragments/ScrollableWidget.kt @@ -15,13 +15,12 @@ import org.tasks.dialogs.ColorPalettePicker import org.tasks.dialogs.ColorPalettePicker.Companion.newColorPalette import org.tasks.dialogs.ColorPickerAdapter.Palette import org.tasks.dialogs.ColorWheelPicker +import org.tasks.dialogs.ThemePickerDialog.Companion.newThemePickerDialog import org.tasks.injection.FragmentComponent import org.tasks.injection.InjectingPreferenceFragment import org.tasks.locale.Locale import org.tasks.preferences.DefaultFilterProvider import org.tasks.preferences.Preferences -import org.tasks.themes.ThemeCache -import org.tasks.themes.WidgetTheme import org.tasks.widget.TasksWidget import org.tasks.widget.WidgetPreferences import javax.inject.Inject @@ -49,7 +48,6 @@ class ScrollableWidget : InjectingPreferenceFragment() { @Inject lateinit var defaultFilterProvider: DefaultFilterProvider @Inject lateinit var preferences: Preferences @Inject lateinit var locale: Locale - @Inject lateinit var themeCache: ThemeCache @Inject lateinit var localBroadcastManager: LocalBroadcastManager private lateinit var widgetPreferences: WidgetPreferences @@ -80,7 +78,7 @@ class ScrollableWidget : InjectingPreferenceFragment() { findPreference(R.string.p_widget_theme) .setOnPreferenceClickListener { - newColorPalette(this, REQUEST_THEME_SELECTION, Palette.WIDGET_BACKGROUND) + newThemePickerDialog(this, REQUEST_THEME_SELECTION, widgetPreferences.themeIndex, true) .show(parentFragmentManager, FRAG_TAG_COLOR_PICKER) false } @@ -141,8 +139,8 @@ class ScrollableWidget : InjectingPreferenceFragment() { } private fun updateTheme() { - val widgetTheme: WidgetTheme = themeCache.getWidgetTheme(widgetPreferences.themeIndex) - findPreference(R.string.p_widget_theme).summary = widgetTheme.name + val widgetNames = resources.getStringArray(R.array.widget_themes) + findPreference(R.string.p_widget_theme).summary = widgetNames[widgetPreferences.themeIndex] } private fun updateColor() { diff --git a/app/src/main/java/org/tasks/themes/ThemeCache.java b/app/src/main/java/org/tasks/themes/ThemeCache.java index 08cdfd748..f3fcd9c95 100644 --- a/app/src/main/java/org/tasks/themes/ThemeCache.java +++ b/app/src/main/java/org/tasks/themes/ThemeCache.java @@ -1,7 +1,6 @@ package org.tasks.themes; import static androidx.core.content.ContextCompat.getColor; -import static com.google.common.collect.ImmutableList.copyOf; import android.content.Context; import android.content.Intent; @@ -24,7 +23,6 @@ public class ThemeCache { public static final String EXTRA_THEME_OVERRIDE = "extra_theme_override"; private final List themes = new ArrayList<>(); - private final List widgetThemes = new ArrayList<>(); private final ThemeColor untaggedColor; private final Preferences preferences; private final Inventory inventory; @@ -73,24 +71,10 @@ public class ThemeCache { 5, getColor(context, android.R.color.white), AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)); - String[] widgetBackgroundNames = resources.getStringArray(R.array.widget_background); - for (int i = 0; i < WidgetTheme.BACKGROUNDS.length; i++) { - widgetThemes.add( - new WidgetTheme( - widgetBackgroundNames[i], - i, - getColor(context, WidgetTheme.BACKGROUNDS[i]), - getColor(context, i == 0 ? R.color.black_87 : R.color.white_87), - getColor(context, i == 0 ? R.color.black_54 : R.color.white_60))); - } untaggedColor = new ThemeColor(context, getColor(context, R.color.tag_color_none_background)); } - public WidgetTheme getWidgetTheme(int index) { - return widgetThemes.get(index); - } - public ThemeBase getThemeBase() { return getThemeBase(null); } @@ -115,8 +99,4 @@ public class ThemeCache { public ThemeColor getUntaggedColor() { return untaggedColor; } - - public List getWidgetThemes() { - return copyOf(widgetThemes); - } } diff --git a/app/src/main/java/org/tasks/themes/ThemeColor.java b/app/src/main/java/org/tasks/themes/ThemeColor.java index 163a342b0..dcef4cab0 100644 --- a/app/src/main/java/org/tasks/themes/ThemeColor.java +++ b/app/src/main/java/org/tasks/themes/ThemeColor.java @@ -18,6 +18,7 @@ import android.view.Menu; import android.view.MenuItem; import android.view.SubMenu; import android.view.View; +import androidx.annotation.ColorInt; import androidx.annotation.RequiresApi; import androidx.appcompat.widget.Toolbar; import androidx.core.content.ContextCompat; @@ -352,6 +353,7 @@ public class ThemeColor implements Pickable { return original; } + @ColorInt public int getPrimaryColor() { return colorPrimary; } diff --git a/app/src/main/java/org/tasks/themes/WidgetTheme.java b/app/src/main/java/org/tasks/themes/WidgetTheme.java deleted file mode 100644 index 14f427329..000000000 --- a/app/src/main/java/org/tasks/themes/WidgetTheme.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.tasks.themes; - -import android.os.Parcel; -import android.os.Parcelable; -import org.tasks.R; -import org.tasks.dialogs.ColorPalettePicker.Pickable; - -public class WidgetTheme implements Pickable { - - static final int[] BACKGROUNDS = - new int[] {android.R.color.white, R.color.widget_background_black, R.color.md_background_dark}; - public static final Parcelable.Creator CREATOR = - new Parcelable.Creator() { - @Override - public WidgetTheme createFromParcel(Parcel source) { - return new WidgetTheme(source); - } - - @Override - public WidgetTheme[] newArray(int size) { - return new WidgetTheme[size]; - } - }; - private final String name; - private final int index; - private final int backgroundColor; - private final int textColorPrimary; - private final int textColorSecondary; - - public WidgetTheme( - String name, int index, int backgroundColor, int textColorPrimary, int textColorSecondary) { - this.name = name; - this.index = index; - this.backgroundColor = backgroundColor; - this.textColorPrimary = textColorPrimary; - this.textColorSecondary = textColorSecondary; - } - - private WidgetTheme(Parcel source) { - name = source.readString(); - index = source.readInt(); - backgroundColor = source.readInt(); - textColorPrimary = source.readInt(); - textColorSecondary = source.readInt(); - } - - public int getBackgroundColor() { - return backgroundColor; - } - - public int getTextColorPrimary() { - return textColorPrimary; - } - - public int getTextColorSecondary() { - return textColorSecondary; - } - - public String getName() { - return name; - } - - @Override - public int getPickerColor() { - return backgroundColor; - } - - @Override - public boolean isFree() { - return index < 2; - } - - @Override - public int getIndex() { - return index; - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(name); - dest.writeInt(index); - dest.writeInt(backgroundColor); - dest.writeInt(textColorPrimary); - dest.writeInt(textColorSecondary); - } -} diff --git a/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.java b/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.java index 68c406e85..09080c1b0 100644 --- a/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.java +++ b/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.java @@ -12,6 +12,7 @@ import android.util.DisplayMetrics; import android.view.View; import android.widget.RemoteViews; import android.widget.RemoteViewsService; +import androidx.core.content.ContextCompat; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.dao.TaskDao; @@ -26,14 +27,11 @@ import org.tasks.data.TaskListQuery; import org.tasks.locale.Locale; import org.tasks.preferences.DefaultFilterProvider; import org.tasks.preferences.Preferences; -import org.tasks.themes.ThemeCache; -import org.tasks.themes.WidgetTheme; import org.tasks.ui.CheckBoxes; import timber.log.Timber; class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory { - private final ThemeCache themeCache; private final int widgetId; private final TaskDao taskDao; private final DefaultFilterProvider defaultFilterProvider; @@ -60,15 +58,13 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory { Context context, int widgetId, TaskDao taskDao, - DefaultFilterProvider defaultFilterProvider, - ThemeCache themeCache) { + DefaultFilterProvider defaultFilterProvider) { this.subtasksHelper = subtasksHelper; this.preferences = preferences; this.context = context; this.widgetId = widgetId; this.taskDao = taskDao; this.defaultFilterProvider = defaultFilterProvider; - this.themeCache = themeCache; widgetPreferences = new WidgetPreferences(context, preferences, widgetId); DisplayMetrics metrics = context.getResources().getDisplayMetrics(); widgetPadding = (int)(10 * metrics.density); @@ -233,9 +229,11 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory { } private void updateSettings() { - WidgetTheme widgetTheme = themeCache.getWidgetTheme(widgetPreferences.getThemeIndex()); - textColorPrimary = widgetTheme.getTextColorPrimary(); - textColorSecondary = widgetTheme.getTextColorSecondary(); + boolean isDark = widgetPreferences.getThemeIndex() > 0; + textColorPrimary = + ContextCompat.getColor(context, isDark ? R.color.white_87 : R.color.black_87); + textColorSecondary = + ContextCompat.getColor(context, isDark ? R.color.white_60 : R.color.black_54); showDueDates = widgetPreferences.showDueDate(); showCheckboxes = widgetPreferences.showCheckboxes(); textSize = widgetPreferences.getFontSize(); diff --git a/app/src/main/java/org/tasks/widget/ScrollableWidgetUpdateService.java b/app/src/main/java/org/tasks/widget/ScrollableWidgetUpdateService.java index 8300af52d..23218b2d7 100644 --- a/app/src/main/java/org/tasks/widget/ScrollableWidgetUpdateService.java +++ b/app/src/main/java/org/tasks/widget/ScrollableWidgetUpdateService.java @@ -11,7 +11,6 @@ import org.tasks.injection.InjectingApplication; import org.tasks.locale.Locale; import org.tasks.preferences.DefaultFilterProvider; import org.tasks.preferences.Preferences; -import org.tasks.themes.ThemeCache; public class ScrollableWidgetUpdateService extends RemoteViewsService { @@ -19,7 +18,6 @@ public class ScrollableWidgetUpdateService extends RemoteViewsService { @Inject Preferences preferences; @Inject SubtasksHelper subtasksHelper; @Inject DefaultFilterProvider defaultFilterProvider; - @Inject ThemeCache themeCache; @Inject Locale locale; @Override @@ -54,7 +52,6 @@ public class ScrollableWidgetUpdateService extends RemoteViewsService { locale.createConfigurationContext(getApplicationContext()), widgetId, taskDao, - defaultFilterProvider, - themeCache); + defaultFilterProvider); } } diff --git a/app/src/main/java/org/tasks/widget/TasksWidget.java b/app/src/main/java/org/tasks/widget/TasksWidget.java index 5904cd983..7b77a8034 100644 --- a/app/src/main/java/org/tasks/widget/TasksWidget.java +++ b/app/src/main/java/org/tasks/widget/TasksWidget.java @@ -15,6 +15,8 @@ import android.graphics.Canvas; import android.net.Uri; import android.view.View; import android.widget.RemoteViews; +import androidx.annotation.ColorInt; +import androidx.core.content.ContextCompat; import com.todoroo.astrid.activity.MainActivity; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.dao.TaskDao; @@ -27,9 +29,7 @@ import org.tasks.intents.TaskIntents; import org.tasks.locale.Locale; import org.tasks.preferences.DefaultFilterProvider; import org.tasks.preferences.Preferences; -import org.tasks.themes.ThemeCache; import org.tasks.themes.ThemeColor; -import org.tasks.themes.WidgetTheme; import timber.log.Timber; public class TasksWidget extends InjectingAppWidgetProvider { @@ -37,12 +37,11 @@ public class TasksWidget extends InjectingAppWidgetProvider { private static final int flags = FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP; @Inject Preferences preferences; @Inject DefaultFilterProvider defaultFilterProvider; - @Inject ThemeCache themeCache; @Inject Locale locale; @Inject TaskDao taskDao; @Inject @ForApplication Context context; - private static Bitmap getSolidBackground(int bgColor) { + private static Bitmap getSolidBackground(@ColorInt int bgColor) { Bitmap bitmap = Bitmap.createBitmap(2, 2, Bitmap.Config.ARGB_8888); // Create a Bitmap new Canvas(bitmap).drawColor(bgColor); // Set the color return bitmap; @@ -74,7 +73,6 @@ public class TasksWidget extends InjectingAppWidgetProvider { Intent rvIntent = new Intent(context, ScrollableWidgetUpdateService.class); rvIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id); rvIntent.setData(Uri.parse(rvIntent.toUri(Intent.URI_INTENT_SCHEME))); - WidgetTheme theme = themeCache.getWidgetTheme(widgetPreferences.getThemeIndex()); ThemeColor color = new ThemeColor(context, -1, widgetPreferences.getColor(), false); RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.scrollable_widget); if (atLeastJellybeanMR1()) { @@ -93,7 +91,8 @@ public class TasksWidget extends InjectingAppWidgetProvider { int opacityPercentage = widgetPreferences.getOpacity(); int opacity = (int) ((opacityPercentage / 100.0) * 255.0); remoteViews.setImageViewBitmap( - R.id.widget_background, getSolidBackground(theme.getBackgroundColor())); + R.id.widget_background, + getSolidBackground(getBackgroundColor(widgetPreferences.getThemeIndex()))); remoteViews.setImageViewBitmap( R.id.widget_header_background, getSolidBackground(color.getPrimaryColor())); remoteViews.setInt(R.id.widget_background, "setAlpha", opacity); @@ -111,6 +110,18 @@ public class TasksWidget extends InjectingAppWidgetProvider { return remoteViews; } + private @ColorInt int getBackgroundColor(int themeIndex) { + int background; + if (themeIndex == 1) { + background = android.R.color.black; + } else if (themeIndex == 2) { + background = R.color.md_background_dark; + } else { + background = android.R.color.white; + } + return ContextCompat.getColor(context, background); + } + private PendingIntent getPendingIntentTemplate(Context context) { return PendingIntent.getActivity( context, 0, new Intent(context, WidgetClickActivity.class), PendingIntent.FLAG_UPDATE_CURRENT); diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index da8ccc9ea..9f139f1b3 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -36,7 +36,7 @@ @string/ring_nonstop - + @string/theme_light @string/theme_black @string/theme_dark