Add checkmark to color picker

Add support for checkmarks in lists on pre-lollipop devices
pull/574/head
Alex Baker 7 years ago
parent 7ece10726f
commit c5f5519b14

@ -110,7 +110,6 @@ public class SupportGoogleTaskListPicker extends InjectingDialogFragment {
handler.selectedList(lists.get(which)); handler.selectedList(lists.get(which));
dialog.dismiss(); dialog.dismiss();
}) })
.setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss())
.show(); .show();
} }

@ -201,7 +201,7 @@ public class RepeatControlSet extends TaskEditControlFragment
void openPopup(View view) { void openPopup(View view) {
boolean customPicked = isCustomValue(); boolean customPicked = isCustomValue();
List<String> repeatOptions = newArrayList(context.getResources().getStringArray(R.array.repeat_options)); List<String> repeatOptions = newArrayList(context.getResources().getStringArray(R.array.repeat_options));
SingleCheckedArrayAdapter<String> adapter = new SingleCheckedArrayAdapter<>(context, repeatOptions); SingleCheckedArrayAdapter adapter = new SingleCheckedArrayAdapter(context, repeatOptions, theme.getThemeAccent());
if (customPicked) { if (customPicked) {
adapter.insert(getRepeatString(), 0); adapter.insert(getRepeatString(), 0);
adapter.setChecked(0); adapter.setChecked(0);

@ -68,7 +68,7 @@ public class CalendarSelectionDialog extends InjectingDialogFragment {
selected = arguments.getString(EXTRA_SELECTED); selected = arguments.getString(EXTRA_SELECTED);
theme.applyToContext(getActivity()); theme.applyToContext(getActivity());
adapter = new SingleCheckedArrayAdapter(getActivity(), calendarNames); adapter = new SingleCheckedArrayAdapter(getActivity(), calendarNames, theme.getThemeAccent());
AlertDialogBuilder builder = dialogBuilder.newDialog() AlertDialogBuilder builder = dialogBuilder.newDialog()
.setSingleChoiceItems(adapter, -1, (dialog, which) -> handler.selectedCalendar(calendars.get(which))) .setSingleChoiceItems(adapter, -1, (dialog, which) -> handler.selectedCalendar(calendars.get(which)))

@ -9,13 +9,13 @@ import org.tasks.billing.PurchaseHelperCallback;
import org.tasks.dialogs.ColorPickerDialog; import org.tasks.dialogs.ColorPickerDialog;
import org.tasks.dialogs.ColorPickerDialog.ColorPalette; import org.tasks.dialogs.ColorPickerDialog.ColorPalette;
import org.tasks.injection.ActivityComponent; import org.tasks.injection.ActivityComponent;
import org.tasks.injection.InjectingAppCompatActivity; import org.tasks.injection.ThemedInjectingAppCompatActivity;
import javax.inject.Inject; import javax.inject.Inject;
import static org.tasks.dialogs.ColorPickerDialog.newColorPickerDialog; 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 String FRAG_TAG_COLOR_PICKER = "frag_tag_color_picker";
private static final int REQUEST_PURCHASE = 1006; private static final int REQUEST_PURCHASE = 1006;

@ -11,11 +11,9 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat; import android.support.v4.content.ContextCompat;
import android.support.v4.graphics.drawable.DrawableCompat; import android.support.v4.graphics.drawable.DrawableCompat;
import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ArrayAdapter; import android.widget.CheckedTextView;
import android.widget.TextView;
import org.tasks.R; import org.tasks.R;
import org.tasks.injection.DialogFragmentComponent; import org.tasks.injection.DialogFragmentComponent;
@ -24,6 +22,10 @@ import org.tasks.injection.InjectingDialogFragment;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import org.tasks.themes.Theme; import org.tasks.themes.Theme;
import org.tasks.themes.ThemeCache; import org.tasks.themes.ThemeCache;
import org.tasks.ui.SingleCheckedArrayAdapter;
import java.util.Arrays;
import java.util.List;
import javax.inject.Inject; import javax.inject.Inject;
@ -61,7 +63,7 @@ public class ColorPickerDialog extends InjectingDialogFragment {
private ColorPalette palette; private ColorPalette palette;
private ThemePickerCallback callback; private ThemePickerCallback callback;
private ArrayAdapter<String> adapter; private SingleCheckedArrayAdapter adapter;
private Dialog dialog; private Dialog dialog;
@Override @Override
@ -72,21 +74,14 @@ public class ColorPickerDialog extends InjectingDialogFragment {
palette = (ColorPalette) arguments.getSerializable(EXTRA_PALETTE); palette = (ColorPalette) arguments.getSerializable(EXTRA_PALETTE);
boolean showNone = arguments.getBoolean(EXTRA_SHOW_NONE); boolean showNone = arguments.getBoolean(EXTRA_SHOW_NONE);
if (palette == ColorPickerDialog.ColorPalette.THEMES || palette == ColorPickerDialog.ColorPalette.WIDGET_BACKGROUND) { final List<String> themes = Arrays.asList(context.getResources().getStringArray(getNameRes()));
theme = theme.withBaseTheme(themeCache.getThemeBase(2));
}
final String[] themes = context.getResources().getStringArray(getNameRes());
final LayoutInflater inflater = theme.getLayoutInflater(context); adapter = new SingleCheckedArrayAdapter(context, R.layout.color_selection_row, themes, theme.getThemeAccent()) {
adapter = new ArrayAdapter<String>(context, R.layout.color_selection_row, themes) {
@NonNull @NonNull
@SuppressLint("NewApi") @SuppressLint("NewApi")
@Override @Override
public View getView(int position, View convertView, @NonNull ViewGroup parent) { public View getView(int position, View convertView, @NonNull ViewGroup parent) {
TextView textView = (TextView) (convertView == null CheckedTextView textView = (CheckedTextView) super.getView(position, convertView, parent);
? inflater.inflate(R.layout.color_selection_row, parent, false)
: convertView);
Drawable original = ContextCompat.getDrawable(context, preferences.hasPurchase(R.string.p_purchased_themes) || position < getNumFree() Drawable original = ContextCompat.getDrawable(context, preferences.hasPurchase(R.string.p_purchased_themes) || position < getNumFree()
? R.drawable.ic_lens_black_24dp ? R.drawable.ic_lens_black_24dp
: R.drawable.ic_vpn_key_black_24dp); : R.drawable.ic_vpn_key_black_24dp);
@ -97,10 +92,10 @@ public class ColorPickerDialog extends InjectingDialogFragment {
} else { } else {
textView.setCompoundDrawablesWithIntrinsicBounds(wrapped, null, null, null); textView.setCompoundDrawablesWithIntrinsicBounds(wrapped, null, null, null);
} }
textView.setText(themes[position]);
return textView; return textView;
} }
}; };
adapter.setChecked(getCurrentSelection());
AlertDialogBuilder builder = dialogBuilder.newDialog(theme) AlertDialogBuilder builder = dialogBuilder.newDialog(theme)
.setAdapter(adapter, (dialog, which) -> { .setAdapter(adapter, (dialog, which) -> {
@ -110,7 +105,7 @@ public class ColorPickerDialog extends InjectingDialogFragment {
callback.initiateThemePurchase(); callback.initiateThemePurchase();
} }
}) })
.setNegativeButton(android.R.string.cancel, (dialogInterface, i) -> callback.dismissed()); .setOnDismissListener(dialogInterface -> callback.dismissed());
if (showNone) { if (showNone) {
builder.setNeutralButton(R.string.none, (dialogInterface, i) -> callback.themePicked(palette, -1)); builder.setNeutralButton(R.string.none, (dialogInterface, i) -> callback.themePicked(palette, -1));
} }
@ -147,6 +142,17 @@ public class ColorPickerDialog extends InjectingDialogFragment {
component.inject(this); 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() { private int getNameRes() {
switch (palette) { switch (palette) {
case COLORS: case COLORS:

@ -24,10 +24,6 @@ public class Theme {
this.themeAccent = themeAccent; this.themeAccent = themeAccent;
} }
public Theme withBaseTheme(ThemeBase themeBase) {
return new Theme(themeBase, themeColor, themeAccent);
}
public Theme withThemeColor(ThemeColor themeColor) { public Theme withThemeColor(ThemeColor themeColor) {
return new Theme(themeBase, themeColor, themeAccent); return new Theme(themeBase, themeColor, themeAccent);
} }

@ -27,11 +27,13 @@ public class ThemeAccent {
}; };
private final String name; private final String name;
private final int index;
private final int style; private final int style;
private final int accentColor; private final int accentColor;
public ThemeAccent(String name, int index, int accentColor) { public ThemeAccent(String name, int index, int accentColor) {
this.name = name; this.name = name;
this.index = index;
this.style = ACCENTS[index]; this.style = ACCENTS[index];
this.accentColor = accentColor; this.accentColor = accentColor;
} }
@ -47,4 +49,8 @@ public class ThemeAccent {
public int getAccentColor() { public int getAccentColor() {
return accentColor; return accentColor;
} }
public int getIndex() {
return index;
}
} }

@ -61,4 +61,8 @@ public class ThemeBase {
public void setDefaultNightMode() { public void setDefaultNightMode() {
AppCompatDelegate.setDefaultNightMode(dayNightMode); AppCompatDelegate.setDefaultNightMode(dayNightMode);
} }
public int getIndex() {
return index;
}
} }

@ -42,6 +42,7 @@ public class ThemeColor {
}; };
private final String name; private final String name;
private final int index;
private final int actionBarTint; private final int actionBarTint;
private final int style; private final int style;
private final int colorPrimary; 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) { public ThemeColor(String name, int index, int colorPrimary, int colorPrimaryDark, int actionBarTint, boolean isDark) {
this.name = name; this.name = name;
this.index = index;
this.actionBarTint = actionBarTint; this.actionBarTint = actionBarTint;
this.style = COLORS[index]; this.style = COLORS[index];
this.colorPrimary = colorPrimary; this.colorPrimary = colorPrimary;
@ -124,4 +126,8 @@ public class ThemeColor {
toolbar.setBackgroundColor(getPrimaryColor()); toolbar.setBackgroundColor(getPrimaryColor());
MenuColorizer.colorToolbar(toolbar, actionBarTint); MenuColorizer.colorToolbar(toolbar, actionBarTint);
} }
public int getIndex() {
return index;
}
} }

@ -1,25 +1,39 @@
package org.tasks.ui; package org.tasks.ui;
import android.content.Context; import android.content.Context;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; 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.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.CheckedTextView; import android.widget.CheckedTextView;
import org.tasks.R; import org.tasks.R;
import org.tasks.themes.ThemeAccent;
import java.util.List; import java.util.List;
public class SingleCheckedArrayAdapter<T> extends ArrayAdapter<T> { import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop;
private final List<T> items; public class SingleCheckedArrayAdapter extends ArrayAdapter<String> {
@NonNull private final Context context;
private final List<String> items;
private final ThemeAccent accent;
private int checkedPosition = -1; private int checkedPosition = -1;
public SingleCheckedArrayAdapter(@NonNull Context context, @NonNull List<T> items) { public SingleCheckedArrayAdapter(@NonNull Context context, @NonNull List<String> items, ThemeAccent accent) {
super(context, R.layout.simple_list_item_single_choice_themed, items); this(context, R.layout.simple_list_item_single_choice_themed, items, accent);
}
public SingleCheckedArrayAdapter(@NonNull Context context, int layout, @NonNull List<String> items, ThemeAccent accent) {
super(context, layout, items);
this.context = context;
this.items = items; this.items = items;
this.accent = accent;
} }
@NonNull @NonNull
@ -27,7 +41,14 @@ public class SingleCheckedArrayAdapter<T> extends ArrayAdapter<T> {
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
CheckedTextView view = (CheckedTextView) super.getView(position, convertView, parent); CheckedTextView view = (CheckedTextView) super.getView(position, convertView, parent);
if (this.checkedPosition == position) { 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); view.setChecked(true);
} else { } else {
view.setCheckMarkDrawable(null); view.setCheckMarkDrawable(null);
@ -36,7 +57,7 @@ public class SingleCheckedArrayAdapter<T> extends ArrayAdapter<T> {
return view; return view;
} }
public void setChecked(T item) { public void setChecked(String item) {
setChecked(items.indexOf(item)); setChecked(items.indexOf(item));
} }

@ -13,10 +13,12 @@
limitations under the License. limitations under the License.
--> -->
<TextView xmlns:android="http://schemas.android.com/apk/res/android" <android.support.v7.widget.AppCompatCheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1" android:id="@android:id/text1"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:checkMark="@drawable/ic_check_white_24dp"
android:checkMarkTint="?colorAccent"
android:drawablePadding="@dimen/keyline_second" android:drawablePadding="@dimen/keyline_second"
android:gravity="start|center_vertical" android:gravity="start|center_vertical"
android:textAlignment="viewStart" android:textAlignment="viewStart"

Loading…
Cancel
Save