Add checkmark to locale picker

pull/574/head
Alex Baker 7 years ago
parent 712a865cbd
commit 4fa5e7283b

@ -12,6 +12,7 @@ import org.tasks.dialogs.DialogBuilder;
import org.tasks.gtasks.GoogleTaskListSelectionHandler; import org.tasks.gtasks.GoogleTaskListSelectionHandler;
import org.tasks.injection.InjectingNativeDialogFragment; import org.tasks.injection.InjectingNativeDialogFragment;
import org.tasks.injection.NativeDialogFragmentComponent; import org.tasks.injection.NativeDialogFragmentComponent;
import org.tasks.themes.ThemeAccent;
import org.tasks.themes.ThemeCache; import org.tasks.themes.ThemeCache;
import javax.inject.Inject; import javax.inject.Inject;
@ -35,6 +36,7 @@ public class NativeGoogleTaskListPicker extends InjectingNativeDialogFragment {
@Inject DialogBuilder dialogBuilder; @Inject DialogBuilder dialogBuilder;
@Inject GtasksListService gtasksListService; @Inject GtasksListService gtasksListService;
@Inject ThemeCache themeCache; @Inject ThemeCache themeCache;
@Inject ThemeAccent themeAccent;
private GoogleTaskListSelectionHandler handler; private GoogleTaskListSelectionHandler handler;
@ -47,7 +49,7 @@ public class NativeGoogleTaskListPicker extends InjectingNativeDialogFragment {
selected = new GtasksList(storeObject); selected = new GtasksList(storeObject);
} }
return createDialog(getActivity(), themeCache, dialogBuilder, gtasksListService, return createDialog(getActivity(), themeCache, dialogBuilder, gtasksListService,
selected, list -> handler.selectedList(list)); selected, themeAccent, list -> handler.selectedList(list));
} }
@Override @Override

