diff --git a/app/src/googleplay/java/org/tasks/activities/SupportGoogleTaskListPicker.java b/app/src/googleplay/java/org/tasks/activities/SupportGoogleTaskListPicker.java index b188d7a26..775d63230 100644 --- a/app/src/googleplay/java/org/tasks/activities/SupportGoogleTaskListPicker.java +++ b/app/src/googleplay/java/org/tasks/activities/SupportGoogleTaskListPicker.java @@ -110,7 +110,6 @@ public class SupportGoogleTaskListPicker extends InjectingDialogFragment { handler.selectedList(lists.get(which)); dialog.dismiss(); }) - .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss()) .show(); } diff --git a/app/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.java b/app/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.java index adf595737..4f6a6619a 100644 --- a/app/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.java +++ b/app/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.java @@ -201,7 +201,7 @@ public class RepeatControlSet extends TaskEditControlFragment void openPopup(View view) { boolean customPicked = isCustomValue(); List repeatOptions = newArrayList(context.getResources().getStringArray(R.array.repeat_options)); - SingleCheckedArrayAdapter adapter = new SingleCheckedArrayAdapter<>(context, repeatOptions); + SingleCheckedArrayAdapter adapter = new SingleCheckedArrayAdapter(context, repeatOptions, theme.getThemeAccent()); if (customPicked) { adapter.insert(getRepeatString(), 0); adapter.setChecked(0); diff --git a/app/src/main/java/org/tasks/activities/CalendarSelectionDialog.java b/app/src/main/java/org/tasks/activities/CalendarSelectionDialog.java index 0671881b3..27788bd5b 100644 --- a/app/src/main/java/org/tasks/activities/CalendarSelectionDialog.java +++ b/app/src/main/java/org/tasks/activities/CalendarSelectionDialog.java @@ -68,7 +68,7 @@ public class CalendarSelectionDialog extends InjectingDialogFragment { selected = arguments.getString(EXTRA_SELECTED); theme.applyToContext(getActivity()); - adapter = new SingleCheckedArrayAdapter(getActivity(), calendarNames); + adapter = new SingleCheckedArrayAdapter(getActivity(), calendarNames, theme.getThemeAccent()); AlertDialogBuilder builder = dialogBuilder.newDialog() .setSingleChoiceItems(adapter, -1, (dialog, which) -> handler.selectedCalendar(calendars.get(which))) diff --git a/app/src/main/java/org/tasks/activities/ColorPickerActivity.java b/app/src/main/java/org/tasks/activities/ColorPickerActivity.java index ae2c7d4a9..2e2ae768e 100644 --- a/app/src/main/java/org/tasks/activities/ColorPickerActivity.java +++ b/app/src/main/java/org/tasks/activities/ColorPickerActivity.java @@ -9,13 +9,13 @@ import org.tasks.billing.PurchaseHelperCallback; import org.tasks.dialogs.ColorPickerDialog; import org.tasks.dialogs.ColorPickerDialog.ColorPalette; import org.tasks.injection.ActivityComponent; -import org.tasks.injection.InjectingAppCompatActivity; +import org.tasks.injection.ThemedInjectingAppCompatActivity; import javax.inject.Inject; import static org.tasks.dialogs.ColorPickerDialog.newColorPickerDialog; -public class ColorPickerActivity extends InjectingAppCompatActivity implements ColorPickerDialog.ThemePickerCallback, PurchaseHelperCallback { +public class ColorPickerActivity extends ThemedInjectingAppCompatActivity implements ColorPickerDialog.ThemePickerCallback, PurchaseHelperCallback { private static final String FRAG_TAG_COLOR_PICKER = "frag_tag_color_picker"; private static final int REQUEST_PURCHASE = 1006; diff --git a/app/src/main/java/org/tasks/dialogs/ColorPickerDialog.java b/app/src/main/java/org/tasks/dialogs/ColorPickerDialog.java index 424acb548..23332cd50 100644 --- a/app/src/main/java/org/tasks/dialogs/ColorPickerDialog.java +++ b/app/src/main/java/org/tasks/dialogs/ColorPickerDialog.java @@ -11,11 +11,9 @@ 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.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.TextView; +import android.widget.CheckedTextView; import org.tasks.R; import org.tasks.injection.DialogFragmentComponent; @@ -24,6 +22,10 @@ import org.tasks.injection.InjectingDialogFragment; import org.tasks.preferences.Preferences; import org.tasks.themes.Theme; import org.tasks.themes.ThemeCache; +import org.tasks.ui.SingleCheckedArrayAdapter; + +import java.util.Arrays; +import java.util.List; import javax.inject.Inject; @@ -61,7 +63,7 @@ public class ColorPickerDialog extends InjectingDialogFragment { private ColorPalette palette; private ThemePickerCallback callback; - private ArrayAdapter adapter; + private SingleCheckedArrayAdapter adapter; private Dialog dialog; @Override @@ -72,21 +74,14 @@ public class ColorPickerDialog extends InjectingDialogFragment { palette = (ColorPalette) arguments.getSerializable(EXTRA_PALETTE); boolean showNone = arguments.getBoolean(EXTRA_SHOW_NONE); - if (palette == ColorPickerDialog.ColorPalette.THEMES || palette == ColorPickerDialog.ColorPalette.WIDGET_BACKGROUND) { - theme = theme.withBaseTheme(themeCache.getThemeBase(2)); - } - - final String[] themes = context.getResources().getStringArray(getNameRes()); + final List themes = Arrays.asList(context.getResources().getStringArray(getNameRes())); - final LayoutInflater inflater = theme.getLayoutInflater(context); - adapter = new ArrayAdapter(context, R.layout.color_selection_row, themes) { + adapter = new SingleCheckedArrayAdapter(context, R.layout.color_selection_row, themes, theme.getThemeAccent()) { @NonNull @SuppressLint("NewApi") @Override public View getView(int position, View convertView, @NonNull ViewGroup parent) { - TextView textView = (TextView) (convertView == null - ? inflater.inflate(R.layout.color_selection_row, parent, false) - : convertView); + CheckedTextView textView = (CheckedTextView) super.getView(position, convertView, parent); Drawable original = ContextCompat.getDrawable(context, preferences.hasPurchase(R.string.p_purchased_themes) || position < getNumFree() ? R.drawable.ic_lens_black_24dp : R.drawable.ic_vpn_key_black_24dp); @@ -97,10 +92,10 @@ public class ColorPickerDialog extends InjectingDialogFragment { } else { textView.setCompoundDrawablesWithIntrinsicBounds(wrapped, null, null, null); } - textView.setText(themes[position]); return textView; } }; + adapter.setChecked(getCurrentSelection()); AlertDialogBuilder builder = dialogBuilder.newDialog(theme) .setAdapter(adapter, (dialog, which) -> { @@ -110,7 +105,7 @@ public class ColorPickerDialog extends InjectingDialogFragment { callback.initiateThemePurchase(); } }) - .setNegativeButton(android.R.string.cancel, (dialogInterface, i) -> callback.dismissed()); + .setOnDismissListener(dialogInterface -> callback.dismissed()); if (showNone) { builder.setNeutralButton(R.string.none, (dialogInterface, i) -> callback.themePicked(palette, -1)); } @@ -147,6 +142,17 @@ public class ColorPickerDialog extends InjectingDialogFragment { component.inject(this); } + private int getCurrentSelection() { + switch (palette) { + case COLORS: + return theme.getThemeColor().getIndex(); + case ACCENTS: + return theme.getThemeAccent().getIndex(); + default: + return theme.getThemeBase().getIndex(); + } + } + private int getNameRes() { switch (palette) { case COLORS: diff --git a/app/src/main/java/org/tasks/themes/Theme.java b/app/src/main/java/org/tasks/themes/Theme.java index 637cddb79..029186735 100644 --- a/app/src/main/java/org/tasks/themes/Theme.java +++ b/app/src/main/java/org/tasks/themes/Theme.java @@ -24,10 +24,6 @@ public class Theme { this.themeAccent = themeAccent; } - public Theme withBaseTheme(ThemeBase themeBase) { - return new Theme(themeBase, themeColor, themeAccent); - } - public Theme withThemeColor(ThemeColor themeColor) { return new Theme(themeBase, themeColor, themeAccent); } diff --git a/app/src/main/java/org/tasks/themes/ThemeAccent.java b/app/src/main/java/org/tasks/themes/ThemeAccent.java index fb1389751..5de1fb62d 100644 --- a/app/src/main/java/org/tasks/themes/ThemeAccent.java +++ b/app/src/main/java/org/tasks/themes/ThemeAccent.java @@ -27,11 +27,13 @@ public class ThemeAccent { }; 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; + this.index = index; this.style = ACCENTS[index]; this.accentColor = accentColor; } @@ -47,4 +49,8 @@ public class ThemeAccent { public int getAccentColor() { return accentColor; } + + public int getIndex() { + return index; + } } diff --git a/app/src/main/java/org/tasks/themes/ThemeBase.java b/app/src/main/java/org/tasks/themes/ThemeBase.java index 894e5074a..364e7664a 100644 --- a/app/src/main/java/org/tasks/themes/ThemeBase.java +++ b/app/src/main/java/org/tasks/themes/ThemeBase.java @@ -61,4 +61,8 @@ public class ThemeBase { public void setDefaultNightMode() { AppCompatDelegate.setDefaultNightMode(dayNightMode); } + + public int getIndex() { + return index; + } } diff --git a/app/src/main/java/org/tasks/themes/ThemeColor.java b/app/src/main/java/org/tasks/themes/ThemeColor.java index 89369537e..45a63d7e1 100644 --- a/app/src/main/java/org/tasks/themes/ThemeColor.java +++ b/app/src/main/java/org/tasks/themes/ThemeColor.java @@ -42,6 +42,7 @@ public class ThemeColor { }; private final String name; + private final int index; private final int actionBarTint; private final int style; private final int colorPrimary; @@ -50,6 +51,7 @@ public class ThemeColor { public ThemeColor(String name, int index, int colorPrimary, int colorPrimaryDark, int actionBarTint, boolean isDark) { this.name = name; + this.index = index; this.actionBarTint = actionBarTint; this.style = COLORS[index]; this.colorPrimary = colorPrimary; @@ -124,4 +126,8 @@ public class ThemeColor { toolbar.setBackgroundColor(getPrimaryColor()); MenuColorizer.colorToolbar(toolbar, actionBarTint); } + + public int getIndex() { + return index; + } } diff --git a/app/src/main/java/org/tasks/ui/SingleCheckedArrayAdapter.java b/app/src/main/java/org/tasks/ui/SingleCheckedArrayAdapter.java index 47490af38..f1d70ee4e 100644 --- a/app/src/main/java/org/tasks/ui/SingleCheckedArrayAdapter.java +++ b/app/src/main/java/org/tasks/ui/SingleCheckedArrayAdapter.java @@ -1,25 +1,39 @@ package org.tasks.ui; import android.content.Context; +import android.graphics.drawable.Drawable; 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.ArrayAdapter; import android.widget.CheckedTextView; import org.tasks.R; +import org.tasks.themes.ThemeAccent; import java.util.List; -public class SingleCheckedArrayAdapter extends ArrayAdapter { +import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop; - private final List items; +public class SingleCheckedArrayAdapter extends ArrayAdapter { + + @NonNull private final Context context; + private final List items; + private final ThemeAccent accent; private int checkedPosition = -1; - public SingleCheckedArrayAdapter(@NonNull Context context, @NonNull List items) { - super(context, R.layout.simple_list_item_single_choice_themed, items); + 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); + this.context = context; this.items = items; + this.accent = accent; } @NonNull @@ -27,7 +41,14 @@ public class SingleCheckedArrayAdapter extends ArrayAdapter { public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { CheckedTextView view = (CheckedTextView) super.getView(position, convertView, parent); if (this.checkedPosition == position) { - view.setCheckMarkDrawable(R.drawable.ic_check_white_24dp); + if (atLeastLollipop()) { + view.setCheckMarkDrawable(R.drawable.ic_check_white_24dp); + } else { + Drawable original = ContextCompat.getDrawable(context, R.drawable.ic_check_white_24dp); + Drawable wrapped = DrawableCompat.wrap(original.mutate()); + DrawableCompat.setTint(wrapped, accent.getAccentColor()); + view.setCheckMarkDrawable(wrapped); + } view.setChecked(true); } else { view.setCheckMarkDrawable(null); @@ -36,7 +57,7 @@ public class SingleCheckedArrayAdapter extends ArrayAdapter { return view; } - public void setChecked(T item) { + public void setChecked(String item) { setChecked(items.indexOf(item)); } diff --git a/app/src/main/res/layout/color_selection_row.xml b/app/src/main/res/layout/color_selection_row.xml index c1371a8ce..33ac99cdc 100644 --- a/app/src/main/res/layout/color_selection_row.xml +++ b/app/src/main/res/layout/color_selection_row.xml @@ -13,10 +13,12 @@ limitations under the License. --> -