From 4fa5e7283b39bbc6794a25c9c871c834b9f190a4 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Sun, 1 Oct 2017 01:17:49 -0500 Subject: [PATCH] Add checkmark to locale picker --- .../NativeGoogleTaskListPicker.java | 4 +- .../SupportGoogleTaskListPicker.java | 50 +++++++------------ .../org/tasks/dialogs/ColorPickerDialog.java | 33 ++++-------- .../org/tasks/locale/LocalePickerDialog.java | 13 +++-- .../tasks/ui/SingleCheckedArrayAdapter.java | 31 +++++++++--- .../main/res/drawable/ic_check_black_24dp.xml | 5 ++ .../main/res/layout/color_selection_row.xml | 30 ----------- .../simple_list_item_single_choice_themed.xml | 2 +- 8 files changed, 69 insertions(+), 99 deletions(-) create mode 100644 app/src/main/res/drawable/ic_check_black_24dp.xml delete mode 100644 app/src/main/res/layout/color_selection_row.xml diff --git a/app/src/googleplay/java/org/tasks/activities/NativeGoogleTaskListPicker.java b/app/src/googleplay/java/org/tasks/activities/NativeGoogleTaskListPicker.java index ba22c1f4e..6cfbc0e06 100644 --- a/app/src/googleplay/java/org/tasks/activities/NativeGoogleTaskListPicker.java +++ b/app/src/googleplay/java/org/tasks/activities/NativeGoogleTaskListPicker.java @@ -12,6 +12,7 @@ import org.tasks.dialogs.DialogBuilder; import org.tasks.gtasks.GoogleTaskListSelectionHandler; import org.tasks.injection.InjectingNativeDialogFragment; import org.tasks.injection.NativeDialogFragmentComponent; +import org.tasks.themes.ThemeAccent; import org.tasks.themes.ThemeCache; import javax.inject.Inject; @@ -35,6 +36,7 @@ public class NativeGoogleTaskListPicker extends InjectingNativeDialogFragment { @Inject DialogBuilder dialogBuilder; @Inject GtasksListService gtasksListService; @Inject ThemeCache themeCache; + @Inject ThemeAccent themeAccent; private GoogleTaskListSelectionHandler handler; @@ -47,7 +49,7 @@ public class NativeGoogleTaskListPicker extends InjectingNativeDialogFragment { selected = new GtasksList(storeObject); } return createDialog(getActivity(), themeCache, dialogBuilder, gtasksListService, - selected, list -> handler.selectedList(list)); + selected, themeAccent, list -> handler.selectedList(list)); } @Override diff --git a/app/src/googleplay/java/org/tasks/activities/SupportGoogleTaskListPicker.java b/app/src/googleplay/java/org/tasks/activities/SupportGoogleTaskListPicker.java index 775d63230..5857a0f12 100644 --- a/app/src/googleplay/java/org/tasks/activities/SupportGoogleTaskListPicker.java +++ b/app/src/googleplay/java/org/tasks/activities/SupportGoogleTaskListPicker.java @@ -1,19 +1,11 @@ package org.tasks.activities; -import android.annotation.SuppressLint; import android.app.Activity; import android.app.Dialog; import android.content.Context; -import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.annotation.NonNull; -import android.support.v4.content.ContextCompat; -import android.support.v4.graphics.drawable.DrawableCompat; import android.support.v7.app.AlertDialog; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.CheckedTextView; import com.todoroo.astrid.data.StoreObject; import com.todoroo.astrid.gtasks.GtasksList; @@ -24,14 +16,16 @@ import org.tasks.dialogs.DialogBuilder; import org.tasks.gtasks.GoogleTaskListSelectionHandler; import org.tasks.injection.DialogFragmentComponent; import org.tasks.injection.InjectingDialogFragment; +import org.tasks.themes.ThemeAccent; import org.tasks.themes.ThemeCache; import org.tasks.themes.ThemeColor; +import org.tasks.ui.SingleCheckedArrayAdapter; import java.util.List; import javax.inject.Inject; -import static com.todoroo.andlib.utility.AndroidUtilities.atLeastJellybeanMR1; +import static com.google.common.collect.Lists.transform; public class SupportGoogleTaskListPicker extends InjectingDialogFragment { @@ -50,6 +44,7 @@ public class SupportGoogleTaskListPicker extends InjectingDialogFragment { @Inject DialogBuilder dialogBuilder; @Inject GtasksListService gtasksListService; @Inject ThemeCache themeCache; + @Inject ThemeAccent themeAccent; private GoogleTaskListSelectionHandler handler; @@ -63,7 +58,7 @@ public class SupportGoogleTaskListPicker extends InjectingDialogFragment { selected = new GtasksList(storeObject); } return createDialog(getActivity(), themeCache, dialogBuilder, gtasksListService, - selected, list -> handler.selectedList(list)); + selected, themeAccent, list -> handler.selectedList(list)); } @Override @@ -75,36 +70,25 @@ public class SupportGoogleTaskListPicker extends InjectingDialogFragment { public static AlertDialog createDialog(Context context, ThemeCache themeCache, DialogBuilder dialogBuilder, GtasksListService gtasksListService, - GtasksList selected, final GoogleTaskListSelectionHandler handler) { + GtasksList selected, ThemeAccent themeAccent, + final GoogleTaskListSelectionHandler handler) { final List lists = gtasksListService.getLists(); - ArrayAdapter adapter = new ArrayAdapter(context, R.layout.simple_list_item_single_choice_themed, lists) { - @SuppressLint("NewApi") - @NonNull + List listNames = transform(lists, GtasksList::getName); + SingleCheckedArrayAdapter adapter = new SingleCheckedArrayAdapter(context, listNames, themeAccent) { @Override - public View getView(int position, View convertView, ViewGroup parent) { - CheckedTextView view = (CheckedTextView) super.getView(position, convertView, parent); + protected int getDrawable(int position) { + return R.drawable.ic_cloud_black_24dp; + } + + @Override + protected int getDrawableColor(int position) { GtasksList list = lists.get(position); - if (selected != null && list.getRemoteId().equals(selected.getRemoteId())) { - view.setCheckMarkDrawable(R.drawable.ic_check_white_24dp); - view.setChecked(true); - } else { - view.setCheckMarkDrawable(null); - view.setChecked(false); - } int color = list.getColor(); ThemeColor themeColor = themeCache.getThemeColor(color >= 0 ? color : 19); - view.setText(list.getName()); - Drawable original = ContextCompat.getDrawable(getContext(), R.drawable.ic_cloud_black_24dp); - Drawable wrapped = DrawableCompat.wrap(original.mutate()); - DrawableCompat.setTint(wrapped, themeColor.getPrimaryColor()); - if (atLeastJellybeanMR1()) { - view.setCompoundDrawablesRelativeWithIntrinsicBounds(wrapped, null, null, null); - } else { - view.setCompoundDrawablesWithIntrinsicBounds(wrapped, null, null, null); - } - return view; + return themeColor.getPrimaryColor(); } }; + adapter.setChecked(selected.getName()); return dialogBuilder.newDialog() .setSingleChoiceItems(adapter, -1, (dialog, which) -> { handler.selectedList(lists.get(which)); diff --git a/app/src/main/java/org/tasks/dialogs/ColorPickerDialog.java b/app/src/main/java/org/tasks/dialogs/ColorPickerDialog.java index 23332cd50..9820fed03 100644 --- a/app/src/main/java/org/tasks/dialogs/ColorPickerDialog.java +++ b/app/src/main/java/org/tasks/dialogs/ColorPickerDialog.java @@ -1,19 +1,12 @@ package org.tasks.dialogs; -import android.annotation.SuppressLint; import android.app.Activity; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; -import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.support.v4.content.ContextCompat; -import android.support.v4.graphics.drawable.DrawableCompat; -import android.view.View; -import android.view.ViewGroup; -import android.widget.CheckedTextView; import org.tasks.R; import org.tasks.injection.DialogFragmentComponent; @@ -29,8 +22,6 @@ import java.util.List; import javax.inject.Inject; -import static com.todoroo.andlib.utility.AndroidUtilities.atLeastJellybeanMR1; - public class ColorPickerDialog extends InjectingDialogFragment { private static final String EXTRA_PALETTE = "extra_palette"; @@ -76,23 +67,17 @@ public class ColorPickerDialog extends InjectingDialogFragment { final List themes = Arrays.asList(context.getResources().getStringArray(getNameRes())); - adapter = new SingleCheckedArrayAdapter(context, R.layout.color_selection_row, themes, theme.getThemeAccent()) { - @NonNull - @SuppressLint("NewApi") + adapter = new SingleCheckedArrayAdapter(context, themes, theme.getThemeAccent()) { @Override - public View getView(int position, View convertView, @NonNull ViewGroup parent) { - CheckedTextView textView = (CheckedTextView) super.getView(position, convertView, parent); - Drawable original = ContextCompat.getDrawable(context, preferences.hasPurchase(R.string.p_purchased_themes) || position < getNumFree() + protected int getDrawable(int position) { + return preferences.hasPurchase(R.string.p_purchased_themes) || position < getNumFree() ? R.drawable.ic_lens_black_24dp - : R.drawable.ic_vpn_key_black_24dp); - Drawable wrapped = DrawableCompat.wrap(original.mutate()); - DrawableCompat.setTint(wrapped, getDisplayColor(position)); - if (atLeastJellybeanMR1()) { - textView.setCompoundDrawablesRelativeWithIntrinsicBounds(wrapped, null, null, null); - } else { - textView.setCompoundDrawablesWithIntrinsicBounds(wrapped, null, null, null); - } - return textView; + : R.drawable.ic_vpn_key_black_24dp; + } + + @Override + protected int getDrawableColor(int position) { + return getDisplayColor(position); } }; adapter.setChecked(getCurrentSelection()); diff --git a/app/src/main/java/org/tasks/locale/LocalePickerDialog.java b/app/src/main/java/org/tasks/locale/LocalePickerDialog.java index cf4fa6a4c..fd779495f 100644 --- a/app/src/main/java/org/tasks/locale/LocalePickerDialog.java +++ b/app/src/main/java/org/tasks/locale/LocalePickerDialog.java @@ -2,12 +2,16 @@ package org.tasks.locale; import android.app.Activity; import android.app.Dialog; +import android.content.Context; import android.os.Bundle; import org.tasks.R; import org.tasks.dialogs.DialogBuilder; +import org.tasks.injection.ForActivity; import org.tasks.injection.InjectingNativeDialogFragment; import org.tasks.injection.NativeDialogFragmentComponent; +import org.tasks.themes.ThemeAccent; +import org.tasks.ui.SingleCheckedArrayAdapter; import java.util.ArrayList; import java.util.List; @@ -27,7 +31,9 @@ public class LocalePickerDialog extends InjectingNativeDialogFragment { void onLocaleSelected(Locale locale); } + @Inject @ForActivity Context context; @Inject DialogBuilder dialogBuilder; + @Inject ThemeAccent themeAccent; @Inject Locale locale; private LocaleSelectionHandler callback; @@ -40,12 +46,13 @@ public class LocalePickerDialog extends InjectingNativeDialogFragment { locales.add(locale.withLanguage(override)); } final List display = transform(locales, Locale::getDisplayName); + SingleCheckedArrayAdapter adapter = new SingleCheckedArrayAdapter(context, display, themeAccent); + adapter.setChecked(display.indexOf(locale.getDisplayName())); return dialogBuilder.newDialog() - .setItems(display, (dialogInterface, i) -> { - dialogInterface.dismiss(); + .setSingleChoiceItems(adapter, -1, (dialogInterface, i) -> { callback.onLocaleSelected(locales.get(i)); + dialogInterface.dismiss(); }) - .setNegativeButton(android.R.string.cancel, null) .show(); } diff --git a/app/src/main/java/org/tasks/ui/SingleCheckedArrayAdapter.java b/app/src/main/java/org/tasks/ui/SingleCheckedArrayAdapter.java index f1d70ee4e..0f35727a5 100644 --- a/app/src/main/java/org/tasks/ui/SingleCheckedArrayAdapter.java +++ b/app/src/main/java/org/tasks/ui/SingleCheckedArrayAdapter.java @@ -16,6 +16,7 @@ import org.tasks.themes.ThemeAccent; import java.util.List; +import static com.todoroo.andlib.utility.AndroidUtilities.atLeastJellybeanMR1; import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop; public class SingleCheckedArrayAdapter extends ArrayAdapter { @@ -26,11 +27,7 @@ public class SingleCheckedArrayAdapter extends ArrayAdapter { private int checkedPosition = -1; public SingleCheckedArrayAdapter(@NonNull Context context, @NonNull List items, ThemeAccent accent) { - this(context, R.layout.simple_list_item_single_choice_themed, items, accent); - } - - public SingleCheckedArrayAdapter(@NonNull Context context, int layout, @NonNull List items, ThemeAccent accent) { - super(context, layout, items); + super(context, R.layout.simple_list_item_single_choice_themed, items); this.context = context; this.items = items; this.accent = accent; @@ -42,9 +39,9 @@ public class SingleCheckedArrayAdapter extends ArrayAdapter { CheckedTextView view = (CheckedTextView) super.getView(position, convertView, parent); if (this.checkedPosition == position) { if (atLeastLollipop()) { - view.setCheckMarkDrawable(R.drawable.ic_check_white_24dp); + view.setCheckMarkDrawable(R.drawable.ic_check_black_24dp); } else { - Drawable original = ContextCompat.getDrawable(context, R.drawable.ic_check_white_24dp); + Drawable original = ContextCompat.getDrawable(context, R.drawable.ic_check_black_24dp); Drawable wrapped = DrawableCompat.wrap(original.mutate()); DrawableCompat.setTint(wrapped, accent.getAccentColor()); view.setCheckMarkDrawable(wrapped); @@ -54,9 +51,29 @@ public class SingleCheckedArrayAdapter extends ArrayAdapter { view.setCheckMarkDrawable(null); view.setChecked(false); } + int drawable = getDrawable(position); + if (drawable > 0) { + int color = getDrawableColor(position); + Drawable original = ContextCompat.getDrawable(context, drawable); + Drawable wrapped = DrawableCompat.wrap(original.mutate()); + DrawableCompat.setTint(wrapped, color); + if (atLeastJellybeanMR1()) { + view.setCompoundDrawablesRelativeWithIntrinsicBounds(wrapped, null, null, null); + } else { + view.setCompoundDrawablesWithIntrinsicBounds(wrapped, null, null, null); + } + } return view; } + protected int getDrawable(int position) { + return 0; + } + + protected int getDrawableColor(int position) { + return 0; + } + public void setChecked(String item) { setChecked(items.indexOf(item)); } diff --git a/app/src/main/res/drawable/ic_check_black_24dp.xml b/app/src/main/res/drawable/ic_check_black_24dp.xml new file mode 100644 index 000000000..b006da99a --- /dev/null +++ b/app/src/main/res/drawable/ic_check_black_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/color_selection_row.xml b/app/src/main/res/layout/color_selection_row.xml deleted file mode 100644 index 33ac99cdc..000000000 --- a/app/src/main/res/layout/color_selection_row.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - diff --git a/app/src/main/res/layout/simple_list_item_single_choice_themed.xml b/app/src/main/res/layout/simple_list_item_single_choice_themed.xml index 2f847e17c..d6df106f5 100644 --- a/app/src/main/res/layout/simple_list_item_single_choice_themed.xml +++ b/app/src/main/res/layout/simple_list_item_single_choice_themed.xml @@ -16,7 +16,7 @@