diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 9c3dbfd73..4418a11b6 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -195,6 +195,7 @@ dependencies {
implementation("com.mapbox.mapboxsdk:mapbox-android-sdk:7.3.0")
implementation("com.mapbox.mapboxsdk:mapbox-sdk-services:4.6.0")
implementation("com.etesync:journalmanager:1.0.4")
+ implementation("com.github.QuadFlask:colorpicker:0.0.15")
googleplayImplementation("com.crashlytics.sdk.android:crashlytics:${Versions.crashlytics}")
googleplayImplementation("com.google.firebase:firebase-analytics:${Versions.firebase}")
diff --git a/app/licenses.yml b/app/licenses.yml
index 722d0b7fa..a28b3eeea 100644
--- a/app/licenses.yml
+++ b/app/licenses.yml
@@ -836,3 +836,8 @@
license: The Apache Software License, Version 2.0
licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
url: https://developer.android.com/topic/libraries/architecture/index.html
+- artifact: com.github.QuadFlask:colorpicker:+
+ name: QuadFlask/colorpicker
+ copyrightHolder: QuadFlask
+ license: The Apache Software License, Version 2.0
+ url: https://github.com/QuadFlask/colorpicker
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index e49bc374b..a161ed39e 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -137,10 +137,6 @@
-
-
diff --git a/app/src/main/assets/licenses.json b/app/src/main/assets/licenses.json
index c3112b9e3..fd9f387a6 100644
--- a/app/src/main/assets/licenses.json
+++ b/app/src/main/assets/licenses.json
@@ -2061,7 +2061,7 @@
"artifactId": {
"name": "databinding-adapters",
"group": "androidx.databinding",
- "version": "3.6.0-rc03"
+ "version": "3.6.0"
}
},
{
@@ -2125,7 +2125,7 @@
"artifactId": {
"name": "databinding-common",
"group": "androidx.databinding",
- "version": "3.6.0-rc03"
+ "version": "3.6.0"
}
},
{
@@ -2141,7 +2141,7 @@
"artifactId": {
"name": "databinding-runtime",
"group": "androidx.databinding",
- "version": "3.6.0-rc03"
+ "version": "3.6.0"
}
},
{
@@ -2173,7 +2173,7 @@
"artifactId": {
"name": "viewbinding",
"group": "androidx.databinding",
- "version": "3.6.0-rc03"
+ "version": "3.6.0"
}
},
{
@@ -2255,6 +2255,22 @@
"group": "androidx.lifecycle",
"version": "1.0.0"
}
+ },
+ {
+ "notice": null,
+ "copyrightHolder": "QuadFlask",
+ "copyrightStatement": "Copyright © QuadFlask. All rights reserved.",
+ "license": "The Apache Software License, Version 2.0",
+ "licenseUrl": "",
+ "normalizedLicense": "apache2",
+ "year": null,
+ "url": "https://github.com/QuadFlask/colorpicker",
+ "libraryName": "QuadFlask/colorpicker",
+ "artifactId": {
+ "name": "colorpicker",
+ "group": "com.github.QuadFlask",
+ "version": "0.0.15"
+ }
}
]
}
\ No newline at end of file
diff --git a/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.java b/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.java
index b0d3c5811..7c7dee532 100644
--- a/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.java
+++ b/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.java
@@ -4,7 +4,6 @@ import static org.tasks.dialogs.IconPickerDialog.newIconPicker;
import static org.tasks.themes.ThemeColor.newThemeColor;
import android.content.DialogInterface;
-import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.os.Bundle;
@@ -20,6 +19,8 @@ import butterknife.ButterKnife;
import butterknife.OnClick;
import javax.inject.Inject;
import org.tasks.R;
+import org.tasks.dialogs.ColorWheelPicker;
+import org.tasks.dialogs.ColorPalettePicker;
import org.tasks.dialogs.DialogBuilder;
import org.tasks.dialogs.IconPickerDialog.IconPickerCallback;
import org.tasks.injection.ThemedInjectingAppCompatActivity;
@@ -27,12 +28,13 @@ import org.tasks.themes.CustomIcons;
import org.tasks.themes.ThemeColor;
public abstract class BaseListSettingsActivity extends ThemedInjectingAppCompatActivity
- implements IconPickerCallback, OnMenuItemClickListener {
+ implements IconPickerCallback, OnMenuItemClickListener, ColorPalettePicker.ColorPickedCallback,
+ ColorWheelPicker.ColorPickedCallback {
private static final String EXTRA_SELECTED_THEME = "extra_selected_theme";
private static final String EXTRA_SELECTED_ICON = "extra_selected_icon";
private static final String FRAG_TAG_ICON_PICKER = "frag_tag_icon_picker";
- private static final int REQUEST_COLOR_PICKER = 10109;
+ private static final String FRAG_TAG_COLOR_PICKER = "frag_tag_color_picker";
@BindView(R.id.color)
ImageView color;
@@ -46,7 +48,7 @@ public abstract class BaseListSettingsActivity extends ThemedInjectingAppCompatA
@Inject ThemeColor themeColor;
@Inject DialogBuilder dialogBuilder;
- protected int selectedColor = -1;
+ protected int selectedColor = 0;
protected int selectedIcon = -1;
@Override
@@ -110,11 +112,8 @@ public abstract class BaseListSettingsActivity extends ThemedInjectingAppCompatA
@OnClick(R.id.color_row)
protected void showThemePicker() {
- 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_COLOR, selectedColor);
- startActivityForResult(intent, REQUEST_COLOR_PICKER);
+ ColorWheelPicker.Companion.newColorWheel(null, 0, selectedColor)
+ .show(getSupportFragmentManager(), FRAG_TAG_COLOR_PICKER);
}
@OnClick(R.id.icon_row)
@@ -130,16 +129,9 @@ public abstract class BaseListSettingsActivity extends ThemedInjectingAppCompatA
}
@Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (requestCode == REQUEST_COLOR_PICKER) {
- if (resultCode == RESULT_OK) {
- int index = data.getIntExtra(ColorPickerActivity.EXTRA_COLOR, -1);
- selectedColor = index < 0 ? 0 : ContextCompat.getColor(this, ThemeColor.COLORS[index]);
- updateTheme();
- }
- } else {
- super.onActivityResult(requestCode, resultCode, data);
- }
+ public void onColorPicked(int color) {
+ selectedColor = color;
+ updateTheme();
}
@Override
diff --git a/app/src/main/java/org/tasks/activities/ColorPickerActivity.java b/app/src/main/java/org/tasks/activities/ColorPickerActivity.java
deleted file mode 100644
index 93f3c1a4c..000000000
--- a/app/src/main/java/org/tasks/activities/ColorPickerActivity.java
+++ /dev/null
@@ -1,119 +0,0 @@
-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;
-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;
-import org.tasks.themes.Theme;
-import org.tasks.themes.ThemeCache;
-
-public class ColorPickerActivity extends InjectingAppCompatActivity
- implements ColorPickerDialog.ThemePickerCallback {
-
- public static final String EXTRA_PALETTE = "extra_palette";
- public static final String EXTRA_SHOW_NONE = "extra_show_none";
- 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;
- @Inject ThemeCache themeCache;
- @Inject Inventory inventory;
- @Inject Preferences preferences;
-
- private ColorPalette palette;
-
- @Override
- protected void onPostResume() {
- super.onPostResume();
-
- Intent intent = getIntent();
- palette = (ColorPalette) intent.getSerializableExtra(EXTRA_PALETTE);
- boolean showNone = intent.getBooleanExtra(EXTRA_SHOW_NONE, false);
- List extends Pickable> 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);
- }
-
- private List extends ColorPickerDialog.Pickable> getItems(ColorPalette palette) {
- switch (palette) {
- case ACCENTS:
- return themeCache.getAccents();
- case COLORS:
- return themeCache.getColors();
- case LAUNCHER:
- return themeCache.getColors().subList(0, themeCache.getColors().size() - 1);
- case WIDGET_BACKGROUND:
- return themeCache.getWidgetThemes();
- default:
- throw new IllegalArgumentException("Unsupported palette: " + palette);
- }
- }
-
- @Override
- public void inject(ActivityComponent component) {
- component.inject(this);
- }
-
- @Override
- public void themePicked(ColorPickerDialog.Pickable picked) {
- Intent data = new Intent();
- data.putExtra(EXTRA_PALETTE, palette);
- data.putExtra(EXTRA_COLOR, picked == null ? -1 : picked.getIndex());
- setResult(RESULT_OK, data);
- finish();
- }
-
- @Override
- public void initiateThemePurchase() {
- newPurchaseDialog().show(getSupportFragmentManager(), FRAG_TAG_PURCHASE);
- }
-
- @Override
- public void dismissed() {
- finish();
- }
-
- private int getCurrentSelection(ColorPalette palette) {
- switch (palette) {
- case COLORS:
- return theme.getThemeColor().getIndex();
- case ACCENTS:
- return theme.getThemeAccent().getIndex();
- case LAUNCHER:
- return preferences.getInt(R.string.p_theme_launcher, 7);
- default:
- return theme.getThemeBase().getIndex();
- }
- }
-
- public enum ColorPalette {
- COLORS,
- ACCENTS,
- LAUNCHER,
- WIDGET_BACKGROUND
- }
-}
diff --git a/app/src/main/java/org/tasks/dialogs/ColorPalettePicker.kt b/app/src/main/java/org/tasks/dialogs/ColorPalettePicker.kt
new file mode 100644
index 000000000..7d69521c7
--- /dev/null
+++ b/app/src/main/java/org/tasks/dialogs/ColorPalettePicker.kt
@@ -0,0 +1,123 @@
+package org.tasks.dialogs
+
+import android.app.Activity
+import android.app.Activity.RESULT_OK
+import android.app.Dialog
+import android.content.DialogInterface
+import android.content.Intent
+import android.os.Bundle
+import android.os.Parcelable
+import android.view.LayoutInflater
+import androidx.fragment.app.Fragment
+import androidx.recyclerview.widget.RecyclerView
+import butterknife.BindView
+import butterknife.ButterKnife
+import org.tasks.Callback
+import org.tasks.R
+import org.tasks.billing.Inventory
+import org.tasks.billing.PurchaseDialog
+import org.tasks.injection.DialogFragmentComponent
+import org.tasks.injection.InjectingDialogFragment
+import org.tasks.themes.ThemeCache
+import org.tasks.themes.ThemeColor
+import javax.inject.Inject
+
+class ColorPalettePicker : InjectingDialogFragment() {
+
+ companion object {
+ private const val FRAG_TAG_PURCHASE = "frag_tag_purchase"
+ private const val EXTRA_PALETTE = "extra_palette"
+ const val EXTRA_SELECTED = ColorWheelPicker.EXTRA_SELECTED
+
+ fun newColorPalette(
+ target: Fragment?,
+ rc: Int,
+ palette: ColorPickerAdapter.Palette
+ ): ColorPalettePicker {
+ val args = Bundle()
+ args.putSerializable(EXTRA_PALETTE, palette)
+ val dialog = ColorPalettePicker()
+ dialog.setTargetFragment(target, rc)
+ dialog.arguments = args
+ return dialog
+ }
+ }
+
+ interface Pickable : Parcelable {
+ val pickerColor: Int
+ val isFree: Boolean
+ val index: Int
+ }
+
+ interface ColorPickedCallback {
+ fun onColorPicked(index: Int)
+ }
+
+ @Inject lateinit var dialogBuilder: DialogBuilder
+ @Inject lateinit var inventory: Inventory
+ @Inject lateinit var themeCache: ThemeCache
+
+ @BindView(R.id.icons) lateinit var recyclerView: RecyclerView
+
+ lateinit var colors: List
+ lateinit var palette: ColorPickerAdapter.Palette
+ var callback: ColorPickedCallback? = null
+
+ override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+ val inflater = LayoutInflater.from(context)
+ val view = inflater.inflate(R.layout.dialog_icon_picker, null)
+ ButterKnife.bind(this, view)
+ palette = arguments!!.getSerializable(EXTRA_PALETTE) as ColorPickerAdapter.Palette
+ colors = when (palette) {
+ ColorPickerAdapter.Palette.COLORS -> themeCache.colors
+ ColorPickerAdapter.Palette.ACCENTS -> themeCache.accents
+ ColorPickerAdapter.Palette.LAUNCHERS -> themeCache.colors.dropLast(1)
+ ColorPickerAdapter.Palette.WIDGET_BACKGROUND -> themeCache.widgetThemes
+ }
+
+ val iconPickerAdapter = ColorPickerAdapter(
+ context as Activity,
+ inventory,
+ Callback { index: Int -> onSelected(index) })
+ recyclerView.layoutManager = IconLayoutManager(context)
+ recyclerView.adapter = iconPickerAdapter
+ iconPickerAdapter.submitList(colors)
+ val builder =
+ dialogBuilder
+ .newDialog()
+ .setView(view)
+ if (inventory.hasPro()) {
+ builder.setNegativeButton(android.R.string.cancel, null)
+ } else {
+ builder.setPositiveButton(R.string.button_subscribe) { _: DialogInterface?, _: Int ->
+ PurchaseDialog.newPurchaseDialog().show(parentFragmentManager, FRAG_TAG_PURCHASE)
+ }
+ }
+ return builder.show()
+ }
+
+ override fun onAttach(activity: Activity) {
+ super.onAttach(activity)
+
+ if (activity is ColorPickedCallback) {
+ callback = activity
+ }
+ }
+
+ private fun onSelected(index: Int) {
+ val result = when (palette) {
+ ColorPickerAdapter.Palette.COLORS ->
+ (colors.find { it.index == index } as ThemeColor).primaryColor
+ else -> index
+ }
+ dialog?.dismiss()
+ if (targetFragment == null) {
+ callback?.onColorPicked(result)
+ } else {
+ val data = Intent().putExtra(EXTRA_SELECTED, result)
+ targetFragment?.onActivityResult(targetRequestCode, RESULT_OK, data)
+ }
+ }
+
+ override fun inject(component: DialogFragmentComponent) = component.inject(this)
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/tasks/dialogs/ColorPickerAdapter.kt b/app/src/main/java/org/tasks/dialogs/ColorPickerAdapter.kt
new file mode 100644
index 000000000..fc66b3dad
--- /dev/null
+++ b/app/src/main/java/org/tasks/dialogs/ColorPickerAdapter.kt
@@ -0,0 +1,56 @@
+package org.tasks.dialogs
+
+import android.app.Activity
+import android.view.ViewGroup
+import androidx.recyclerview.widget.DiffUtil
+import androidx.recyclerview.widget.ListAdapter
+import org.tasks.Callback
+import org.tasks.R
+import org.tasks.billing.Inventory
+
+class ColorPickerAdapter(
+ private val activity: Activity,
+ private val inventory: Inventory,
+ private val onSelected: Callback
+) : ListAdapter(DiffCallback()) {
+
+ enum class Palette {
+ COLORS,
+ ACCENTS,
+ LAUNCHERS,
+ WIDGET_BACKGROUND
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): IconPickerHolder {
+ val view = activity.layoutInflater.inflate(R.layout.dialog_icon_picker_cell, parent, false)
+ return IconPickerHolder(activity, view, onSelected)
+ }
+
+ override fun onBindViewHolder(holder: IconPickerHolder, position: Int) {
+ val pickable = getItem(position)
+ val available = inventory.hasPro() || pickable.isFree
+ holder.bind(
+ pickable.index,
+ if (available) R.drawable.color_picker else R.drawable.ic_outline_vpn_key_24px,
+ pickable.pickerColor,
+ 1f,
+ available
+ )
+ }
+
+ private class DiffCallback : DiffUtil.ItemCallback() {
+ override fun areItemsTheSame(
+ oldItem: ColorPalettePicker.Pickable,
+ newItem: ColorPalettePicker.Pickable
+ ): Boolean {
+ return oldItem == newItem
+ }
+
+ override fun areContentsTheSame(
+ oldItem: ColorPalettePicker.Pickable,
+ newItem: ColorPalettePicker.Pickable
+ ): Boolean {
+ return oldItem.index == newItem.index
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/tasks/dialogs/ColorPickerDialog.java b/app/src/main/java/org/tasks/dialogs/ColorPickerDialog.java
deleted file mode 100644
index 70a832284..000000000
--- a/app/src/main/java/org/tasks/dialogs/ColorPickerDialog.java
+++ /dev/null
@@ -1,147 +0,0 @@
-package org.tasks.dialogs;
-
-import static androidx.core.content.ContextCompat.getColor;
-import static com.google.common.collect.Lists.transform;
-
-import android.app.Activity;
-import android.app.Dialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.os.Bundle;
-import android.os.Parcelable;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import java.util.ArrayList;
-import java.util.List;
-import javax.inject.Inject;
-import org.tasks.R;
-import org.tasks.billing.Inventory;
-import org.tasks.injection.DialogFragmentComponent;
-import org.tasks.injection.ForActivity;
-import org.tasks.injection.InjectingDialogFragment;
-import org.tasks.preferences.Preferences;
-import org.tasks.themes.Theme;
-import org.tasks.ui.SingleCheckedArrayAdapter;
-
-public class ColorPickerDialog extends InjectingDialogFragment {
-
- private static final String EXTRA_ITEMS = "extra_items";
- private static final String EXTRA_SELECTED = "extra_selected";
- private static final String EXTRA_SHOW_NONE = "extra_show_none";
- @Inject DialogBuilder dialogBuilder;
- @Inject @ForActivity Context context;
- @Inject Preferences preferences;
- @Inject Theme theme;
- @Inject Inventory inventory;
- private ThemePickerCallback callback;
- private SingleCheckedArrayAdapter adapter;
- private Dialog dialog;
-
- public static ColorPickerDialog newColorPickerDialog(
- List extends Pickable> items, boolean showNone, int selection) {
- ColorPickerDialog dialog = new ColorPickerDialog();
- Bundle args = new Bundle();
- args.putParcelableArrayList(EXTRA_ITEMS, new ArrayList(items));
- args.putInt(EXTRA_SELECTED, selection);
- args.putBoolean(EXTRA_SHOW_NONE, showNone);
- dialog.setArguments(args);
- return dialog;
- }
-
- @Override
- public void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setRetainInstance(true);
- Bundle arguments = getArguments();
- final List items = arguments.getParcelableArrayList(EXTRA_ITEMS);
- boolean showNone = arguments.getBoolean(EXTRA_SHOW_NONE);
- int selected = arguments.getInt(EXTRA_SELECTED, -1);
-
- adapter =
- new SingleCheckedArrayAdapter(
- context, transform(items, Pickable::getName), theme.getThemeAccent()) {
- @Override
- protected int getDrawable(int position) {
- return inventory.purchasedThemes() || items.get(position).isFree()
- ? R.drawable.ic_baseline_lens_24px
- : R.drawable.ic_outline_vpn_key_24px;
- }
-
- @Override
- protected int getDrawableColor(int position) {
- int pickerColor = items.get(position).getPickerColor();
- return pickerColor == -1 ? getColor(context, R.color.grey_50) : pickerColor;
- }
- };
-
- AlertDialogBuilder builder =
- dialogBuilder
- .newDialog()
- .setSingleChoiceItems(
- adapter,
- selected,
- (dialog, which) -> {
- Pickable picked = items.get(which);
- if (inventory.purchasedThemes() || picked.isFree()) {
- callback.themePicked(picked);
- } else {
- callback.initiateThemePurchase();
- }
- })
- .setOnDismissListener(dialogInterface -> callback.dismissed());
- if (showNone) {
- builder.setNeutralButton(R.string.none, (dialogInterface, i) -> callback.themePicked(null));
- }
- dialog = builder.create();
- }
-
- @NonNull
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- return dialog;
- }
-
- @Override
- public void onResume() {
- super.onResume();
-
- adapter.notifyDataSetChanged();
- }
-
- @Override
- public void onCancel(DialogInterface dialog) {
- callback.dismissed();
- }
-
- @Override
- public void onAttach(Activity activity) {
- super.onAttach(activity);
-
- callback = (ThemePickerCallback) activity;
- }
-
- @Override
- protected void inject(DialogFragmentComponent component) {
- component.inject(this);
- }
-
- public interface Pickable extends Parcelable {
-
- String getName();
-
- int getPickerColor();
-
- boolean isFree();
-
- int getIndex();
- }
-
- public interface ThemePickerCallback {
-
- void themePicked(Pickable pickable);
-
- void initiateThemePurchase();
-
- void dismissed();
- }
-}
diff --git a/app/src/main/java/org/tasks/dialogs/ColorWheelPicker.kt b/app/src/main/java/org/tasks/dialogs/ColorWheelPicker.kt
new file mode 100644
index 000000000..ad3fc6c88
--- /dev/null
+++ b/app/src/main/java/org/tasks/dialogs/ColorWheelPicker.kt
@@ -0,0 +1,126 @@
+package org.tasks.dialogs
+
+import android.app.Activity
+import android.app.Activity.RESULT_CANCELED
+import android.app.Activity.RESULT_OK
+import android.app.Dialog
+import android.content.DialogInterface
+import android.content.Intent
+import android.os.Bundle
+import androidx.appcompat.app.AlertDialog
+import androidx.fragment.app.Fragment
+import com.flask.colorpicker.ColorPickerView
+import com.flask.colorpicker.builder.ColorPickerDialogBuilder
+import org.tasks.R
+import org.tasks.billing.Inventory
+import org.tasks.billing.PurchaseActivity
+import org.tasks.dialogs.ColorPalettePicker.Companion.newColorPalette
+import org.tasks.injection.DialogFragmentComponent
+import org.tasks.injection.InjectingDialogFragment
+import org.tasks.ui.NavigationDrawerFragment.REQUEST_PURCHASE
+import javax.inject.Inject
+
+private const val REQUEST_PURCHASE = 10010
+
+class ColorWheelPicker : InjectingDialogFragment() {
+
+ companion object {
+ private const val FRAG_TAG_COLOR_PICKER = "frag_tag_color_picker"
+ const val EXTRA_SELECTED = "extra_selected"
+
+ fun newColorWheel(target: Fragment?, rc: Int, selected: Int): ColorWheelPicker {
+ val args = Bundle()
+ args.putInt(EXTRA_SELECTED, selected)
+ val dialog = ColorWheelPicker()
+ dialog.setTargetFragment(target, rc)
+ dialog.arguments = args
+ return dialog
+ }
+ }
+
+ interface ColorPickedCallback {
+ fun onColorPicked(color: Int)
+ }
+
+ @Inject lateinit var inventory: Inventory
+
+ var dialog: AlertDialog? = null
+ var selected = -1
+ var callback: ColorPickedCallback? = null
+
+ override fun inject(component: DialogFragmentComponent) = component.inject(this)
+
+ override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+ selected = savedInstanceState?.getInt(EXTRA_SELECTED) ?: arguments!!.getInt(EXTRA_SELECTED, 0)
+
+ val button = if (inventory.hasPro()) android.R.string.ok else R.string.button_subscribe
+ val builder = ColorPickerDialogBuilder
+ .with(activity)
+ .wheelType(ColorPickerView.WHEEL_TYPE.CIRCLE)
+ .density(7)
+ .setOnColorChangedListener { which ->
+ selected = which
+ }
+ .setOnColorSelectedListener { which ->
+ selected = which
+ }
+ .lightnessSliderOnly()
+ .setPositiveButton(button) { _, _, _ ->
+ if (inventory.hasPro()) {
+ deliverSelection()
+ } else {
+ startActivityForResult(Intent(activity, PurchaseActivity::class.java), REQUEST_PURCHASE)
+ }
+ }
+ if (selected != 0) {
+ builder.initialColor(selected)
+ }
+ val buttonText = if (inventory.hasPro()) R.string.material_palette else R.string.free_colors
+ builder.setNegativeButton(buttonText) { _, _ ->
+ newColorPalette(targetFragment, targetRequestCode, ColorPickerAdapter.Palette.COLORS)
+ .show(parentFragmentManager, FRAG_TAG_COLOR_PICKER)
+ }
+ dialog = builder.build()
+ return dialog as Dialog
+ }
+
+ override fun onAttach(activity: Activity) {
+ super.onAttach(activity)
+
+ if (activity is ColorPickedCallback) {
+ callback = activity
+ }
+ }
+
+ override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+ if (requestCode == org.tasks.dialogs.REQUEST_PURCHASE) {
+ if (inventory.hasPro()) {
+ deliverSelection()
+ } else {
+ dialog?.cancel()
+ }
+ } else {
+ super.onActivityResult(requestCode, resultCode, data)
+ }
+ }
+
+ private fun deliverSelection() {
+ dialog?.dismiss()
+ if (targetFragment == null) {
+ callback?.onColorPicked(selected)
+ } else {
+ val data = Intent().putExtra(EXTRA_SELECTED, selected)
+ targetFragment?.onActivityResult(targetRequestCode, RESULT_OK, data)
+ }
+ }
+
+ override fun onCancel(dialog: DialogInterface) {
+ targetFragment?.onActivityResult(targetRequestCode, RESULT_CANCELED, null)
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+
+ outState.putInt(EXTRA_SELECTED, selected)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/tasks/dialogs/IconPickerAdapter.java b/app/src/main/java/org/tasks/dialogs/IconPickerAdapter.java
index 3d646ace1..eef44982a 100644
--- a/app/src/main/java/org/tasks/dialogs/IconPickerAdapter.java
+++ b/app/src/main/java/org/tasks/dialogs/IconPickerAdapter.java
@@ -1,8 +1,12 @@
package org.tasks.dialogs;
+import static org.tasks.preferences.ResourceResolver.getData;
+
import android.app.Activity;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
+import androidx.core.content.ContextCompat;
+import androidx.core.content.res.ResourcesCompat;
import androidx.recyclerview.widget.DiffUtil.ItemCallback;
import androidx.recyclerview.widget.ListAdapter;
import org.tasks.Callback;
@@ -31,7 +35,6 @@ public class IconPickerAdapter extends ListAdapter {
public IconPickerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new IconPickerHolder(
activity,
- inventory,
activity.getLayoutInflater().inflate(R.layout.dialog_icon_picker_cell, parent, false),
onSelected);
}
@@ -41,7 +44,15 @@ public class IconPickerAdapter extends ListAdapter {
int index = CustomIcons.getIndex(position);
Integer icon = CustomIcons.getIconResId(index);
if (icon != null) {
- holder.bind(index, icon, index == current);
+ int tint = index == current
+ ? getData(activity, R.attr.colorAccent)
+ : ContextCompat.getColor(activity, R.color.icon_tint);
+ boolean available = index < 1000 || inventory.hasPro();
+ float alpha =
+ available
+ ? 1f
+ : ResourcesCompat.getFloat(activity.getResources(), R.dimen.alpha_disabled);
+ holder.bind(index, icon, tint, alpha, available);
}
}
diff --git a/app/src/main/java/org/tasks/dialogs/IconPickerHolder.java b/app/src/main/java/org/tasks/dialogs/IconPickerHolder.java
index 864cfd93e..84101361d 100644
--- a/app/src/main/java/org/tasks/dialogs/IconPickerHolder.java
+++ b/app/src/main/java/org/tasks/dialogs/IconPickerHolder.java
@@ -1,14 +1,12 @@
package org.tasks.dialogs;
-import static org.tasks.preferences.ResourceResolver.getData;
-
import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.LayerDrawable;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.AppCompatImageView;
-import androidx.core.content.ContextCompat;
-import androidx.core.content.res.ResourcesCompat;
import androidx.core.graphics.drawable.DrawableCompat;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
@@ -16,23 +14,20 @@ import butterknife.ButterKnife;
import butterknife.OnClick;
import org.tasks.Callback;
import org.tasks.R;
-import org.tasks.billing.Inventory;
public class IconPickerHolder extends RecyclerView.ViewHolder {
private final Context context;
private final Callback onClick;
- private final Inventory inventory;
@BindView(R.id.icon)
AppCompatImageView imageView;
private int index;
+ private boolean isEnabled;
- IconPickerHolder(
- Context context, Inventory inventory, @NonNull View view, Callback onClick) {
+ IconPickerHolder(Context context, @NonNull View view, Callback onClick) {
super(view);
- this.inventory = inventory;
ButterKnife.bind(this, view);
@@ -42,32 +37,21 @@ public class IconPickerHolder extends RecyclerView.ViewHolder {
@OnClick(R.id.icon)
void onClick() {
- if (isEnabled()) {
+ if (isEnabled) {
onClick.call(index);
} else {
Toast.makeText(context, R.string.requires_pro_subscription, Toast.LENGTH_SHORT).show();
}
}
- public void bind(int index, int icon, boolean selected) {
+ public void bind(int index, int icon, int tint, float alpha, boolean isEnabled) {
this.index = index;
+ this.isEnabled = isEnabled;
imageView.setImageResource(icon);
- if (inventory.hasPro()) {
- imageView.setAlpha(ResourcesCompat.getFloat(context.getResources(), R.dimen.alpha_secondary));
- } else {
- imageView.setAlpha(
- index < 1000
- ? 1.0f
- : ResourcesCompat.getFloat(context.getResources(), R.dimen.alpha_disabled));
- }
+ imageView.setAlpha(alpha);
+ Drawable drawable = imageView.getDrawable();
DrawableCompat.setTint(
- imageView.getDrawable(),
- selected
- ? getData(context, R.attr.colorAccent)
- : ContextCompat.getColor(context, R.color.icon_tint));
- }
-
- private boolean isEnabled() {
- return index < 1000 || inventory.hasPro();
+ drawable instanceof LayerDrawable ? ((LayerDrawable) drawable).getDrawable(0) : drawable,
+ tint);
}
}
diff --git a/app/src/main/java/org/tasks/injection/ActivityComponent.java b/app/src/main/java/org/tasks/injection/ActivityComponent.java
index e4fa92167..81fb31645 100644
--- a/app/src/main/java/org/tasks/injection/ActivityComponent.java
+++ b/app/src/main/java/org/tasks/injection/ActivityComponent.java
@@ -1,6 +1,5 @@
package org.tasks.injection;
-import androidx.annotation.NonNull;
import com.todoroo.astrid.activity.BeastModePreferences;
import com.todoroo.astrid.activity.MainActivity;
import com.todoroo.astrid.activity.ShareLinkActivity;
@@ -11,7 +10,6 @@ import com.todoroo.astrid.gtasks.auth.GtasksLoginActivity;
import dagger.Subcomponent;
import org.tasks.activities.CalendarSelectionActivity;
import org.tasks.activities.CameraActivity;
-import org.tasks.activities.ColorPickerActivity;
import org.tasks.activities.DateAndTimePickerActivity;
import org.tasks.activities.DatePickerActivity;
import org.tasks.activities.FilterSelectionActivity;
@@ -99,14 +97,12 @@ public interface ActivityComponent {
void inject(VoiceCommandActivity voiceCommandActivity);
- void inject(@NonNull WidgetConfigActivity widgetConfigActivity);
+ void inject(WidgetConfigActivity widgetConfigActivity);
void inject(ShortcutConfigActivity shortcutConfigActivity);
void inject(MyFilePickerActivity myFilePickerActivity);
- void inject(ColorPickerActivity colorPickerActivity);
-
void inject(GoogleTaskListSettingsActivity googleTaskListSettingsActivity);
void inject(CaldavCalendarSettingsActivity caldavCalendarSettingsActivity);
@@ -141,11 +137,11 @@ public interface ActivityComponent {
void inject(MainPreferences mainPreferences);
- void inject(@NonNull HelpAndFeedback helpAndFeedback);
+ void inject(HelpAndFeedback helpAndFeedback);
- void inject(@NonNull NotificationPreferences notificationPreferences);
+ void inject(NotificationPreferences notificationPreferences);
- void inject(@NonNull ManageSpaceActivity manageSpaceActivity);
+ void inject(ManageSpaceActivity manageSpaceActivity);
- void inject(@NonNull SyncPreferences syncPreferences);
+ void inject(SyncPreferences syncPreferences);
}
diff --git a/app/src/main/java/org/tasks/injection/DialogFragmentComponent.java b/app/src/main/java/org/tasks/injection/DialogFragmentComponent.java
index eebc414db..c88337d74 100644
--- a/app/src/main/java/org/tasks/injection/DialogFragmentComponent.java
+++ b/app/src/main/java/org/tasks/injection/DialogFragmentComponent.java
@@ -6,7 +6,8 @@ import org.tasks.activities.RemoteListPicker;
import org.tasks.billing.NameYourPriceDialog;
import org.tasks.billing.PurchaseDialog;
import org.tasks.dialogs.AddAttachmentDialog;
-import org.tasks.dialogs.ColorPickerDialog;
+import org.tasks.dialogs.ColorWheelPicker;
+import org.tasks.dialogs.ColorPalettePicker;
import org.tasks.dialogs.ExportTasksDialog;
import org.tasks.dialogs.GeofenceDialog;
import org.tasks.dialogs.IconPickerDialog;
@@ -36,8 +37,6 @@ public interface DialogFragmentComponent {
void inject(SortDialog sortDialog);
- void inject(ColorPickerDialog colorPickerDialog);
-
void inject(RecordAudioDialog recordAudioDialog);
void inject(CustomRecurrenceDialog customRecurrenceDialog);
@@ -61,4 +60,8 @@ public interface DialogFragmentComponent {
void inject(LocalePickerDialog localePickerDialog);
void inject(ThemePickerDialog themePickerDialog);
+
+ void inject(ColorWheelPicker colorWheelPicker);
+
+ void inject(ColorPalettePicker colorPalettePicker);
}
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 fd91697f5..861007789 100644
--- a/app/src/main/java/org/tasks/preferences/fragments/LookAndFeel.kt
+++ b/app/src/main/java/org/tasks/preferences/fragments/LookAndFeel.kt
@@ -9,8 +9,6 @@ import android.os.Bundle
import android.os.Handler
import android.widget.Toast
import androidx.annotation.StringRes
-import androidx.core.content.ContextCompat
-import androidx.core.graphics.drawable.DrawableCompat
import androidx.preference.ListPreference
import androidx.preference.Preference
import com.google.common.base.Strings
@@ -20,12 +18,15 @@ import com.todoroo.astrid.api.Filter
import org.tasks.BuildConfig
import org.tasks.LocalBroadcastManager
import org.tasks.R
-import org.tasks.activities.ColorPickerActivity
-import org.tasks.activities.ColorPickerActivity.ColorPalette.*
import org.tasks.activities.FilterSelectionActivity
import org.tasks.activities.TimePickerActivity
import org.tasks.billing.Inventory
import org.tasks.billing.PurchaseActivity
+import org.tasks.dialogs.ColorWheelPicker
+import org.tasks.dialogs.ColorWheelPicker.Companion.newColorWheel
+import org.tasks.dialogs.ColorPalettePicker
+import org.tasks.dialogs.ColorPalettePicker.Companion.newColorPalette
+import org.tasks.dialogs.ColorPickerAdapter
import org.tasks.dialogs.ThemePickerDialog
import org.tasks.dialogs.ThemePickerDialog.Companion.newThemePickerDialog
import org.tasks.gtasks.PlayServices
@@ -61,6 +62,7 @@ private const val REQUEST_EVENING = 10009
private const val REQUEST_NIGHT = 10010
private const val FRAG_TAG_LOCALE_PICKER = "frag_tag_locale_picker"
private const val FRAG_TAG_THEME_PICKER = "frag_tag_theme_picker"
+private const val FRAG_TAG_COLOR_PICKER = "frag_tag_color_picker"
class LookAndFeel : InjectingPreferenceFragment(), Preference.OnPreferenceChangeListener {
@@ -89,7 +91,7 @@ class LookAndFeel : InjectingPreferenceFragment(), Preference.OnPreferenceChange
themePref.summary = themeBase.name
themePref.setOnPreferenceClickListener {
newThemePickerDialog(this, REQUEST_THEME_PICKER, themeBase.index)
- .show(parentFragmentManager, FRAG_TAG_THEME_PICKER)
+ .show(parentFragmentManager, FRAG_TAG_THEME_PICKER)
false
}
@@ -140,12 +142,17 @@ class LookAndFeel : InjectingPreferenceFragment(), Preference.OnPreferenceChange
override fun onResume() {
super.onResume()
- setupColorPreference(R.string.p_theme_color, themeColor.pickerColor, COLORS, REQUEST_COLOR_PICKER)
setupColorPreference(
- R.string.p_theme_accent,
- themeAccent.pickerColor,
- ACCENTS,
- REQUEST_ACCENT_PICKER
+ R.string.p_theme_color,
+ themeColor.pickerColor,
+ ColorPickerAdapter.Palette.COLORS,
+ REQUEST_COLOR_PICKER
+ )
+ setupColorPreference(
+ R.string.p_theme_accent,
+ themeAccent.pickerColor,
+ ColorPickerAdapter.Palette.ACCENTS,
+ REQUEST_ACCENT_PICKER
)
updateLauncherPreference()
@@ -158,7 +165,10 @@ class LookAndFeel : InjectingPreferenceFragment(), Preference.OnPreferenceChange
private fun updateLauncherPreference() {
val launcher = themeCache.getThemeColor(preferences.getInt(R.string.p_theme_launcher, 7))
setupColorPreference(
- R.string.p_theme_launcher, launcher.pickerColor, LAUNCHER, REQUEST_LAUNCHER_PICKER
+ R.string.p_theme_launcher,
+ launcher.pickerColor,
+ ColorPickerAdapter.Palette.LAUNCHERS,
+ REQUEST_LAUNCHER_PICKER
)
}
@@ -254,39 +264,49 @@ class LookAndFeel : InjectingPreferenceFragment(), Preference.OnPreferenceChange
if (requestCode == REQUEST_PURCHASE) {
val index = if (inventory.hasPro()) {
data?.getIntExtra(ThemePickerDialog.EXTRA_SELECTED, themeBase.index)
- ?: themeBase.index
+ ?: themeBase.index
} else {
preferences.getInt(R.string.p_theme, 0)
}
setBaseTheme(index)
} else if (requestCode == REQUEST_THEME_PICKER) {
val index = data?.getIntExtra(ThemePickerDialog.EXTRA_SELECTED, themeBase.index)
- ?: preferences.getInt(R.string.p_theme, 0)
+ ?: preferences.getInt(R.string.p_theme, 0)
if (resultCode == RESULT_OK) {
if (inventory.hasPro() || index < 2) {
setBaseTheme(index)
} else {
- startActivityForResult(Intent(context, PurchaseActivity::class.java), REQUEST_PURCHASE)
+ startActivityForResult(
+ Intent(context, PurchaseActivity::class.java),
+ REQUEST_PURCHASE
+ )
}
} else {
setBaseTheme(index)
}
} else if (requestCode == REQUEST_COLOR_PICKER) {
if (resultCode == RESULT_OK) {
- 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()
+ val color = data?.getIntExtra(
+ ColorWheelPicker.EXTRA_SELECTED,
+ themeColor.primaryColor
+ )
+ ?: themeColor.primaryColor
+ if (preferences.getInt(R.string.p_theme_color, -1) != color) {
+ preferences.setInt(R.string.p_theme_color, color)
+ recreate()
+ }
}
} else if (requestCode == REQUEST_ACCENT_PICKER) {
if (resultCode == RESULT_OK) {
- val index = data!!.getIntExtra(ColorPickerActivity.EXTRA_COLOR, 0)
- preferences.setInt(R.string.p_theme_accent, index)
- recreate()
+ val index = data!!.getIntExtra(ColorPalettePicker.EXTRA_SELECTED, 0)
+ if (preferences.getInt(R.string.p_theme_accent, -1) != index) {
+ 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_COLOR, 0)
+ val index = data!!.getIntExtra(ColorPalettePicker.EXTRA_SELECTED, 0)
setLauncherIcon(index)
preferences.setInt(R.string.p_theme_launcher, index)
updateLauncherPreference()
@@ -361,15 +381,20 @@ class LookAndFeel : InjectingPreferenceFragment(), Preference.OnPreferenceChange
}
private fun setupColorPreference(
- @StringRes prefId: Int, color: Int,
- palette: ColorPickerActivity.ColorPalette,
- requestCode: Int
+ @StringRes prefId: Int,
+ color: Int,
+ palette: ColorPickerAdapter.Palette,
+ requestCode: Int
) {
tintIcon(prefId, color)
findPreference(prefId).setOnPreferenceClickListener {
- val intent = Intent(context, ColorPickerActivity::class.java)
- intent.putExtra(ColorPickerActivity.EXTRA_PALETTE, palette)
- startActivityForResult(intent, requestCode)
+ if (palette == ColorPickerAdapter.Palette.COLORS) {
+ newColorWheel(this, requestCode, color)
+ .show(parentFragmentManager, FRAG_TAG_COLOR_PICKER)
+ } else {
+ newColorPalette(this, requestCode, palette)
+ .show(parentFragmentManager, FRAG_TAG_COLOR_PICKER)
+ }
false
}
}
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 41779a2e4..5a4fdc5e8 100644
--- a/app/src/main/java/org/tasks/preferences/fragments/ScrollableWidget.kt
+++ b/app/src/main/java/org/tasks/preferences/fragments/ScrollableWidget.kt
@@ -10,15 +10,18 @@ import androidx.preference.SwitchPreferenceCompat
import com.todoroo.astrid.api.Filter
import org.tasks.LocalBroadcastManager
import org.tasks.R
-import org.tasks.activities.ColorPickerActivity
import org.tasks.activities.FilterSelectionActivity
+import org.tasks.dialogs.ColorWheelPicker
+import org.tasks.dialogs.ColorWheelPicker.Companion.newColorWheel
+import org.tasks.dialogs.ColorPalettePicker
+import org.tasks.dialogs.ColorPalettePicker.Companion.newColorPalette
+import org.tasks.dialogs.ColorPickerAdapter
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.ThemeColor
import org.tasks.themes.WidgetTheme
import org.tasks.widget.TasksWidget
import org.tasks.widget.WidgetPreferences
@@ -33,6 +36,8 @@ const val EXTRA_WIDGET_ID = "extra_widget_id"
class ScrollableWidget : InjectingPreferenceFragment() {
companion object {
+ private const val FRAG_TAG_COLOR_PICKER = "frag_tag_color_picker"
+
fun newScrollableWidget(appWidgetId: Int): ScrollableWidget {
val widget = ScrollableWidget()
val args = Bundle()
@@ -76,28 +81,16 @@ class ScrollableWidget : InjectingPreferenceFragment() {
findPreference(R.string.p_widget_theme)
.setOnPreferenceClickListener {
- val intent = Intent(context, ColorPickerActivity::class.java)
- intent.putExtra(
- ColorPickerActivity.EXTRA_PALETTE,
- ColorPickerActivity.ColorPalette.WIDGET_BACKGROUND
- )
- intent.putExtra(
- ColorPickerActivity.EXTRA_COLOR, widgetPreferences.themeIndex
- )
- startActivityForResult(intent, REQUEST_THEME_SELECTION)
+ newColorPalette(this, REQUEST_THEME_SELECTION, ColorPickerAdapter.Palette.WIDGET_BACKGROUND)
+ .show(parentFragmentManager, FRAG_TAG_COLOR_PICKER)
false
}
- val colorPreference = findPreference(R.string.p_widget_color)
+ val colorPreference = findPreference(R.string.p_widget_color_v2)
colorPreference.dependency = showHeader.key
colorPreference.onPreferenceClickListener = Preference.OnPreferenceClickListener {
- val intent = Intent(context, ColorPickerActivity::class.java)
- intent.putExtra(
- ColorPickerActivity.EXTRA_PALETTE, ColorPickerActivity.ColorPalette.COLORS
- )
- val color = ThemeColor.COLORS[widgetPreferences.colorIndex]
- intent.putExtra(ColorPickerActivity.EXTRA_COLOR, color)
- startActivityForResult(intent, REQUEST_COLOR_SELECTION)
+ newColorWheel(this, REQUEST_COLOR_SELECTION, widgetPreferences.color)
+ .show(parentFragmentManager, FRAG_TAG_COLOR_PICKER)
false
}
@@ -117,20 +110,18 @@ class ScrollableWidget : InjectingPreferenceFragment() {
} else if (requestCode == REQUEST_THEME_SELECTION) {
if (resultCode == Activity.RESULT_OK) {
widgetPreferences.setTheme(
- data!!.getIntExtra(
- ColorPickerActivity.EXTRA_COLOR,
+ data?.getIntExtra(
+ ColorPalettePicker.EXTRA_SELECTED,
0
- )
+ ) ?: widgetPreferences.themeIndex
)
updateTheme()
}
} else if (requestCode == REQUEST_COLOR_SELECTION) {
if (resultCode == Activity.RESULT_OK) {
- widgetPreferences.setColor(
- data!!.getIntExtra(
- ColorPickerActivity.EXTRA_COLOR,
- 0
- )
+ widgetPreferences.color = data!!.getIntExtra(
+ ColorWheelPicker.EXTRA_SELECTED,
+ 0
)
updateColor()
}
@@ -156,8 +147,7 @@ class ScrollableWidget : InjectingPreferenceFragment() {
}
private fun updateColor() {
- val themeColor: ThemeColor = themeCache.getThemeColor(widgetPreferences.colorIndex)
- findPreference(R.string.p_widget_color).summary = themeColor.name
+ tintIcon(R.string.p_widget_color_v2, widgetPreferences.color)
}
private fun updateFilter() {
diff --git a/app/src/main/java/org/tasks/themes/ColorUtil.java b/app/src/main/java/org/tasks/themes/ColorUtil.java
index 77be56cb3..b5146ce23 100644
--- a/app/src/main/java/org/tasks/themes/ColorUtil.java
+++ b/app/src/main/java/org/tasks/themes/ColorUtil.java
@@ -12,8 +12,10 @@ public class ColorUtil {
* @return darken color
*/
static int darken(int base, int amount) {
- if (base == 0 || base == -1) {
- return base;
+ if (base == Color.WHITE) {
+ return Color.WHITE;
+ } else if (base == Color.BLACK) {
+ return Color.BLACK;
}
float[] hsv = new float[3];
diff --git a/app/src/main/java/org/tasks/themes/ThemeAccent.java b/app/src/main/java/org/tasks/themes/ThemeAccent.java
index ec5d19ddf..48b1e1a47 100644
--- a/app/src/main/java/org/tasks/themes/ThemeAccent.java
+++ b/app/src/main/java/org/tasks/themes/ThemeAccent.java
@@ -4,9 +4,9 @@ import android.content.res.Resources;
import android.os.Parcel;
import android.os.Parcelable;
import org.tasks.R;
-import org.tasks.dialogs.ColorPickerDialog;
+import org.tasks.dialogs.ColorPalettePicker.Pickable;
-public class ThemeAccent implements ColorPickerDialog.Pickable {
+public class ThemeAccent implements Pickable {
static final int[] ACCENTS =
new int[] {
@@ -40,20 +40,17 @@ public class ThemeAccent implements ColorPickerDialog.Pickable {
return new ThemeAccent[size];
}
};
- private final String name;
private final int index;
private final int style;
private final int accentColor;
- public ThemeAccent(String name, int index, int accentColor) {
- this.name = name;
+ public ThemeAccent(int index, int accentColor) {
this.index = index;
this.style = ACCENTS[index];
this.accentColor = accentColor;
}
private ThemeAccent(Parcel source) {
- name = source.readString();
index = source.readInt();
style = source.readInt();
accentColor = source.readInt();
@@ -63,11 +60,6 @@ public class ThemeAccent implements ColorPickerDialog.Pickable {
theme.applyStyle(style, true);
}
- @Override
- public String getName() {
- return name;
- }
-
@Override
public int getPickerColor() {
return accentColor;
@@ -100,7 +92,6 @@ public class ThemeAccent implements ColorPickerDialog.Pickable {
@Override
public void writeToParcel(Parcel dest, int flags) {
- dest.writeString(name);
dest.writeInt(index);
dest.writeInt(style);
dest.writeInt(accentColor);
diff --git a/app/src/main/java/org/tasks/themes/ThemeBase.java b/app/src/main/java/org/tasks/themes/ThemeBase.java
index 57cab99cc..db26be045 100644
--- a/app/src/main/java/org/tasks/themes/ThemeBase.java
+++ b/app/src/main/java/org/tasks/themes/ThemeBase.java
@@ -8,9 +8,9 @@ import android.os.Parcelable;
import android.view.ContextThemeWrapper;
import androidx.appcompat.app.AppCompatDelegate;
import org.tasks.R;
-import org.tasks.dialogs.ColorPickerDialog;
+import org.tasks.dialogs.ColorPalettePicker.Pickable;
-public class ThemeBase implements ColorPickerDialog.Pickable {
+public class ThemeBase implements Pickable {
private static final int[] THEMES =
new int[] {
@@ -50,7 +50,6 @@ public class ThemeBase implements ColorPickerDialog.Pickable {
dayNightMode = source.readInt();
}
- @Override
public String getName() {
return name;
}
diff --git a/app/src/main/java/org/tasks/themes/ThemeCache.java b/app/src/main/java/org/tasks/themes/ThemeCache.java
index f7efcda59..13343785e 100644
--- a/app/src/main/java/org/tasks/themes/ThemeCache.java
+++ b/app/src/main/java/org/tasks/themes/ThemeCache.java
@@ -70,16 +70,13 @@ public class ThemeCache {
getColor(context, R.color.grey_50),
AppCompatDelegate.MODE_NIGHT_AUTO));
- String[] colorNames = resources.getStringArray(R.array.colors);
for (int i = 0; i < ThemeColor.COLORS.length; i++) {
colors.add(
- new ThemeColor(
- context, colorNames[i], i, ContextCompat.getColor(context, ThemeColor.COLORS[i])));
+ new ThemeColor(context, i, ContextCompat.getColor(context, ThemeColor.COLORS[i])));
}
- String[] accentNames = resources.getStringArray(R.array.accents);
for (int i = 0; i < ThemeAccent.ACCENTS.length; i++) {
Resources.Theme theme = new ContextThemeWrapper(context, ThemeAccent.ACCENTS[i]).getTheme();
- accents.add(new ThemeAccent(accentNames[i], i, resolveAttribute(theme, R.attr.colorSecondary)));
+ accents.add(new ThemeAccent(i, resolveAttribute(theme, R.attr.colorSecondary)));
}
String[] widgetBackgroundNames = resources.getStringArray(R.array.widget_background);
for (int i = 0; i < WidgetTheme.BACKGROUNDS.length; i++) {
@@ -92,7 +89,7 @@ public class ThemeCache {
getColor(context, i == 0 ? R.color.black_54 : R.color.white_70)));
}
untaggedColor =
- new ThemeColor(context, null, 19, getColor(context, R.color.tag_color_none_background));
+ new ThemeColor(context, 19, getColor(context, R.color.tag_color_none_background));
}
private static int resolveAttribute(Resources.Theme theme, int attribute) {
diff --git a/app/src/main/java/org/tasks/themes/ThemeColor.java b/app/src/main/java/org/tasks/themes/ThemeColor.java
index 5e18dae02..6579610b0 100644
--- a/app/src/main/java/org/tasks/themes/ThemeColor.java
+++ b/app/src/main/java/org/tasks/themes/ThemeColor.java
@@ -24,10 +24,10 @@ 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 org.tasks.dialogs.ColorPalettePicker.Pickable;
import timber.log.Timber;
-public class ThemeColor implements ColorPickerDialog.Pickable {
+public class ThemeColor implements Pickable {
public static final int[] ICONS =
new int[] {
@@ -114,10 +114,8 @@ public class ThemeColor implements ColorPickerDialog.Pickable {
return new ThemeColor[size];
}
};
- private final String name;
private final int index;
private final int colorOnPrimary;
- private final int color;
private final int colorPrimary;
private final int colorPrimaryVariant;
private final boolean isDark;
@@ -132,17 +130,14 @@ public class ThemeColor implements ColorPickerDialog.Pickable {
}
public ThemeColor(Context context, int color) {
- this(context, null, -1, color == 0 ? ContextCompat.getColor(context, R.color.blue_500) : color);
+ this(context, -1, color == 0 ? ContextCompat.getColor(context, R.color.blue_500) : color);
}
public ThemeColor(
Context context,
- String name,
int index,
int colorPrimary) {
- this.name = name;
this.index = index;
- this.color = index >= 0 ? COLORS[index] : -1;
colorPrimary |= 0xFF000000; // remove alpha
this.colorPrimary = colorPrimary;
this.colorPrimaryVariant = ColorUtil.darken(colorPrimary, 12);
@@ -154,10 +149,8 @@ public class ThemeColor implements ColorPickerDialog.Pickable {
}
private ThemeColor(Parcel source) {
- name = source.readString();
index = source.readInt();
colorOnPrimary = source.readInt();
- color = source.readInt();
colorPrimary = source.readInt();
colorPrimaryVariant = source.readInt();
isDark = source.readInt() == 1;
@@ -237,11 +230,6 @@ public class ThemeColor implements ColorPickerDialog.Pickable {
}
}
- @Override
- public String getName() {
- return name;
- }
-
@Override
public int getPickerColor() {
return colorPrimary;
@@ -249,10 +237,10 @@ public class ThemeColor implements ColorPickerDialog.Pickable {
@Override
public boolean isFree() {
- switch (color) {
- case R.color.blue_500:
- case R.color.blue_grey_500:
- case R.color.grey_900:
+ switch (colorPrimary) {
+ case -14575885: // blue_500
+ case -10453621: // blue_grey_500
+ case -14606047: // grey_900
return true;
default:
return false;
@@ -286,10 +274,8 @@ public class ThemeColor implements ColorPickerDialog.Pickable {
@Override
public void writeToParcel(Parcel dest, int flags) {
- dest.writeString(name);
dest.writeInt(index);
dest.writeInt(colorOnPrimary);
- dest.writeInt(color);
dest.writeInt(colorPrimary);
dest.writeInt(colorPrimaryVariant);
dest.writeInt(isDark ? 1 : 0);
diff --git a/app/src/main/java/org/tasks/themes/WidgetTheme.java b/app/src/main/java/org/tasks/themes/WidgetTheme.java
index c9d5684eb..29a1e0066 100644
--- a/app/src/main/java/org/tasks/themes/WidgetTheme.java
+++ b/app/src/main/java/org/tasks/themes/WidgetTheme.java
@@ -3,9 +3,9 @@ package org.tasks.themes;
import android.os.Parcel;
import android.os.Parcelable;
import org.tasks.R;
-import org.tasks.dialogs.ColorPickerDialog;
+import org.tasks.dialogs.ColorPalettePicker.Pickable;
-public class WidgetTheme implements ColorPickerDialog.Pickable {
+public class WidgetTheme implements Pickable {
static final int[] BACKGROUNDS =
new int[] {R.color.grey_50, R.color.widget_background_black, R.color.md_background_dark};
@@ -56,7 +56,6 @@ public class WidgetTheme implements ColorPickerDialog.Pickable {
return textColorSecondary;
}
- @Override
public String getName() {
return name;
}
diff --git a/app/src/main/java/org/tasks/widget/ShortcutConfigActivity.java b/app/src/main/java/org/tasks/widget/ShortcutConfigActivity.java
index 9dd181579..704b67d9c 100644
--- a/app/src/main/java/org/tasks/widget/ShortcutConfigActivity.java
+++ b/app/src/main/java/org/tasks/widget/ShortcutConfigActivity.java
@@ -3,10 +3,13 @@ package org.tasks.widget;
import android.app.Activity;
import android.content.Intent;
import android.content.Intent.ShortcutIconResource;
+import android.graphics.drawable.LayerDrawable;
import android.os.Bundle;
import android.os.Parcelable;
+import android.widget.ImageView;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
+import androidx.core.graphics.drawable.DrawableCompat;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
@@ -17,22 +20,23 @@ import com.google.common.base.Strings;
import com.todoroo.astrid.api.Filter;
import javax.inject.Inject;
import org.tasks.R;
-import org.tasks.activities.ColorPickerActivity;
-import org.tasks.activities.ColorPickerActivity.ColorPalette;
import org.tasks.activities.FilterSelectionActivity;
+import org.tasks.dialogs.ColorPalettePicker;
+import org.tasks.dialogs.ColorPickerAdapter.Palette;
import org.tasks.injection.ActivityComponent;
-import org.tasks.injection.InjectingAppCompatActivity;
+import org.tasks.injection.ThemedInjectingAppCompatActivity;
import org.tasks.intents.TaskIntents;
import org.tasks.preferences.DefaultFilterProvider;
import org.tasks.themes.ThemeCache;
import org.tasks.themes.ThemeColor;
-public class ShortcutConfigActivity extends InjectingAppCompatActivity {
+public class ShortcutConfigActivity extends ThemedInjectingAppCompatActivity
+ implements ColorPalettePicker.ColorPickedCallback {
private static final String EXTRA_FILTER = "extra_filter";
private static final String EXTRA_THEME = "extra_theme";
+ private static final String FRAG_TAG_COLOR_PICKER = "frag_tag_color_picker";
private static final int REQUEST_FILTER = 1019;
- private static final int REQUEST_COLOR_PICKER = 1020;
@Inject DefaultFilterProvider defaultFilterProvider;
@Inject ThemeColor themeColor;
@@ -50,8 +54,8 @@ public class ShortcutConfigActivity extends InjectingAppCompatActivity {
@BindView(R.id.shortcut_name)
TextInputEditText shortcutName;
- @BindView(R.id.shortcut_color)
- TextInputEditText shortcutColor;
+ @BindView(R.id.color)
+ ImageView colorIcon;
private Filter selectedFilter;
private int selectedTheme;
@@ -89,11 +93,6 @@ public class ShortcutConfigActivity extends InjectingAppCompatActivity {
selectedFilter = data.getParcelableExtra(FilterSelectionActivity.EXTRA_FILTER);
updateFilterAndTheme();
}
- } else if (requestCode == REQUEST_COLOR_PICKER) {
- if (resultCode == RESULT_OK) {
- selectedTheme = data.getIntExtra(ColorPickerActivity.EXTRA_COLOR, 0);
- updateTheme();
- }
} else {
super.onActivityResult(requestCode, resultCode, data);
}
@@ -123,21 +122,10 @@ public class ShortcutConfigActivity extends InjectingAppCompatActivity {
startActivityForResult(intent, REQUEST_FILTER);
}
- @OnFocusChange(R.id.shortcut_color)
- void onColorFocusChange(boolean focused) {
- if (focused) {
- shortcutColor.clearFocus();
- showThemePicker();
- }
- }
-
- @OnClick(R.id.shortcut_color)
+ @OnClick(R.id.color_row)
void showThemePicker() {
- 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_COLOR, selectedTheme);
- startActivityForResult(intent, REQUEST_COLOR_PICKER);
+ ColorPalettePicker.Companion.newColorPalette(null, 0, Palette.LAUNCHERS)
+ .show(getSupportFragmentManager(), FRAG_TAG_COLOR_PICKER);
}
private void updateFilterAndTheme() {
@@ -152,7 +140,8 @@ public class ShortcutConfigActivity extends InjectingAppCompatActivity {
private void updateTheme() {
ThemeColor color = themeCache.getThemeColor(getThemeIndex());
- shortcutColor.setText(color.getName());
+ DrawableCompat.setTint(
+ ((LayerDrawable) colorIcon.getDrawable()).getDrawable(0), color.getPrimaryColor());
color.apply(toolbar);
color.applyToSystemBars(this);
}
@@ -182,4 +171,10 @@ public class ShortcutConfigActivity extends InjectingAppCompatActivity {
public void inject(ActivityComponent component) {
component.inject(this);
}
+
+ @Override
+ public void onColorPicked(int color) {
+ selectedTheme = color;
+ updateTheme();
+ }
}
diff --git a/app/src/main/java/org/tasks/widget/TasksWidget.java b/app/src/main/java/org/tasks/widget/TasksWidget.java
index 35b7c9e18..4d56b09ab 100644
--- a/app/src/main/java/org/tasks/widget/TasksWidget.java
+++ b/app/src/main/java/org/tasks/widget/TasksWidget.java
@@ -75,7 +75,7 @@ public class TasksWidget extends InjectingAppWidgetProvider {
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 = themeCache.getThemeColor(widgetPreferences.getColorIndex());
+ ThemeColor color = ThemeColor.newThemeColor(context, widgetPreferences.getColor());
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.scrollable_widget);
if (atLeastJellybeanMR1()) {
remoteViews.setInt(R.id.widget, "setLayoutDirection", locale.getDirectionality());
diff --git a/app/src/main/java/org/tasks/widget/WidgetPreferences.java b/app/src/main/java/org/tasks/widget/WidgetPreferences.java
index ce1ee9edb..1c20a3d41 100644
--- a/app/src/main/java/org/tasks/widget/WidgetPreferences.java
+++ b/app/src/main/java/org/tasks/widget/WidgetPreferences.java
@@ -1,8 +1,10 @@
package org.tasks.widget;
import android.content.Context;
+import androidx.core.content.ContextCompat;
import org.tasks.R;
import org.tasks.preferences.Preferences;
+import org.tasks.themes.ThemeColor;
public class WidgetPreferences {
@@ -44,8 +46,18 @@ public class WidgetPreferences {
return preferences.getInt(getKey(R.string.p_widget_theme), 0);
}
- public int getColorIndex() {
- return preferences.getInt(getKey(R.string.p_widget_color), 0);
+ public int getColor() {
+ int color = preferences.getInt(getKey(R.string.p_widget_color_v2), 0);
+ if (color != 0) {
+ return color;
+ }
+ int index = preferences.getInt(getKey(R.string.p_widget_color), -1);
+ if (index < 0 || index > ThemeColor.COLORS.length) {
+ index = 7;
+ }
+ color = ContextCompat.getColor(context, ThemeColor.COLORS[index]);
+ preferences.setInt(getKey(R.string.p_widget_color_v2), color);
+ return color;
}
public int getOpacity() {
@@ -56,8 +68,8 @@ public class WidgetPreferences {
preferences.setInt(getKey(R.string.p_widget_opacity), value);
}
- public void setColor(int index) {
- preferences.setInt(getKey(R.string.p_widget_color), index);
+ public void setColor(int color) {
+ preferences.setInt(getKey(R.string.p_widget_color_v2), color);
}
public void setTheme(int index) {
diff --git a/app/src/main/res/layout/activity_widget_shortcut_content.xml b/app/src/main/res/layout/activity_widget_shortcut_content.xml
index 66dbf93a0..efabf72b4 100644
--- a/app/src/main/res/layout/activity_widget_shortcut_content.xml
+++ b/app/src/main/res/layout/activity_widget_shortcut_content.xml
@@ -2,37 +2,30 @@
+ android:layout_height="match_parent" >
-
+ style="@style/TagSettingsRow"
+ app:layout_constraintStart_toStartOf="@+id/shortcut_name_layout"
+ app:layout_constraintTop_toBottomOf="@+id/shortcut_name_layout">
-
+
-
+
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent">
diff --git a/app/src/main/res/layout/activity_widget_shortcut_layout.xml b/app/src/main/res/layout/activity_widget_shortcut_layout.xml
index 3738ad438..37c071032 100644
--- a/app/src/main/res/layout/activity_widget_shortcut_layout.xml
+++ b/app/src/main/res/layout/activity_widget_shortcut_layout.xml
@@ -5,8 +5,7 @@
android:layout_height="match_parent"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"
- android:orientation="vertical"
- android:background="@color/content_background">
+ android:orientation="vertical">
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index ce4e52825..b03d73494 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -145,7 +145,6 @@
عرض المهام المخفية
إظهار المكتملة
التعتيم
- أبيض
تخصيص اللغة و الجهة
تصدير المهام
diff --git a/app/src/main/res/values-bg-rBG/strings.xml b/app/src/main/res/values-bg-rBG/strings.xml
index 907301afc..7e2220c0c 100644
--- a/app/src/main/res/values-bg-rBG/strings.xml
+++ b/app/src/main/res/values-bg-rBG/strings.xml
@@ -372,28 +372,7 @@
Цвят
Акцент
Иконка на лаунчера
- Червен
- Розов
- Лилав
- Тъмно лилав
- Индиго
- Син
- Светло син
- Синьозелен
- Тюркоаз
- Зелен
- Светло зелен
- Лайм
- Жълт
- Кехлибар
- Оранжев
- Тъмно оранжева
- Кафяв
- Сив
- Синьо-сив
Черен
- Тъмно сива
- Бяла
Светла
Тъмна
Тапет
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index 93466d715..367e33e1d 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -102,7 +102,6 @@
Mostra ocultes
Mostra completades
Ordenació inversa
- Blanc
Idioma
Localització
Led de notificació
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 74d84d59b..c244697c2 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -233,24 +233,8 @@
Průhlednost
Vzhled
Barva
- Červená
- Růžová
- Purpurová
- Modrá
- Světle modrá
- Tyrkysová
- Zelená
- Světle zelená
- Limetková
- Žlutá
- Jantarová
- Oranžová
- Hnědá
- Šedá
- Modrošedá
- Černá
- Bílý
- Světlý
+ Černá
+ Světlý
Tmavý
Tapeta
Den/Noc
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 20f0ccf64..50bbcc55d 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -363,26 +363,8 @@
Farbe
Akzent
Startersymbol
- Rot
- Lila
- Dunkel-Lila
- Indigoblau
- Blau
- Hellblau
- Blaugrün
- Grün
- Hellgrün
- Limette
- Gelb
- Bernstein
- Dunkelorange
- Braun
- Grau
- Blaugrau
- Schwarz
- Dunkelgrau
- Weiß
- Hell
+ Schwarz
+ Hell
Dunkel
Hintergrundbild
Tag/Nacht
@@ -505,10 +487,7 @@
%s m
Filter
Thema
- Rosa
- Cyan
- Orange
- URL
+ URL
", "
Version %s
Fehler: %s
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 917ef8537..eabf14157 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -371,29 +371,8 @@
Tema
Acentuado
Icono de Launcher
- Rojo
- Rosa
- Morado
- Morado profundo
- Añil
- Azul
- Azul claro
- Cian
- Verde azulado
- Verde
- Verde claro
- Lima
- Amarillo
- Ámbar
- Naranja
- Naranja profundo
- Marrón
- Gris
- Gris azulado
- Negro
- Gris oscuro
- Blanco
- Claro
+ Negro
+ Claro
Oscuro
Fondo de pantalla
Día/Noche
diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml
index 4dd0de6b1..5158f14d9 100644
--- a/app/src/main/res/values-et/strings.xml
+++ b/app/src/main/res/values-et/strings.xml
@@ -233,24 +233,7 @@
Teema
Värv
Rakenduse ikoon
- Punane
- Roosa
- Lilla
- Tumelilla
- Sinine
- Helesinine
- Heleroheline
- Laim
- Kollane
- Merevaik
- Oraanž
- Tume osaanž
- Pruun
- Hall
- Sinakashall
Must
- Tumehall
- Valge
Hele
Tume
Taustapilt
diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml
index 02032368e..d6782067c 100644
--- a/app/src/main/res/values-eu/strings.xml
+++ b/app/src/main/res/values-eu/strings.xml
@@ -377,28 +377,7 @@
Kolorea
Azentua
Abiarazlearen ikonoa
- Gorria
- Arrosa
- Morea
- More sakona
- Indigoa
- Urdina
- Urdin argia
- Ziana
- Berde urdinxka
- Berdea
- Berde argia
- Lima
- Horia
- Anbara
- Laranja
- Laranja sakona
- Marroia
- Grisa
- Gris urdinxka
Beltza
- Gris iluna
- Zuria
Argia
Iluna
Horma-papera
diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml
index 02ec1725c..6c956385f 100644
--- a/app/src/main/res/values-fa/strings.xml
+++ b/app/src/main/res/values-fa/strings.xml
@@ -231,16 +231,6 @@
شفافیت
تم
رنگ
- قرمز
- صورتی
- بنفش
- آبی
- سبز
- زرد
- نارنجی
- قهوه ای
- خاکستری
- سفید
روشن
تیره
زبان
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index fb507f9c9..560ba9c40 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -347,28 +347,7 @@
Teema
Väri
Sävy
- Pun.
- Pinkki
- Purppura
- Tumma purppura
- Sininen
- Sininen
- Vaalea sininen
- Syaani
- Sinivihreä
- Vihreä
- Vaalea vihreä
- LIme
- Keltainen
- Kullanruskea
- Oranssi
- Tumma oranssi
- Ruskea
- Harmaa
- Siniharmaa
Musta
- Tumma harmaa
- Valkoinen
Vaalea
Tumma
Taustakuva
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index f970ebeb6..1e9732884 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -353,26 +353,8 @@
Thème
Couleur
Icône du lanceur
- Rouge
- Rose
- Violet
- Violet foncé
- Bleu
- Bleu clair
- Turquoise
- Vert
- Vert clair
- Citron
- Jaune
- Ambre
- Orange foncé
- Marron
- Gris
- Bleu gris
- Noir
- Gris sombre
- Blanc
- Lumineux
+ Noir
+ Lumineux
Sombre
Fond d\'écran
Jour/Nuit
@@ -506,10 +488,7 @@ est configuré correctement
%s m
Catégories
Accent
- Indigo
- Cyan
- Orange
- Badges
+ Badges
", "
Version %s
Icône
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index 69f1254c1..279974e42 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -268,28 +268,7 @@
Tema
Cor
Acentuado
- Rojo
- Rosa
- Morado
- Morado profundo
- Añil
- Azul
- Azul claro
- Cian
- Verde azulado
- Verde
- Verde claro
- Lima
- Amarillo
- Ámbar
- Naranja
- Naranja profundo
- Marrón
- Gris
- Gris azulado
Negro
- Gris oscuro
- Blanco
Claro
Oscuro
Fondo de pantalla
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index edb7762e6..13acb1f13 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -371,29 +371,8 @@
Szín
Kiemelés
Launcher ikon
- Piros
- Rózsaszín
- Lila
- Bíbor
- Sötétkék
- Kék
- Világoskék
- Cián
- Zöldeskék
- Zöld
- Világoszöld
- Sárgászöld
- Sárga
- Borostyán
- Narancs
- Sötétnarancs
- Barna
- Szürke
- Szürkéskék
- Fekete
- Sötétszürke
- Fehér
- Világos
+ Fekete
+ Világos
Sötét
Háttérkép
Nappal/Éjszaka
diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml
index 033573caa..154c0fc5a 100644
--- a/app/src/main/res/values-id/strings.xml
+++ b/app/src/main/res/values-id/strings.xml
@@ -287,26 +287,8 @@
Ikon
Aksen
Ikon peluncur
- Merah
- Merah muda
- Ungu
- Ungu gelap
- Nila
- Biru
- Biru cerah
- Hijau
- Hujau cerah
- Kapur
- Kuning
- Oranye
- Oranye gelap
- Cokelat
- Abu-bau
- Biru abu-bau
- Hitam
- Abu-abu gelap
- Putih
- Cerah
+ Hitam
+ Cerah
Gelap
Siang/Malam
Bahasa
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 31c6e907d..68b0444f3 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -368,28 +368,7 @@
Colore
Evidenzia
Icona lanciatore
- Rosso
- Rosa
- Porpora
- Viola intenso
- Indaco
- Blu
- Celeste
- Ciano
- Turchese
- Verde
- Verde chiaro
- Verdolino
- Giallo
- Ambra
- Arancio
- Arancio intenso
- Marrone
- Grigio
- Grigio-Blu
Nero
- Grigio scuro
- Bianco
Chiaro
Scuro
Sfondo
diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml
index af76819a3..ae8f9e6b2 100644
--- a/app/src/main/res/values-iw/strings.xml
+++ b/app/src/main/res/values-iw/strings.xml
@@ -407,28 +407,7 @@
צבע
צבע משני
צלמית משגר
- אדום
- ורוד
- סגול
- סגול עמוק
- אינדיגו
- כחול
- תכלת
- תורכיז
- ירוק כחלחל
- ירוק
- ירקרק
- ליים
- צהוב
- ענבר
- כתום
- כתום עמוק
- חום
- אפור
- כחול אפור
שחור
- אפור כהה
- לבן
בהיר
כהה
תמונת רקע
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 3e4790c86..e6f87866b 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -369,28 +369,7 @@
色
アクセント
ランチャーアイコン
- 赤
- ピンク
- 紫
- 深紫
- 藍
- 青
- 水色
- シアン
- 青緑
- 緑
- 薄緑
- ライム
- 黄
- 琥珀
- オレンジ
- ディープオレンジ
- 茶
- 灰
- 灰青
黒
- ダークグレー
- 白
ライト
ダーク
壁紙
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index b37727267..7100fe8a3 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -372,28 +372,7 @@
색상
강조
런처 아이콘
- 빨강
- 분홍
- 보라
- 진한 보라
- 군청
- 파랑
- 밝은 파랑
- 하늘색
- 청록색
- 초록
- 밝은 초록
- 라임색
- 노랑
- 호박색
- 주황
- 진한 주황
- 갈색
- 회색
- 회청색
검정
- 어두운 회색
- 흰색
밝게
어둡게
바탕화면
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index fd869dd09..a55c6e570 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -368,27 +368,7 @@
Spalva
Akcentas
Paleidimo ikona
- Raudona
- Rožinė
- Violetinė
- Ryškiai violetinė
- Mėlyna
- Šviesiai mėlyna
- Žydra
- Melsva
- Žalia
- Šviesiai žalia
- Gelsvai žalsva
- Geltona
- Gintarinė
- Oranžinė
- Ryškiai oranžinė
- Ruda
- Pilka
- Mėlynai pilka
Juoda
- Tamsiai pilka
- Balta
Šviesi
Tamsi
Fono vaizdas
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
index be9bfe34a..1e77f4ec5 100644
--- a/app/src/main/res/values-nb/strings.xml
+++ b/app/src/main/res/values-nb/strings.xml
@@ -401,28 +401,7 @@
Farge
Aksentfarge
Oppstarterfarge
- Rød
- Rosa
- Lilla
- Mørkelilla
- Indigoblå
- Blå
- Lyseblå
- Cyan
- Turkis
- Grønn
- Lysegrønn
- Lime
- Gul
- Rav
- Oransje
- Mørkeoransje
- Brun
- Grå
- Blågrå
Svart
- Mørkegrå
- Hvit
Lys
Mørk
Bakgrunnsbilde
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 4b7392982..d7d8c7d75 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -363,28 +363,8 @@
Thema
Kleur
Start icon
- Rood
- Roze
- Paars
- Diep Paars
- Blauw
- Licht Blauw
- Blauwgroen
- Zeegroen
- Groen
- Licht groen
- Limoen
- Geel
- Oranjegeel
- Oranje
- Diep Oranje
- Bruin
- Grijs
- Blauwgrijs
- Zwart
- Donker Groen
- Wit
- Licht
+ Zwart
+ Licht
Donker
Achtergrond
Dag/Nacht
@@ -518,8 +498,7 @@
Bepaal je prijs
Maandelijks
Jaarlijks
- Paars
- Later
+ Later
Link
", "
Help
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index f8c3d6e16..0ebbd67a9 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -383,29 +383,8 @@
Kolor
Akcent
Ikona programu startowego
- Czerwony
- Różowy
- Fioletowy
- Ciemnofioletowy
- Indygo
- Niebieski
- Jasnoniebieski
- Cyjan
- Morski
- Zielony
- Jasnozielony
- Cytrynowy
- Żółty
- Bursztynowy
- Pomarańczowy
- Ciemno pomarańczowy
- Brązowy
- Szary
- Niebieskoszary
- Czarny
- Ciemnoszary
- Biały
- Jasny
+ Czarny
+ Jasny
Ciemny
Tapeta
Dzień/noc
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index ed597c334..12e974f58 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -369,28 +369,7 @@
Cor
Cor de realce
Ícone do launcher
- Vermelho
- Rosa
- Roxo
- Roxo Profundo
- Azul-escuro
- Azul
- Azul Claro
- Ciano
- Verde-azulado
- Verde
- Verde Claro
- Limão
- Amarelo
- Âmbar
- Laranja
- Laranja Profundo
- Marrom
- Cinza
- Azul Acinzentado
Preto
- Cinza escuro
- Branco
Claro
Escuro
Plano de fundo
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 3012ca0f7..f089d1f15 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -343,17 +343,6 @@
Tema
Cor
Realçe
- Vermelho
- Rosa
- Púrpura
- Azul
- Azul claro
- Verde
- Verde claro
- Amarelo
- Laranja
- Castanho
- Cinzento
Preto
Claro
Escuro
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index 396ca8f19..3548b216b 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -8,5 +8,4 @@
Sterge linia
Fara categorie
Filtre
- Alb
\ No newline at end of file
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 878866fde..e96cb878e 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -390,29 +390,8 @@
Цвет
Акцент
Иконка запуска
- Красный
- Розовый
- Пурпурный
- Тёмно-пурпурный
- Индиго
- Синий
- Светло-синий
- Ярко-бирюзовый
- Тёмно-бирюзовый
- Зелёный
- Светло-зелёный
- Лайм
- Жёлтый
- Янтарный
- Оранжевый
- Тёмно-оранжевый
- Коричневый
- Серый
- Серо-голубой
- Чёрная
- Тёмно-серый
- Белый
- Светлая
+ Чёрная
+ Светлая
Тёмная
Как обои
День / ночь
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index e1cc509eb..54ca6da83 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -368,28 +368,7 @@
Farba
Zvýraznenie
Ikona
- Červená
- Ružová
- Fialová
- Tmavočervená
- Atramentová
- Modrá
- Svetlo modrá
- Modrozeleň
- Tmavo MZ
- Zelená
- Svetlo zelená
- Citrónová
- Žltá
- Jantárová
- Oranžová
- Tmavo oranžová
- Hnedá
- Šedá
- Modro šedá
Čierna
- Tmavo šedá
- Biela
Svetlá
Tmavá
Tapeta
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 42c9411fe..24df8acf5 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -264,25 +264,7 @@
Opacitet
Tema
Färg
- Röd
- Rosa
- Lila
- Mörklila
- Indigoblå
- Blå
- Ljusblå
- Grönblå
- Grön
- Ljusgrön
- Gul
- Bärnsten
- Mörkorange
- Brun
- Grå
- Blågrå
Svart
- Mörkgrå
- Vit
Ljust
Mörkt
Bakgrundsbild
@@ -404,9 +386,6 @@
Filter
Accent
Hemskärmsikon
- Cyan
- Lime
- Orange
Överskriftsinställningar
Radinställmingar
Tasks kräver tillstånd
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index f9a1f95f4..3698844fb 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -374,28 +374,7 @@
Renk
Ara renk
Başlatıcı simgesi
- Kırmızı
- Pembe
- Mor
- Koyu mor
- Çivit
- Mavi
- Açık mavi
- Camgöbeği
- Teal mavisi
- Yeşil
- Açık yeşil
- Çim rengi
- Sarı
- Kehribar
- Turuncu
- Koyu turuncu
- Kahverengi
- Gri
- Mavi gri
Siyah
- Koyu gri
- Beyaz
Açık
Koyu
Duvar kağıdı
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 76b034670..b542d4a14 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -372,28 +372,7 @@
Колір
Акцент
Іконка запуску
- Червоний
- Рожевий
- Пурпуровий
- Фіолетовий
- Індиго
- Синій
- Блакитний
- Ціановий
- Синьо-зелений
- Зелений
- Світло-зелений
- Лайм
- Жовтий
- Янтарний
- Помаранчевий
- Темно-помаранчевий
- Коричневий
- Сірий
- Сіро-синій
Чорний
- Темно-сірий
- Біла
Світлий
Темний
Шпалери
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 875fe659a..4604a3aac 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -354,28 +354,8 @@
颜色
强调色
启动器图标
- 红色
- 粉色
- 紫色
- 深紫色
- 靛青色
- 蓝色
- 浅蓝色
- 青色
- 蓝绿色
- 绿色
- 浅绿色
- 青柠色
- 黄色
- 琥珀色
- 橙色
- 深橙色
- 棕色
- 灰色
- 蓝灰色
- 黑色
- 深灰色
- 亮色
+ 黑色
+ 亮色
暗色
壁纸
日/夜
@@ -482,8 +462,7 @@
添加位置
半径
%s 米
- 白色
- 管理订阅
+ 管理订阅
Google Place搜索
抵达时提醒
离开时提醒
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
index 588ecd633..da8ccc9ea 100644
--- a/app/src/main/res/values/arrays.xml
+++ b/app/src/main/res/values/arrays.xml
@@ -36,50 +36,6 @@
- @string/ring_nonstop
-
- - @string/theme_blue_grey
- - @string/theme_dark_grey
- - @string/theme_red
- - @string/theme_pink
- - @string/theme_purple
- - @string/theme_deep_purple
- - @string/theme_indigo
- - @string/theme_blue
- - @string/theme_light_blue
- - @string/theme_cyan
- - @string/theme_teal
- - @string/theme_green
- - @string/theme_light_green
- - @string/theme_lime
- - @string/theme_yellow
- - @string/theme_amber
- - @string/theme_orange
- - @string/theme_deep_orange
- - @string/theme_brown
- - @string/theme_grey
- - @string/theme_white
-
-
-
- - @string/theme_blue_grey
- - @string/theme_red
- - @string/theme_pink
- - @string/theme_purple
- - @string/theme_deep_purple
- - @string/theme_indigo
- - @string/theme_blue
- - @string/theme_light_blue
- - @string/theme_cyan
- - @string/theme_teal
- - @string/theme_green
- - @string/theme_light_green
- - @string/theme_lime
- - @string/theme_yellow
- - @string/theme_amber
- - @string/theme_orange
- - @string/theme_deep_orange
-
-
- @string/theme_light
- @string/theme_black
diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml
index 37c0a519a..7dd486480 100644
--- a/app/src/main/res/values/keys.xml
+++ b/app/src/main/res/values/keys.xml
@@ -247,6 +247,7 @@
widget-id-
widget-theme-v2-
widget-color-
+ widget-color-v2
widget-opacity-v3-
widget-font-size-
widget-show-due-date-
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 82c68624e..89c6196d3 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -392,28 +392,7 @@ File %1$s contained %2$s.\n\n
Icon
Accent
Launcher icon
- Red
- Pink
- Purple
- Deep purple
- Indigo
- Blue
- Light blue
- Cyan
- Teal
- Green
- Light green
- Lime
- Yellow
- Amber
- Orange
- Deep orange
- Brown
- Grey
- Blue grey
Black
- Dark grey
- White
Light
Dark
Wallpaper
@@ -581,5 +560,7 @@ File %1$s contained %2$s.\n\n
Disable battery optimizations
More settings
Ringtone, vibrations, and more
+ Free colors
+ Material palette
Invalid username or password
diff --git a/app/src/main/res/xml/preferences_widget.xml b/app/src/main/res/xml/preferences_widget.xml
index 73a5a3089..6ef101977 100644
--- a/app/src/main/res/xml/preferences_widget.xml
+++ b/app/src/main/res/xml/preferences_widget.xml
@@ -26,7 +26,8 @@
android:title="@string/widget_show_header" />