Use theme picker dialog in widget config

pull/935/head
Alex Baker 5 years ago
parent 69685be912
commit 7631a19a87

@ -96,7 +96,6 @@ class ColorPalettePicker : InjectingDialogFragment() {
Palette.WIDGET -> ThemeColor.COLORS.mapIndexed { index, color -> Palette.WIDGET -> ThemeColor.COLORS.mapIndexed { index, color ->
ThemeColor(context, index, ContextCompat.getColor(context!!, color), false) ThemeColor(context, index, ContextCompat.getColor(context!!, color), false)
} }
Palette.WIDGET_BACKGROUND -> themeCache.widgetThemes
} }
val iconPickerAdapter = ColorPickerAdapter( val iconPickerAdapter = ColorPickerAdapter(

@ -18,8 +18,7 @@ class ColorPickerAdapter(
COLORS, COLORS,
ACCENTS, ACCENTS,
LAUNCHERS, LAUNCHERS,
WIDGET, WIDGET
WIDGET_BACKGROUND
} }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): IconPickerHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): IconPickerHolder {

@ -28,10 +28,17 @@ class ThemePickerDialog : InjectingDialogFragment() {
companion object { companion object {
const val EXTRA_SELECTED = "extra_selected" const val EXTRA_SELECTED = "extra_selected"
const val EXTRA_WIDGET = "extra_widget"
fun newThemePickerDialog(target: Fragment, rc: Int, selected: Int): ThemePickerDialog {
fun newThemePickerDialog(
target: Fragment,
rc: Int,
selected: Int,
widget: Boolean = false
): ThemePickerDialog {
val args = Bundle() val args = Bundle()
args.putInt(EXTRA_SELECTED, selected) args.putInt(EXTRA_SELECTED, selected)
args.putBoolean(EXTRA_WIDGET, widget)
val dialog = ThemePickerDialog() val dialog = ThemePickerDialog()
dialog.setTargetFragment(target, rc) dialog.setTargetFragment(target, rc)
dialog.arguments = args dialog.arguments = args
@ -52,9 +59,11 @@ class ThemePickerDialog : InjectingDialogFragment() {
override fun inject(component: DialogFragmentComponent) = component.inject(this) override fun inject(component: DialogFragmentComponent) = component.inject(this)
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val themes = resources.getStringArray(R.array.base_theme_names)
selected = savedInstanceState?.getInt(EXTRA_SELECTED) ?: arguments!!.getInt(EXTRA_SELECTED) 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<String>(activity!!, R.layout.simple_list_item_single_choice, themes) { adapter = object : ArrayAdapter<String>(activity!!, R.layout.simple_list_item_single_choice, themes) {
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {

@ -15,13 +15,12 @@ import org.tasks.dialogs.ColorPalettePicker
import org.tasks.dialogs.ColorPalettePicker.Companion.newColorPalette import org.tasks.dialogs.ColorPalettePicker.Companion.newColorPalette
import org.tasks.dialogs.ColorPickerAdapter.Palette import org.tasks.dialogs.ColorPickerAdapter.Palette
import org.tasks.dialogs.ColorWheelPicker import org.tasks.dialogs.ColorWheelPicker
import org.tasks.dialogs.ThemePickerDialog.Companion.newThemePickerDialog
import org.tasks.injection.FragmentComponent import org.tasks.injection.FragmentComponent
import org.tasks.injection.InjectingPreferenceFragment import org.tasks.injection.InjectingPreferenceFragment
import org.tasks.locale.Locale import org.tasks.locale.Locale
import org.tasks.preferences.DefaultFilterProvider import org.tasks.preferences.DefaultFilterProvider
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import org.tasks.themes.ThemeCache
import org.tasks.themes.WidgetTheme
import org.tasks.widget.TasksWidget import org.tasks.widget.TasksWidget
import org.tasks.widget.WidgetPreferences import org.tasks.widget.WidgetPreferences
import javax.inject.Inject import javax.inject.Inject
@ -49,7 +48,6 @@ class ScrollableWidget : InjectingPreferenceFragment() {
@Inject lateinit var defaultFilterProvider: DefaultFilterProvider @Inject lateinit var defaultFilterProvider: DefaultFilterProvider
@Inject lateinit var preferences: Preferences @Inject lateinit var preferences: Preferences
@Inject lateinit var locale: Locale @Inject lateinit var locale: Locale
@Inject lateinit var themeCache: ThemeCache
@Inject lateinit var localBroadcastManager: LocalBroadcastManager @Inject lateinit var localBroadcastManager: LocalBroadcastManager
private lateinit var widgetPreferences: WidgetPreferences private lateinit var widgetPreferences: WidgetPreferences
@ -80,7 +78,7 @@ class ScrollableWidget : InjectingPreferenceFragment() {
findPreference(R.string.p_widget_theme) findPreference(R.string.p_widget_theme)
.setOnPreferenceClickListener { .setOnPreferenceClickListener {
newColorPalette(this, REQUEST_THEME_SELECTION, Palette.WIDGET_BACKGROUND) newThemePickerDialog(this, REQUEST_THEME_SELECTION, widgetPreferences.themeIndex, true)
.show(parentFragmentManager, FRAG_TAG_COLOR_PICKER) .show(parentFragmentManager, FRAG_TAG_COLOR_PICKER)
false false
} }
@ -141,8 +139,8 @@ class ScrollableWidget : InjectingPreferenceFragment() {
} }
private fun updateTheme() { private fun updateTheme() {
val widgetTheme: WidgetTheme = themeCache.getWidgetTheme(widgetPreferences.themeIndex) val widgetNames = resources.getStringArray(R.array.widget_themes)
findPreference(R.string.p_widget_theme).summary = widgetTheme.name findPreference(R.string.p_widget_theme).summary = widgetNames[widgetPreferences.themeIndex]
} }
private fun updateColor() { private fun updateColor() {

@ -1,7 +1,6 @@
package org.tasks.themes; package org.tasks.themes;
import static androidx.core.content.ContextCompat.getColor; import static androidx.core.content.ContextCompat.getColor;
import static com.google.common.collect.ImmutableList.copyOf;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@ -24,7 +23,6 @@ public class ThemeCache {
public static final String EXTRA_THEME_OVERRIDE = "extra_theme_override"; public static final String EXTRA_THEME_OVERRIDE = "extra_theme_override";
private final List<ThemeBase> themes = new ArrayList<>(); private final List<ThemeBase> themes = new ArrayList<>();
private final List<WidgetTheme> widgetThemes = new ArrayList<>();
private final ThemeColor untaggedColor; private final ThemeColor untaggedColor;
private final Preferences preferences; private final Preferences preferences;
private final Inventory inventory; private final Inventory inventory;
@ -73,24 +71,10 @@ public class ThemeCache {
5, 5,
getColor(context, android.R.color.white), getColor(context, android.R.color.white),
AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)); 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 = untaggedColor =
new ThemeColor(context, getColor(context, R.color.tag_color_none_background)); new ThemeColor(context, getColor(context, R.color.tag_color_none_background));
} }
public WidgetTheme getWidgetTheme(int index) {
return widgetThemes.get(index);
}
public ThemeBase getThemeBase() { public ThemeBase getThemeBase() {
return getThemeBase(null); return getThemeBase(null);
} }
@ -115,8 +99,4 @@ public class ThemeCache {
public ThemeColor getUntaggedColor() { public ThemeColor getUntaggedColor() {
return untaggedColor; return untaggedColor;
} }
public List<WidgetTheme> getWidgetThemes() {
return copyOf(widgetThemes);
}
} }

@ -18,6 +18,7 @@ import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.SubMenu; import android.view.SubMenu;
import android.view.View; import android.view.View;
import androidx.annotation.ColorInt;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
@ -352,6 +353,7 @@ public class ThemeColor implements Pickable {
return original; return original;
} }
@ColorInt
public int getPrimaryColor() { public int getPrimaryColor() {
return colorPrimary; return colorPrimary;
} }

@ -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<WidgetTheme> CREATOR =
new Parcelable.Creator<WidgetTheme>() {
@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);
}
}

@ -12,6 +12,7 @@ import android.util.DisplayMetrics;
import android.view.View; import android.view.View;
import android.widget.RemoteViews; import android.widget.RemoteViews;
import android.widget.RemoteViewsService; import android.widget.RemoteViewsService;
import androidx.core.content.ContextCompat;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
@ -26,14 +27,11 @@ import org.tasks.data.TaskListQuery;
import org.tasks.locale.Locale; import org.tasks.locale.Locale;
import org.tasks.preferences.DefaultFilterProvider; import org.tasks.preferences.DefaultFilterProvider;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import org.tasks.themes.ThemeCache;
import org.tasks.themes.WidgetTheme;
import org.tasks.ui.CheckBoxes; import org.tasks.ui.CheckBoxes;
import timber.log.Timber; import timber.log.Timber;
class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory { class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory {
private final ThemeCache themeCache;
private final int widgetId; private final int widgetId;
private final TaskDao taskDao; private final TaskDao taskDao;
private final DefaultFilterProvider defaultFilterProvider; private final DefaultFilterProvider defaultFilterProvider;
@ -60,15 +58,13 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory {
Context context, Context context,
int widgetId, int widgetId,
TaskDao taskDao, TaskDao taskDao,
DefaultFilterProvider defaultFilterProvider, DefaultFilterProvider defaultFilterProvider) {
ThemeCache themeCache) {
this.subtasksHelper = subtasksHelper; this.subtasksHelper = subtasksHelper;
this.preferences = preferences; this.preferences = preferences;
this.context = context; this.context = context;
this.widgetId = widgetId; this.widgetId = widgetId;
this.taskDao = taskDao; this.taskDao = taskDao;
this.defaultFilterProvider = defaultFilterProvider; this.defaultFilterProvider = defaultFilterProvider;
this.themeCache = themeCache;
widgetPreferences = new WidgetPreferences(context, preferences, widgetId); widgetPreferences = new WidgetPreferences(context, preferences, widgetId);
DisplayMetrics metrics = context.getResources().getDisplayMetrics(); DisplayMetrics metrics = context.getResources().getDisplayMetrics();
widgetPadding = (int)(10 * metrics.density); widgetPadding = (int)(10 * metrics.density);
@ -233,9 +229,11 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory {
} }
private void updateSettings() { private void updateSettings() {
WidgetTheme widgetTheme = themeCache.getWidgetTheme(widgetPreferences.getThemeIndex()); boolean isDark = widgetPreferences.getThemeIndex() > 0;
textColorPrimary = widgetTheme.getTextColorPrimary(); textColorPrimary =
textColorSecondary = widgetTheme.getTextColorSecondary(); 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(); showDueDates = widgetPreferences.showDueDate();
showCheckboxes = widgetPreferences.showCheckboxes(); showCheckboxes = widgetPreferences.showCheckboxes();
textSize = widgetPreferences.getFontSize(); textSize = widgetPreferences.getFontSize();

@ -11,7 +11,6 @@ import org.tasks.injection.InjectingApplication;
import org.tasks.locale.Locale; import org.tasks.locale.Locale;
import org.tasks.preferences.DefaultFilterProvider; import org.tasks.preferences.DefaultFilterProvider;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import org.tasks.themes.ThemeCache;
public class ScrollableWidgetUpdateService extends RemoteViewsService { public class ScrollableWidgetUpdateService extends RemoteViewsService {
@ -19,7 +18,6 @@ public class ScrollableWidgetUpdateService extends RemoteViewsService {
@Inject Preferences preferences; @Inject Preferences preferences;
@Inject SubtasksHelper subtasksHelper; @Inject SubtasksHelper subtasksHelper;
@Inject DefaultFilterProvider defaultFilterProvider; @Inject DefaultFilterProvider defaultFilterProvider;
@Inject ThemeCache themeCache;
@Inject Locale locale; @Inject Locale locale;
@Override @Override
@ -54,7 +52,6 @@ public class ScrollableWidgetUpdateService extends RemoteViewsService {
locale.createConfigurationContext(getApplicationContext()), locale.createConfigurationContext(getApplicationContext()),
widgetId, widgetId,
taskDao, taskDao,
defaultFilterProvider, defaultFilterProvider);
themeCache);
} }
} }

@ -15,6 +15,8 @@ import android.graphics.Canvas;
import android.net.Uri; import android.net.Uri;
import android.view.View; import android.view.View;
import android.widget.RemoteViews; import android.widget.RemoteViews;
import androidx.annotation.ColorInt;
import androidx.core.content.ContextCompat;
import com.todoroo.astrid.activity.MainActivity; import com.todoroo.astrid.activity.MainActivity;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
@ -27,9 +29,7 @@ import org.tasks.intents.TaskIntents;
import org.tasks.locale.Locale; import org.tasks.locale.Locale;
import org.tasks.preferences.DefaultFilterProvider; import org.tasks.preferences.DefaultFilterProvider;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import org.tasks.themes.ThemeCache;
import org.tasks.themes.ThemeColor; import org.tasks.themes.ThemeColor;
import org.tasks.themes.WidgetTheme;
import timber.log.Timber; import timber.log.Timber;
public class TasksWidget extends InjectingAppWidgetProvider { 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; private static final int flags = FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP;
@Inject Preferences preferences; @Inject Preferences preferences;
@Inject DefaultFilterProvider defaultFilterProvider; @Inject DefaultFilterProvider defaultFilterProvider;
@Inject ThemeCache themeCache;
@Inject Locale locale; @Inject Locale locale;
@Inject TaskDao taskDao; @Inject TaskDao taskDao;
@Inject @ForApplication Context context; @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 Bitmap bitmap = Bitmap.createBitmap(2, 2, Bitmap.Config.ARGB_8888); // Create a Bitmap
new Canvas(bitmap).drawColor(bgColor); // Set the color new Canvas(bitmap).drawColor(bgColor); // Set the color
return bitmap; return bitmap;
@ -74,7 +73,6 @@ public class TasksWidget extends InjectingAppWidgetProvider {
Intent rvIntent = new Intent(context, ScrollableWidgetUpdateService.class); Intent rvIntent = new Intent(context, ScrollableWidgetUpdateService.class);
rvIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id); rvIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id);
rvIntent.setData(Uri.parse(rvIntent.toUri(Intent.URI_INTENT_SCHEME))); 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); ThemeColor color = new ThemeColor(context, -1, widgetPreferences.getColor(), false);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.scrollable_widget); RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.scrollable_widget);
if (atLeastJellybeanMR1()) { if (atLeastJellybeanMR1()) {
@ -93,7 +91,8 @@ public class TasksWidget extends InjectingAppWidgetProvider {
int opacityPercentage = widgetPreferences.getOpacity(); int opacityPercentage = widgetPreferences.getOpacity();
int opacity = (int) ((opacityPercentage / 100.0) * 255.0); int opacity = (int) ((opacityPercentage / 100.0) * 255.0);
remoteViews.setImageViewBitmap( remoteViews.setImageViewBitmap(
R.id.widget_background, getSolidBackground(theme.getBackgroundColor())); R.id.widget_background,
getSolidBackground(getBackgroundColor(widgetPreferences.getThemeIndex())));
remoteViews.setImageViewBitmap( remoteViews.setImageViewBitmap(
R.id.widget_header_background, getSolidBackground(color.getPrimaryColor())); R.id.widget_header_background, getSolidBackground(color.getPrimaryColor()));
remoteViews.setInt(R.id.widget_background, "setAlpha", opacity); remoteViews.setInt(R.id.widget_background, "setAlpha", opacity);
@ -111,6 +110,18 @@ public class TasksWidget extends InjectingAppWidgetProvider {
return remoteViews; 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) { private PendingIntent getPendingIntentTemplate(Context context) {
return PendingIntent.getActivity( return PendingIntent.getActivity(
context, 0, new Intent(context, WidgetClickActivity.class), PendingIntent.FLAG_UPDATE_CURRENT); context, 0, new Intent(context, WidgetClickActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);

@ -36,7 +36,7 @@
<item>@string/ring_nonstop</item> <item>@string/ring_nonstop</item>
</string-array> </string-array>
<string-array name="widget_background"> <string-array name="widget_themes">
<item>@string/theme_light</item> <item>@string/theme_light</item>
<item>@string/theme_black</item> <item>@string/theme_black</item>
<item>@string/theme_dark</item> <item>@string/theme_dark</item>

Loading…
Cancel
Save