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));
dialog.dismiss();
})
.setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss())
.show();
}

@ -201,7 +201,7 @@ public class RepeatControlSet extends TaskEditControlFragment
void openPopup(View view) {
boolean customPicked = isCustomValue();
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) {
adapter.insert(getRepeatString(), 0);
adapter.setChecked(0);

@ -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)))

@ -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;

@ -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<String> 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<String> themes = Arrays.asList(context.getResources().getStringArray(getNameRes()));
final LayoutInflater inflater = theme.getLayoutInflater(context);
adapter = new ArrayAdapter<String>(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:

@ -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);
}

@ -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;
}
}

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

@ -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;
}
}

@ -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<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;
public SingleCheckedArrayAdapter(@NonNull Context context, @NonNull List<T> items) {
super(context, R.layout.simple_list_item_single_choice_themed, items);
public SingleCheckedArrayAdapter(@NonNull Context context, @NonNull List<String> items, ThemeAccent accent) {
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.accent = accent;
}
@NonNull
@ -27,7 +41,14 @@ public class SingleCheckedArrayAdapter<T> extends ArrayAdapter<T> {
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<T> extends ArrayAdapter<T> {
return view;
}
public void setChecked(T item) {
public void setChecked(String item) {
setChecked(items.indexOf(item));
}

@ -13,10 +13,12 @@
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:layout_width="match_parent"
android:layout_height="wrap_content"
android:checkMark="@drawable/ic_check_white_24dp"
android:checkMarkTint="?colorAccent"
android:drawablePadding="@dimen/keyline_second"
android:gravity="start|center_vertical"
android:textAlignment="viewStart"

Loading…
Cancel
Save