Use theme picker dialog in widget config

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

@ -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(

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

@ -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<String>(activity!!, R.layout.simple_list_item_single_choice, themes) {
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.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() {

@ -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<ThemeBase> themes = new ArrayList<>();
private final List<WidgetTheme> 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<WidgetTheme> getWidgetThemes() {
return copyOf(widgetThemes);
}
}

@ -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;
}

@ -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.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();

@ -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);
}
}

@ -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);

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

Loading…
Cancel
Save