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 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 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 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" />