diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 15f91e372..79c4f0c3b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -34,7 +34,7 @@ android { defaultConfig { testApplicationId = "org.tasks.test" applicationId = "org.tasks" - versionCode = 674 + versionCode = 675 versionName = "8.1" targetSdkVersion(Versions.targetSdk) minSdkVersion(Versions.minSdk) diff --git a/app/src/main/java/com/todoroo/astrid/activity/MainActivity.java b/app/src/main/java/com/todoroo/astrid/activity/MainActivity.java index bf7919283..4e505f575 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/MainActivity.java +++ b/app/src/main/java/com/todoroo/astrid/activity/MainActivity.java @@ -13,6 +13,7 @@ import static com.todoroo.andlib.utility.AndroidUtilities.atLeastNougat; import static com.todoroo.astrid.activity.TaskEditFragment.newTaskEditFragment; import static com.todoroo.astrid.activity.TaskListFragment.newTaskListFragment; import static org.tasks.tasklist.ActionUtils.applySupportActionModeColor; +import static org.tasks.themes.ThemeColor.newThemeColor; import static org.tasks.ui.NavigationDrawerFragment.REQUEST_NEW_LIST; import android.annotation.SuppressLint; @@ -302,8 +303,8 @@ public class MainActivity extends InjectingAppCompatActivity } private ThemeColor getFilterColor() { - return filter != null && filter.tint >= 0 - ? themeCache.getThemeColor(filter.tint) + return filter != null && filter.tint != 0 + ? newThemeColor(this, filter.tint) : theme.getThemeColor(); } diff --git a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java index 93a708139..eab5c1c76 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java +++ b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java @@ -12,6 +12,7 @@ import static com.google.common.collect.Lists.newArrayList; import static com.todoroo.andlib.utility.AndroidUtilities.assertMainThread; import static org.tasks.activities.RemoteListPicker.newRemoteListSupportPicker; import static org.tasks.caldav.CaldavCalendarSettingsActivity.EXTRA_CALDAV_CALENDAR; +import static org.tasks.themes.ThemeColor.newThemeColor; import static org.tasks.ui.CheckBoxes.getPriorityColor; import android.app.Activity; @@ -264,7 +265,7 @@ public final class TaskListFragment extends InjectingFragment filter = getFilter(); - themeColor = filter.tint >= 0 ? themeCache.getThemeColor(filter.tint) : defaultThemeColor; + themeColor = filter.tint != 0 ? newThemeColor(context, filter.tint) : defaultThemeColor; filter.setFilterQueryOverride(null); diff --git a/app/src/main/java/com/todoroo/astrid/adapter/FilterAdapter.java b/app/src/main/java/com/todoroo/astrid/adapter/FilterAdapter.java index 114078335..3f5904f63 100644 --- a/app/src/main/java/com/todoroo/astrid/adapter/FilterAdapter.java +++ b/app/src/main/java/com/todoroo/astrid/adapter/FilterAdapter.java @@ -27,7 +27,6 @@ import org.tasks.filters.NavigationDrawerSubheader; import org.tasks.locale.Locale; import org.tasks.themes.Theme; import org.tasks.themes.ThemeAccent; -import org.tasks.themes.ThemeCache; public class FilterAdapter extends BaseAdapter { @@ -39,19 +38,16 @@ public class FilterAdapter extends BaseAdapter { private final Locale locale; private final Inventory inventory; private final LayoutInflater inflater; - private final ThemeCache themeCache; private Filter selected = null; private List items = new ArrayList<>(); @Inject - public FilterAdapter( - Activity activity, Theme theme, ThemeCache themeCache, Locale locale, Inventory inventory) { + public FilterAdapter(Activity activity, Theme theme, Locale locale, Inventory inventory) { this.activity = activity; this.accent = theme.getThemeAccent(); this.locale = locale; this.inventory = inventory; this.inflater = theme.getLayoutInflater(activity); - this.themeCache = themeCache; } public void save(Bundle outState) { @@ -105,8 +101,7 @@ public class FilterAdapter extends BaseAdapter { switch (viewType) { case ITEM: viewHolder = - new FilterViewHolder( - convertView, accent, themeCache, false, locale, activity, inventory, null); + new FilterViewHolder(convertView, accent, false, locale, activity, inventory, null); break; case SEPARATOR: viewHolder = new FilterViewHolder(convertView); diff --git a/app/src/main/java/com/todoroo/astrid/adapter/FilterViewHolder.java b/app/src/main/java/com/todoroo/astrid/adapter/FilterViewHolder.java index e6fea1d54..7929ae62b 100644 --- a/app/src/main/java/com/todoroo/astrid/adapter/FilterViewHolder.java +++ b/app/src/main/java/com/todoroo/astrid/adapter/FilterViewHolder.java @@ -1,6 +1,7 @@ package com.todoroo.astrid.adapter; import static com.todoroo.andlib.utility.AndroidUtilities.preLollipop; +import static org.tasks.themes.ThemeColor.newThemeColor; import android.app.Activity; import android.content.Intent; @@ -30,7 +31,6 @@ import org.tasks.locale.Locale; import org.tasks.preferences.SyncPreferences; import org.tasks.themes.CustomIcons; import org.tasks.themes.ThemeAccent; -import org.tasks.themes.ThemeCache; import org.tasks.themes.ThemeColor; public class FilterViewHolder extends RecyclerView.ViewHolder { @@ -50,7 +50,6 @@ public class FilterViewHolder extends RecyclerView.ViewHolder { TextView size; private OnClick onClick; - private ThemeCache themeCache; private boolean navigationDrawer; private Locale locale; private Activity activity; @@ -60,7 +59,6 @@ public class FilterViewHolder extends RecyclerView.ViewHolder { FilterViewHolder( @NonNull View itemView, ThemeAccent accent, - ThemeCache themeCache, boolean navigationDrawer, Locale locale, Activity activity, @@ -72,7 +70,6 @@ public class FilterViewHolder extends RecyclerView.ViewHolder { ButterKnife.bind(this, itemView); this.itemView = itemView; - this.themeCache = themeCache; this.navigationDrawer = navigationDrawer; this.locale = locale; this.activity = activity; @@ -135,8 +132,8 @@ public class FilterViewHolder extends RecyclerView.ViewHolder { } private int getColor(FilterListItem filter) { - if (filter.tint >= 0) { - ThemeColor color = themeCache.getThemeColor(filter.tint); + if (filter.tint != 0) { + ThemeColor color = newThemeColor(activity, filter.tint); if (color.isFree() || inventory.purchasedThemes()) { return color.getPrimaryColor(); } diff --git a/app/src/main/java/com/todoroo/astrid/adapter/NavigationDrawerAdapter.java b/app/src/main/java/com/todoroo/astrid/adapter/NavigationDrawerAdapter.java index b79cca4f1..78e6e49ae 100644 --- a/app/src/main/java/com/todoroo/astrid/adapter/NavigationDrawerAdapter.java +++ b/app/src/main/java/com/todoroo/astrid/adapter/NavigationDrawerAdapter.java @@ -32,7 +32,6 @@ import org.tasks.filters.NavigationDrawerSubheader; import org.tasks.locale.Locale; import org.tasks.themes.Theme; import org.tasks.themes.ThemeAccent; -import org.tasks.themes.ThemeCache; public class NavigationDrawerAdapter extends ListAdapter { @@ -42,21 +41,19 @@ public class NavigationDrawerAdapter extends ListAdapter counts = new HashMap<>(); @Inject public NavigationDrawerAdapter( - Activity activity, Theme theme, ThemeCache themeCache, Locale locale, Inventory inventory) { + Activity activity, Theme theme, Locale locale, Inventory inventory) { super(new DiffCallback()); this.activity = activity; this.accent = theme.getThemeAccent(); this.locale = locale; this.inventory = inventory; this.inflater = theme.getLayoutInflater(activity); - this.themeCache = themeCache; } public void setOnClick(OnClick onClick) { @@ -98,7 +95,7 @@ public class NavigationDrawerAdapter extends ListAdapter= 0 && index < ThemeColor.COLORS.length + ? ContextCompat.getColor(context, ThemeColor.COLORS[index]) + : 0; + } + private void applyCaldavSubtasks() { List updated = newArrayList(); diff --git a/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.java b/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.java index e869efbe7..175af1314 100644 --- a/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.java +++ b/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.java @@ -1,6 +1,7 @@ package org.tasks.activities; import static org.tasks.dialogs.IconPickerDialog.newIconPicker; +import static org.tasks.themes.ThemeColor.newThemeColor; import android.content.DialogInterface; import android.content.Intent; @@ -22,7 +23,6 @@ import org.tasks.dialogs.DialogBuilder; import org.tasks.dialogs.IconPickerDialog.IconPickerCallback; import org.tasks.injection.ThemedInjectingAppCompatActivity; import org.tasks.themes.CustomIcons; -import org.tasks.themes.ThemeCache; import org.tasks.themes.ThemeColor; public abstract class BaseListSettingsActivity extends ThemedInjectingAppCompatActivity @@ -42,11 +42,10 @@ public abstract class BaseListSettingsActivity extends ThemedInjectingAppCompatA @BindView(R.id.toolbar) Toolbar toolbar; - @Inject ThemeCache themeCache; @Inject ThemeColor themeColor; @Inject DialogBuilder dialogBuilder; - protected int selectedTheme = -1; + protected int selectedColor = -1; protected int selectedIcon = -1; @Override @@ -58,7 +57,7 @@ public abstract class BaseListSettingsActivity extends ThemedInjectingAppCompatA ButterKnife.bind(this); if (savedInstanceState != null) { - selectedTheme = savedInstanceState.getInt(EXTRA_SELECTED_THEME); + selectedColor = savedInstanceState.getInt(EXTRA_SELECTED_THEME); selectedIcon = savedInstanceState.getInt(EXTRA_SELECTED_ICON); } @@ -69,14 +68,13 @@ public abstract class BaseListSettingsActivity extends ThemedInjectingAppCompatA toolbar.inflateMenu(R.menu.menu_tag_settings); } toolbar.setOnMenuItemClickListener(this); - themeColor.apply(toolbar); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - outState.putInt(EXTRA_SELECTED_THEME, selectedTheme); + outState.putInt(EXTRA_SELECTED_THEME, selectedColor); outState.putInt(EXTRA_SELECTED_ICON, selectedIcon); } @@ -114,7 +112,7 @@ public abstract class BaseListSettingsActivity extends ThemedInjectingAppCompatA Intent intent = new Intent(BaseListSettingsActivity.this, ColorPickerActivity.class); intent.putExtra(ColorPickerActivity.EXTRA_PALETTE, ColorPickerActivity.ColorPalette.COLORS); intent.putExtra(ColorPickerActivity.EXTRA_SHOW_NONE, true); - intent.putExtra(ColorPickerActivity.EXTRA_THEME_INDEX, selectedTheme); + intent.putExtra(ColorPickerActivity.EXTRA_COLOR, selectedColor); startActivityForResult(intent, REQUEST_COLOR_PICKER); } @@ -134,7 +132,8 @@ public abstract class BaseListSettingsActivity extends ThemedInjectingAppCompatA protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_COLOR_PICKER) { if (resultCode == RESULT_OK) { - selectedTheme = data.getIntExtra(ColorPickerActivity.EXTRA_THEME_INDEX, 0); + int index = data.getIntExtra(ColorPickerActivity.EXTRA_COLOR, -1); + selectedColor = index < 0 ? 0 : ContextCompat.getColor(this, ThemeColor.COLORS[index]); updateTheme(); } } else { @@ -163,11 +162,11 @@ public abstract class BaseListSettingsActivity extends ThemedInjectingAppCompatA protected void updateTheme() { ThemeColor themeColor; - if (selectedTheme < 0) { + if (selectedColor == 0) { themeColor = this.themeColor; color.setVisibility(View.GONE); } else { - themeColor = themeCache.getThemeColor(selectedTheme); + themeColor = newThemeColor(this, selectedColor); Drawable colorIcon = ContextCompat.getDrawable(this, R.drawable.ic_baseline_lens_24px); Drawable wrappedColorIcon = DrawableCompat.wrap(colorIcon.mutate()); DrawableCompat.setTint(wrappedColorIcon, themeColor.getPrimaryColor()); diff --git a/app/src/main/java/org/tasks/activities/ColorPickerActivity.java b/app/src/main/java/org/tasks/activities/ColorPickerActivity.java index bdf826b5b..c9d604329 100644 --- a/app/src/main/java/org/tasks/activities/ColorPickerActivity.java +++ b/app/src/main/java/org/tasks/activities/ColorPickerActivity.java @@ -2,6 +2,7 @@ package org.tasks.activities; import static org.tasks.billing.PurchaseDialog.newPurchaseDialog; import static org.tasks.dialogs.ColorPickerDialog.newColorPickerDialog; +import static org.tasks.themes.ThemeColor.newThemeColor; import android.content.Intent; import java.util.List; @@ -9,6 +10,7 @@ import javax.inject.Inject; import org.tasks.R; import org.tasks.billing.Inventory; import org.tasks.dialogs.ColorPickerDialog; +import org.tasks.dialogs.ColorPickerDialog.Pickable; import org.tasks.injection.ActivityComponent; import org.tasks.injection.InjectingAppCompatActivity; import org.tasks.preferences.Preferences; @@ -20,7 +22,7 @@ public class ColorPickerActivity extends InjectingAppCompatActivity public static final String EXTRA_PALETTE = "extra_palette"; public static final String EXTRA_SHOW_NONE = "extra_show_none"; - public static final String EXTRA_THEME_INDEX = "extra_index"; + public static final String EXTRA_COLOR = "extra_index"; private static final String FRAG_TAG_COLOR_PICKER = "frag_tag_color_picker"; private static final String FRAG_TAG_PURCHASE = "frag_tag_purchase"; @Inject Theme theme; @@ -37,11 +39,22 @@ public class ColorPickerActivity extends InjectingAppCompatActivity Intent intent = getIntent(); palette = (ColorPalette) intent.getSerializableExtra(EXTRA_PALETTE); boolean showNone = intent.getBooleanExtra(EXTRA_SHOW_NONE, false); - int selected = - intent.hasExtra(EXTRA_THEME_INDEX) - ? intent.getIntExtra(EXTRA_THEME_INDEX, -1) - : getCurrentSelection(palette); - newColorPickerDialog(getItems(palette), showNone, selected) + List items = getItems(palette); + int selected; + if (palette == ColorPalette.COLORS) { + selected = + items.indexOf( + intent.hasExtra(EXTRA_COLOR) + ? newThemeColor(this, intent.getIntExtra(EXTRA_COLOR, 0)) + : theme.getThemeColor()); + } else { + selected = + intent.hasExtra(EXTRA_COLOR) + ? intent.getIntExtra(EXTRA_COLOR, -1) + : getCurrentSelection(palette); + } + + newColorPickerDialog(items, showNone, selected) .show(getSupportFragmentManager(), FRAG_TAG_COLOR_PICKER); } @@ -71,7 +84,7 @@ public class ColorPickerActivity extends InjectingAppCompatActivity public void themePicked(ColorPickerDialog.Pickable picked) { Intent data = new Intent(); data.putExtra(EXTRA_PALETTE, palette); - data.putExtra(EXTRA_THEME_INDEX, picked == null ? -1 : picked.getIndex()); + data.putExtra(EXTRA_COLOR, picked == null ? -1 : picked.getIndex()); setResult(RESULT_OK, data); finish(); } diff --git a/app/src/main/java/org/tasks/activities/FilterSettingsActivity.java b/app/src/main/java/org/tasks/activities/FilterSettingsActivity.java index 03a234415..ba4c4591f 100644 --- a/app/src/main/java/org/tasks/activities/FilterSettingsActivity.java +++ b/app/src/main/java/org/tasks/activities/FilterSettingsActivity.java @@ -45,7 +45,7 @@ public class FilterSettingsActivity extends BaseListSettingsActivity { super.onCreate(savedInstanceState); if (savedInstanceState == null) { - selectedTheme = filter.tint; + selectedColor = filter.tint; selectedIcon = filter.icon; } @@ -85,7 +85,7 @@ public class FilterSettingsActivity extends BaseListSettingsActivity { if (hasChanges()) { filter.listingTitle = newName; - filter.tint = selectedTheme; + filter.tint = selectedColor; filter.icon = selectedIcon; filterDao.update(filter.toStoreObject()); setResult( @@ -103,7 +103,7 @@ public class FilterSettingsActivity extends BaseListSettingsActivity { @Override protected boolean hasChanges() { return !(getNewName().equals(filter.listingTitle) - && selectedTheme == filter.tint + && selectedColor == filter.tint && selectedIcon == filter.icon); } diff --git a/app/src/main/java/org/tasks/activities/GoogleTaskListSettingsActivity.java b/app/src/main/java/org/tasks/activities/GoogleTaskListSettingsActivity.java index 465bf7719..17c955288 100644 --- a/app/src/main/java/org/tasks/activities/GoogleTaskListSettingsActivity.java +++ b/app/src/main/java/org/tasks/activities/GoogleTaskListSettingsActivity.java @@ -69,7 +69,7 @@ public class GoogleTaskListSettingsActivity extends BaseListSettingsActivity { } if (savedInstanceState == null) { - selectedTheme = gtasksList.getColor(); + selectedColor = gtasksList.getColor(); selectedIcon = gtasksList.getIcon(); } @@ -141,7 +141,7 @@ public class GoogleTaskListSettingsActivity extends BaseListSettingsActivity { renameListViewModel.renameList(gtasksInvoker, gtasksList, newName); } else { if (colorChanged() || iconChanged()) { - gtasksList.setColor(selectedTheme); + gtasksList.setColor(selectedColor); gtasksList.setIcon(selectedIcon); googleTaskListDao.insertOrReplace(gtasksList); setResult( @@ -192,13 +192,13 @@ public class GoogleTaskListSettingsActivity extends BaseListSettingsActivity { @Override protected boolean hasChanges() { if (isNewList) { - return selectedTheme >= 0 || !isEmpty(getNewName()); + return selectedColor >= 0 || !isEmpty(getNewName()); } return colorChanged() || nameChanged() || iconChanged(); } private boolean colorChanged() { - return selectedTheme != gtasksList.getColor(); + return selectedColor != gtasksList.getColor(); } private boolean iconChanged() { @@ -212,7 +212,7 @@ public class GoogleTaskListSettingsActivity extends BaseListSettingsActivity { private void onListCreated(TaskList taskList) { gtasksList.setRemoteId(taskList.getId()); gtasksList.setTitle(taskList.getTitle()); - gtasksList.setColor(selectedTheme); + gtasksList.setColor(selectedColor); gtasksList.setIcon(selectedIcon); gtasksList.setId(googleTaskListDao.insertOrReplace(gtasksList)); setResult( @@ -230,7 +230,7 @@ public class GoogleTaskListSettingsActivity extends BaseListSettingsActivity { private void onListRenamed(TaskList taskList) { gtasksList.setTitle(taskList.getTitle()); - gtasksList.setColor(selectedTheme); + gtasksList.setColor(selectedColor); gtasksList.setIcon(selectedIcon); googleTaskListDao.insertOrReplace(gtasksList); setResult( diff --git a/app/src/main/java/org/tasks/activities/TagSettingsActivity.java b/app/src/main/java/org/tasks/activities/TagSettingsActivity.java index 60ed2ba86..b53344c96 100644 --- a/app/src/main/java/org/tasks/activities/TagSettingsActivity.java +++ b/app/src/main/java/org/tasks/activities/TagSettingsActivity.java @@ -56,7 +56,7 @@ public class TagSettingsActivity extends BaseListSettingsActivity { tagData.setRemoteId(UUIDHelper.newUUID()); } if (savedInstanceState == null) { - selectedTheme = tagData.getColor(); + selectedColor = tagData.getColor(); selectedIcon = tagData.getIcon(); } @@ -120,13 +120,13 @@ public class TagSettingsActivity extends BaseListSettingsActivity { if (isNewTag) { tagData.setName(newName); - tagData.setColor(selectedTheme); + tagData.setColor(selectedColor); tagData.setIcon(selectedIcon); tagDataDao.createNew(tagData); setResult(RESULT_OK, new Intent().putExtra(MainActivity.OPEN_FILTER, new TagFilter(tagData))); } else if (hasChanges()) { tagData.setName(newName); - tagData.setColor(selectedTheme); + tagData.setColor(selectedColor); tagData.setIcon(selectedIcon); tagDataDao.update(tagData); tagDao.rename(tagData.getRemoteId(), newName); @@ -142,9 +142,9 @@ public class TagSettingsActivity extends BaseListSettingsActivity { @Override protected boolean hasChanges() { if (isNewTag) { - return selectedTheme >= 0 || selectedIcon >= 0 || !isEmpty(getNewName()); + return selectedColor >= 0 || selectedIcon >= 0 || !isEmpty(getNewName()); } - return !(selectedTheme == tagData.getColor() + return !(selectedColor == tagData.getColor() && selectedIcon == tagData.getIcon() && getNewName().equals(tagData.getName())); } diff --git a/app/src/main/java/org/tasks/caldav/BaseCaldavCalendarSettingsActivity.java b/app/src/main/java/org/tasks/caldav/BaseCaldavCalendarSettingsActivity.java index b97f1b3d9..56be11e89 100644 --- a/app/src/main/java/org/tasks/caldav/BaseCaldavCalendarSettingsActivity.java +++ b/app/src/main/java/org/tasks/caldav/BaseCaldavCalendarSettingsActivity.java @@ -79,7 +79,7 @@ public abstract class BaseCaldavCalendarSettingsActivity extends BaseListSetting if (savedInstanceState == null) { if (caldavCalendar != null) { name.setText(caldavCalendar.getName()); - selectedTheme = caldavCalendar.getColor(); + selectedColor = caldavCalendar.getColor(); selectedIcon = caldavCalendar.getIcon(); } } @@ -183,7 +183,7 @@ public abstract class BaseCaldavCalendarSettingsActivity extends BaseListSetting caldavCalendar.setAccount(caldavAccount.getUuid()); caldavCalendar.setUrl(url); caldavCalendar.setName(getNewName()); - caldavCalendar.setColor(selectedTheme); + caldavCalendar.setColor(selectedColor); caldavCalendar.setIcon(selectedIcon); caldavDao.insert(caldavCalendar); setResult( @@ -194,7 +194,7 @@ public abstract class BaseCaldavCalendarSettingsActivity extends BaseListSetting private void updateAccount() { caldavCalendar.setName(getNewName()); - caldavCalendar.setColor(selectedTheme); + caldavCalendar.setColor(selectedColor); caldavCalendar.setIcon(selectedIcon); caldavDao.update(caldavCalendar); setResult( @@ -207,11 +207,11 @@ public abstract class BaseCaldavCalendarSettingsActivity extends BaseListSetting @Override protected boolean hasChanges() { if (caldavCalendar == null) { - return !isEmpty(getNewName()) || selectedTheme != -1 || selectedIcon != -1; + return !isEmpty(getNewName()) || selectedColor != -1 || selectedIcon != -1; } return !caldavCalendar.getName().equals(getNewName()) || selectedIcon != caldavCalendar.getIcon() - || selectedTheme != caldavCalendar.getColor(); + || selectedColor != caldavCalendar.getColor(); } private String getNewName() { diff --git a/app/src/main/java/org/tasks/data/GoogleTaskListDao.java b/app/src/main/java/org/tasks/data/GoogleTaskListDao.java index e3865a721..b5d7400c1 100644 --- a/app/src/main/java/org/tasks/data/GoogleTaskListDao.java +++ b/app/src/main/java/org/tasks/data/GoogleTaskListDao.java @@ -59,6 +59,9 @@ public abstract class GoogleTaskListDao { @Update public abstract void update(GoogleTaskAccount account); + @Update + public abstract void update(GoogleTaskList list); + @Query( "SELECT google_task_lists.*, google_task_accounts.*, COUNT(tasks._id) AS count" + " FROM google_task_accounts " diff --git a/app/src/main/java/org/tasks/injection/ActivityModule.java b/app/src/main/java/org/tasks/injection/ActivityModule.java index cada24632..ccda4d137 100644 --- a/app/src/main/java/org/tasks/injection/ActivityModule.java +++ b/app/src/main/java/org/tasks/injection/ActivityModule.java @@ -41,8 +41,8 @@ public class ActivityModule { @Provides @ActivityScope - public ThemeColor getThemeColor(ThemeCache themeCache, Preferences preferences) { - return themeCache.getThemeColor(preferences.getInt(R.string.p_theme_color, 7)); + public ThemeColor getThemeColor(Preferences preferences) { + return ThemeColor.newThemeColor(activity, preferences.getInt(R.string.p_theme_color, 0)); } @Provides diff --git a/app/src/main/java/org/tasks/preferences/fragments/LookAndFeel.kt b/app/src/main/java/org/tasks/preferences/fragments/LookAndFeel.kt index 280d67aed..edba96808 100644 --- a/app/src/main/java/org/tasks/preferences/fragments/LookAndFeel.kt +++ b/app/src/main/java/org/tasks/preferences/fragments/LookAndFeel.kt @@ -9,6 +9,7 @@ import android.os.Bundle import android.os.Handler import android.widget.Toast import androidx.annotation.StringRes +import androidx.core.content.ContextCompat import androidx.preference.ListPreference import androidx.preference.Preference import com.google.common.base.Strings @@ -228,7 +229,7 @@ class LookAndFeel : InjectingPreferenceFragment(), Preference.OnPreferenceChange override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (requestCode == REQUEST_THEME_PICKER) { if (resultCode == RESULT_OK) { - val index = data!!.getIntExtra(ColorPickerActivity.EXTRA_THEME_INDEX, 0) + val index = data!!.getIntExtra(ColorPickerActivity.EXTRA_COLOR, 0) preferences.setInt(R.string.p_theme, index) Handler().post { themeCache.getThemeBase(index).setDefaultNightMode() @@ -237,19 +238,20 @@ class LookAndFeel : InjectingPreferenceFragment(), Preference.OnPreferenceChange } } else if (requestCode == REQUEST_COLOR_PICKER) { if (resultCode == RESULT_OK) { - val index = data!!.getIntExtra(ColorPickerActivity.EXTRA_THEME_INDEX, 0) - preferences.setInt(R.string.p_theme_color, index) + val index = data!!.getIntExtra(ColorPickerActivity.EXTRA_COLOR, 0) + val color = ThemeColor.COLORS[index] + preferences.setInt(R.string.p_theme_color, ContextCompat.getColor(context!!, color)) recreate() } } else if (requestCode == REQUEST_ACCENT_PICKER) { if (resultCode == RESULT_OK) { - val index = data!!.getIntExtra(ColorPickerActivity.EXTRA_THEME_INDEX, 0) + val index = data!!.getIntExtra(ColorPickerActivity.EXTRA_COLOR, 0) preferences.setInt(R.string.p_theme_accent, index) recreate() } } else if (requestCode == REQUEST_LAUNCHER_PICKER) { if (resultCode == RESULT_OK) { - val index = data!!.getIntExtra(ColorPickerActivity.EXTRA_THEME_INDEX, 0) + val index = data!!.getIntExtra(ColorPickerActivity.EXTRA_COLOR, 0) setLauncherIcon(index) preferences.setInt(R.string.p_theme_launcher, index) updateLauncherPreference() @@ -324,7 +326,7 @@ class LookAndFeel : InjectingPreferenceFragment(), Preference.OnPreferenceChange } private fun setupColorPreference( - @StringRes prefId: Int, summary: String, + @StringRes prefId: Int, summary: String?, palette: ColorPickerActivity.ColorPalette, requestCode: Int ) { 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 7daa7b50f..41779a2e4 100644 --- a/app/src/main/java/org/tasks/preferences/fragments/ScrollableWidget.kt +++ b/app/src/main/java/org/tasks/preferences/fragments/ScrollableWidget.kt @@ -82,7 +82,7 @@ class ScrollableWidget : InjectingPreferenceFragment() { ColorPickerActivity.ColorPalette.WIDGET_BACKGROUND ) intent.putExtra( - ColorPickerActivity.EXTRA_THEME_INDEX, widgetPreferences.themeIndex + ColorPickerActivity.EXTRA_COLOR, widgetPreferences.themeIndex ) startActivityForResult(intent, REQUEST_THEME_SELECTION) false @@ -93,9 +93,10 @@ class ScrollableWidget : InjectingPreferenceFragment() { colorPreference.onPreferenceClickListener = Preference.OnPreferenceClickListener { val intent = Intent(context, ColorPickerActivity::class.java) intent.putExtra( - ColorPickerActivity.EXTRA_PALETTE, ColorPickerActivity.ColorPalette.COLORS + ColorPickerActivity.EXTRA_PALETTE, ColorPickerActivity.ColorPalette.COLORS ) - intent.putExtra(ColorPickerActivity.EXTRA_THEME_INDEX, widgetPreferences.colorIndex) + val color = ThemeColor.COLORS[widgetPreferences.colorIndex] + intent.putExtra(ColorPickerActivity.EXTRA_COLOR, color) startActivityForResult(intent, REQUEST_COLOR_SELECTION) false } @@ -117,7 +118,7 @@ class ScrollableWidget : InjectingPreferenceFragment() { if (resultCode == Activity.RESULT_OK) { widgetPreferences.setTheme( data!!.getIntExtra( - ColorPickerActivity.EXTRA_THEME_INDEX, + ColorPickerActivity.EXTRA_COLOR, 0 ) ) @@ -127,7 +128,7 @@ class ScrollableWidget : InjectingPreferenceFragment() { if (resultCode == Activity.RESULT_OK) { widgetPreferences.setColor( data!!.getIntExtra( - ColorPickerActivity.EXTRA_THEME_INDEX, + ColorPickerActivity.EXTRA_COLOR, 0 ) ) diff --git a/app/src/main/java/org/tasks/tags/TagRecyclerAdapter.java b/app/src/main/java/org/tasks/tags/TagRecyclerAdapter.java index e853aafda..4f6648baa 100644 --- a/app/src/main/java/org/tasks/tags/TagRecyclerAdapter.java +++ b/app/src/main/java/org/tasks/tags/TagRecyclerAdapter.java @@ -1,5 +1,7 @@ package org.tasks.tags; +import static org.tasks.themes.ThemeColor.newThemeColor; + import android.content.Context; import android.view.LayoutInflater; import android.view.View; @@ -16,6 +18,7 @@ import org.tasks.data.TagData; import org.tasks.tags.CheckBoxTriStates.State; import org.tasks.themes.CustomIcons; import org.tasks.themes.ThemeCache; +import org.tasks.themes.ThemeColor; public class TagRecyclerAdapter extends RecyclerView.Adapter { @@ -59,9 +62,11 @@ public class TagRecyclerAdapter extends RecyclerView.Adapter= 0 ? tagData.getColor() : 19) - .getPrimaryColor(); + ThemeColor themeColor = + tagData.getColor() > 0 + ? newThemeColor(context, tagData.getColor()) + : themeCache.getThemeColor(19); + return themeColor.getPrimaryColor(); } private @Nullable Integer getIcon(TagData tagData) { diff --git a/app/src/main/java/org/tasks/themes/ThemeColor.java b/app/src/main/java/org/tasks/themes/ThemeColor.java index 17cfa6591..5e18dae02 100644 --- a/app/src/main/java/org/tasks/themes/ThemeColor.java +++ b/app/src/main/java/org/tasks/themes/ThemeColor.java @@ -19,11 +19,13 @@ import android.view.SubMenu; import android.view.View; import androidx.annotation.RequiresApi; import androidx.appcompat.widget.Toolbar; +import androidx.core.content.ContextCompat; import androidx.core.graphics.ColorUtils; import androidx.drawerlayout.widget.DrawerLayout; import com.google.android.material.appbar.CollapsingToolbarLayout; import org.tasks.R; import org.tasks.dialogs.ColorPickerDialog; +import timber.log.Timber; public class ThemeColor implements ColorPickerDialog.Pickable { @@ -75,7 +77,7 @@ public class ThemeColor implements ColorPickerDialog.Pickable { ".Grey" }; - static final int[] COLORS = + public static final int[] COLORS = new int[] { R.color.blue_grey_500, R.color.grey_900, @@ -120,17 +122,17 @@ public class ThemeColor implements ColorPickerDialog.Pickable { private final int colorPrimaryVariant; private final boolean isDark; - public ThemeColor(Context context, int color) { - name = null; - index = -1; - this.color = -1; - colorPrimary = color; - colorPrimaryVariant = ColorUtil.darken(colorPrimary, 12); + public static ThemeColor newThemeColor(Context context, int color) { + try { + return new ThemeColor(context, color); + } catch (Exception e) { + Timber.e(e); + return new ThemeColor(context, 0); + } + } - int whiteText = context.getResources().getColor(R.color.white_100); - double contrast = ColorUtils.calculateContrast(whiteText, colorPrimary); - this.isDark = contrast < 3; - colorOnPrimary = isDark ? context.getResources().getColor(R.color.black_87) : whiteText; + public ThemeColor(Context context, int color) { + this(context, null, -1, color == 0 ? ContextCompat.getColor(context, R.color.blue_500) : color); } public ThemeColor( @@ -140,7 +142,8 @@ public class ThemeColor implements ColorPickerDialog.Pickable { int colorPrimary) { this.name = name; this.index = index; - this.color = COLORS[index]; + this.color = index >= 0 ? COLORS[index] : -1; + colorPrimary |= 0xFF000000; // remove alpha this.colorPrimary = colorPrimary; this.colorPrimaryVariant = ColorUtil.darken(colorPrimary, 12); @@ -320,4 +323,23 @@ public class ThemeColor implements ColorPickerDialog.Pickable { } return drawable; } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof ThemeColor)) { + return false; + } + + ThemeColor that = (ThemeColor) o; + + return colorPrimary == that.colorPrimary; + } + + @Override + public int hashCode() { + return colorPrimary; + } } diff --git a/app/src/main/java/org/tasks/ui/ChipProvider.java b/app/src/main/java/org/tasks/ui/ChipProvider.java index b165ffc68..4217e22e8 100644 --- a/app/src/main/java/org/tasks/ui/ChipProvider.java +++ b/app/src/main/java/org/tasks/ui/ChipProvider.java @@ -6,6 +6,7 @@ import static com.google.common.collect.Iterables.transform; import static com.google.common.collect.Lists.transform; import static com.google.common.collect.Sets.newHashSet; import static com.todoroo.andlib.utility.AndroidUtilities.assertMainThread; +import static org.tasks.themes.ThemeColor.newThemeColor; import android.app.Activity; import android.content.Context; @@ -49,6 +50,7 @@ public class ChipProvider { private final Map googleTaskLists = new HashMap<>(); private final Map caldavCalendars = new HashMap<>(); private final Map tagDatas = new HashMap<>(); + private final Context context; private final Inventory inventory; private final ThemeCache themeCache; private final int iconAlpha; @@ -70,6 +72,7 @@ public class ChipProvider { CaldavDao caldavDao, TagDataDao tagDataDao, LocalBroadcastManager localBroadcastManager) { + this.context = context; this.inventory = inventory; this.themeCache = themeCache; this.localBroadcastManager = localBroadcastManager; @@ -209,8 +212,8 @@ public class ChipProvider { } private ThemeColor getColor(int theme) { - if (theme >= 0) { - ThemeColor color = themeCache.getThemeColor(theme); + if (theme != 0) { + ThemeColor color = newThemeColor(context, theme); if (color.isFree() || inventory.purchasedThemes()) { return color; } diff --git a/app/src/main/java/org/tasks/widget/ShortcutConfigActivity.java b/app/src/main/java/org/tasks/widget/ShortcutConfigActivity.java index bd4206967..e0f4764c3 100644 --- a/app/src/main/java/org/tasks/widget/ShortcutConfigActivity.java +++ b/app/src/main/java/org/tasks/widget/ShortcutConfigActivity.java @@ -91,7 +91,7 @@ public class ShortcutConfigActivity extends InjectingAppCompatActivity { } } else if (requestCode == REQUEST_COLOR_PICKER) { if (resultCode == RESULT_OK) { - selectedTheme = data.getIntExtra(ColorPickerActivity.EXTRA_THEME_INDEX, 0); + selectedTheme = data.getIntExtra(ColorPickerActivity.EXTRA_COLOR, 0); updateTheme(); } } else { @@ -136,7 +136,7 @@ public class ShortcutConfigActivity extends InjectingAppCompatActivity { Intent intent = new Intent(this, ColorPickerActivity.class); intent.putExtra(ColorPickerActivity.EXTRA_PALETTE, ColorPalette.LAUNCHER); intent.putExtra(ColorPickerActivity.EXTRA_SHOW_NONE, false); - intent.putExtra(ColorPickerActivity.EXTRA_THEME_INDEX, selectedTheme); + intent.putExtra(ColorPickerActivity.EXTRA_COLOR, selectedTheme); startActivityForResult(intent, REQUEST_COLOR_PICKER); } @@ -162,7 +162,7 @@ public class ShortcutConfigActivity extends InjectingAppCompatActivity { return selectedTheme; } int index = - selectedFilter == null || selectedFilter.tint == -1 + selectedFilter == null || selectedFilter.tint == 0 ? themeColor.getIndex() : selectedFilter.tint; if (index >= ThemeColor.ICONS.length - 1) {