@ -1,19 +1,11 @@
package org.tasks.activities; package org.tasks.activities;
import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context; import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.NonNull; 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.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.data.StoreObject;
import com.todoroo.astrid.gtasks.GtasksList; import com.todoroo.astrid.gtasks.GtasksList;
@ -24,14 +16,16 @@ import org.tasks.dialogs.DialogBuilder;
import org.tasks.gtasks.GoogleTaskListSelectionHandler; import org.tasks.gtasks.GoogleTaskListSelectionHandler;
import org.tasks.injection.DialogFragmentComponent; import org.tasks.injection.DialogFragmentComponent;
import org.tasks.injection.InjectingDialogFragment; import org.tasks.injection.InjectingDialogFragment;
import org.tasks.themes.ThemeAccent;
import org.tasks.themes.ThemeCache; import org.tasks.themes.ThemeCache;
import org.tasks.themes.ThemeColor; import org.tasks.themes.ThemeColor;
import org.tasks.ui.SingleCheckedArrayAdapter;
import java.util.List; import java.util.List;
import javax.inject.Inject; 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 { public class SupportGoogleTaskListPicker extends InjectingDialogFragment {
@ -50,6 +44,7 @@ public class SupportGoogleTaskListPicker extends InjectingDialogFragment {
@Inject DialogBuilder dialogBuilder; @Inject DialogBuilder dialogBuilder;
@Inject GtasksListService gtasksListService; @Inject GtasksListService gtasksListService;
@Inject ThemeCache themeCache; @Inject ThemeCache themeCache;
@Inject ThemeAccent themeAccent;
private GoogleTaskListSelectionHandler handler; private GoogleTaskListSelectionHandler handler;
@ -63,7 +58,7 @@ public class SupportGoogleTaskListPicker extends InjectingDialogFragment {
selected = new GtasksList(storeObject); selected = new GtasksList(storeObject);
} }
return createDialog(getActivity(), themeCache, dialogBuilder, gtasksListService, return createDialog(getActivity(), themeCache, dialogBuilder, gtasksListService,
selected, list -> handler.selectedList(list)); selected, themeAccent, list -> handler.selectedList(list));
} }
@Override @Override
@ -75,36 +70,25 @@ public class SupportGoogleTaskListPicker extends InjectingDialogFragment {
public static AlertDialog createDialog(Context context, ThemeCache themeCache, public static AlertDialog createDialog(Context context, ThemeCache themeCache,
DialogBuilder dialogBuilder, GtasksListService gtasksListService, DialogBuilder dialogBuilder, GtasksListService gtasksListService,
GtasksList selected, final GoogleTaskListSelectionHandler handler) { GtasksList selected, ThemeAccent themeAccent,
final GoogleTaskListSelectionHandler handler) {
final List<GtasksList> lists = gtasksListService.getLists(); final List<GtasksList> lists = gtasksListService.getLists();
ArrayAdapter<GtasksList> adapter = new ArrayAdapter<GtasksList>(context, R.layout.simple_list_item_single_choice_themed, lists) { List<String> listNames = transform(lists, GtasksList::getName);
@SuppressLint("NewApi") SingleCheckedArrayAdapter adapter = new SingleCheckedArrayAdapter(context, listNames, themeAccent) {
@NonNull
@Override @Override
public View getView(int position, View convertView, ViewGroup parent) { protected int getDrawable(int position) {
CheckedTextView view = (CheckedTextView) super.getView(position, convertView, parent); return R.drawable.ic_cloud_black_24dp;
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);
} }
@Override
protected int getDrawableColor(int position) {
GtasksList list = lists.get(position);
int color = list.getColor(); int color = list.getColor();
ThemeColor themeColor = themeCache.getThemeColor(color >= 0 ? color : 19); ThemeColor themeColor = themeCache.getThemeColor(color >= 0 ? color : 19);
view.setText(list.getName()); return themeColor.getPrimaryColor();
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;
} }
}; };
adapter.setChecked(selected.getName());
return dialogBuilder.newDialog() return dialogBuilder.newDialog()
.setSingleChoiceItems(adapter, -1, (dialog, which) -> { .setSingleChoiceItems(adapter, -1, (dialog, which) -> {
handler.selectedList(lists.get(which)); handler.selectedList(lists.get(which));

@ -1,19 +1,12 @@
package org.tasks.dialogs; package org.tasks.dialogs;
import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
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.ViewGroup;
import android.widget.CheckedTextView;
import org.tasks.R; import org.tasks.R;
import org.tasks.injection.DialogFragmentComponent; import org.tasks.injection.DialogFragmentComponent;
@ -29,8 +22,6 @@ import java.util.List;
import javax.inject.Inject; import javax.inject.Inject;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastJellybeanMR1;
public class ColorPickerDialog extends InjectingDialogFragment { public class ColorPickerDialog extends InjectingDialogFragment {
private static final String EXTRA_PALETTE = "extra_palette"; private static final String EXTRA_PALETTE = "extra_palette";
@ -76,23 +67,17 @@ public class ColorPickerDialog extends InjectingDialogFragment {
final List<String> themes = Arrays.asList(context.getResources().getStringArray(getNameRes())); final List<String> themes = Arrays.asList(context.getResources().getStringArray(getNameRes()));
adapter = new SingleCheckedArrayAdapter(context, R.layout.color_selection_row, themes, theme.getThemeAccent()) { adapter = new SingleCheckedArrayAdapter(context, themes, theme.getThemeAccent()) {
@NonNull
@SuppressLint("NewApi")
@Override @Override
public View getView(int position, View convertView, @NonNull ViewGroup parent) { protected int getDrawable(int position) {
CheckedTextView textView = (CheckedTextView) super.getView(position, convertView, parent); return 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;
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;
@Override
protected int getDrawableColor(int position) {
return getDisplayColor(position);
} }
}; };
adapter.setChecked(getCurrentSelection()); adapter.setChecked(getCurrentSelection());

@ -2,12 +2,16 @@ package org.tasks.locale;
import android.app.Activity; import android.app.Activity;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import org.tasks.R; import org.tasks.R;
import org.tasks.dialogs.DialogBuilder; import org.tasks.dialogs.DialogBuilder;
import org.tasks.injection.ForActivity;
import org.tasks.injection.InjectingNativeDialogFragment; import org.tasks.injection.InjectingNativeDialogFragment;
import org.tasks.injection.NativeDialogFragmentComponent; import org.tasks.injection.NativeDialogFragmentComponent;
import org.tasks.themes.ThemeAccent;
import org.tasks.ui.SingleCheckedArrayAdapter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -27,7 +31,9 @@ public class LocalePickerDialog extends InjectingNativeDialogFragment {
void onLocaleSelected(Locale locale); void onLocaleSelected(Locale locale);
} }
@Inject @ForActivity Context context;
@Inject DialogBuilder dialogBuilder; @Inject DialogBuilder dialogBuilder;
@Inject ThemeAccent themeAccent;
@Inject Locale locale; @Inject Locale locale;
private LocaleSelectionHandler callback; private LocaleSelectionHandler callback;
@ -40,12 +46,13 @@ public class LocalePickerDialog extends InjectingNativeDialogFragment {
locales.add(locale.withLanguage(override)); locales.add(locale.withLanguage(override));
} }
final List<String> display = transform(locales, Locale::getDisplayName); final List<String> display = transform(locales, Locale::getDisplayName);
SingleCheckedArrayAdapter adapter = new SingleCheckedArrayAdapter(context, display, themeAccent);
adapter.setChecked(display.indexOf(locale.getDisplayName()));
return dialogBuilder.newDialog() return dialogBuilder.newDialog()
.setItems(display, (dialogInterface, i) -> { .setSingleChoiceItems(adapter, -1, (dialogInterface, i) -> {
dialogInterface.dismiss();
callback.onLocaleSelected(locales.get(i)); callback.onLocaleSelected(locales.get(i));
dialogInterface.dismiss();
}) })
.setNegativeButton(android.R.string.cancel, null)
.show(); .show();
} }

@ -16,6 +16,7 @@ import org.tasks.themes.ThemeAccent;
import java.util.List; import java.util.List;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastJellybeanMR1;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop; import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop;
public class SingleCheckedArrayAdapter extends ArrayAdapter<String> { public class SingleCheckedArrayAdapter extends ArrayAdapter<String> {
@ -26,11 +27,7 @@ public class SingleCheckedArrayAdapter extends ArrayAdapter<String> {
private int checkedPosition = -1; private int checkedPosition = -1;
public SingleCheckedArrayAdapter(@NonNull Context context, @NonNull List<String> items, ThemeAccent accent) { public SingleCheckedArrayAdapter(@NonNull Context context, @NonNull List<String> items, ThemeAccent accent) {
this(context, R.layout.simple_list_item_single_choice_themed, items, accent); super(context, R.layout.simple_list_item_single_choice_themed, items);
}
public SingleCheckedArrayAdapter(@NonNull Context context, int layout, @NonNull List<String> items, ThemeAccent accent) {
super(context, layout, items);
this.context = context; this.context = context;
this.items = items; this.items = items;
this.accent = accent; this.accent = accent;
@ -42,9 +39,9 @@ public class SingleCheckedArrayAdapter extends ArrayAdapter<String> {
CheckedTextView view = (CheckedTextView) super.getView(position, convertView, parent); CheckedTextView view = (CheckedTextView) super.getView(position, convertView, parent);
if (this.checkedPosition == position) { if (this.checkedPosition == position) {
if (atLeastLollipop()) { if (atLeastLollipop()) {
view.setCheckMarkDrawable(R.drawable.ic_check_white_24dp); view.setCheckMarkDrawable(R.drawable.ic_check_black_24dp);
} else { } 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()); Drawable wrapped = DrawableCompat.wrap(original.mutate());
DrawableCompat.setTint(wrapped, accent.getAccentColor()); DrawableCompat.setTint(wrapped, accent.getAccentColor());
view.setCheckMarkDrawable(wrapped); view.setCheckMarkDrawable(wrapped);
@ -54,9 +51,29 @@ public class SingleCheckedArrayAdapter extends ArrayAdapter<String> {
view.setCheckMarkDrawable(null); view.setCheckMarkDrawable(null);
view.setChecked(false); 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; return view;
} }
protected int getDrawable(int position) {
return 0;
}
protected int getDrawableColor(int position) {
return 0;
}
public void setChecked(String item) { public void setChecked(String item) {
setChecked(items.indexOf(item)); setChecked(items.indexOf(item));
} }

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>
</vector>

@ -1,30 +0,0 @@
<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2006 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<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"
android:minHeight="?attr/listPreferredItemHeightSmall"
android:paddingEnd="@dimen/keyline_first"
android:paddingLeft="@dimen/keyline_first"
android:paddingRight="@dimen/keyline_first"
android:paddingStart="@dimen/keyline_first"
android:textAppearance="?attr/textAppearanceListItemSmall" />

@ -16,7 +16,7 @@
<android.support.v7.widget.AppCompatCheckedTextView 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:checkMark="@drawable/ic_check_white_24dp" android:checkMark="@drawable/ic_check_black_24dp"
android:checkMarkTint="?colorAccent" android:checkMarkTint="?colorAccent"
android:checked="false" android:checked="false"
android:layout_height="?android:attr/listPreferredItemHeightSmall" android:layout_height="?android:attr/listPreferredItemHeightSmall"

Loading…
Cancel
Save