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.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

@ -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<GtasksList> lists = gtasksListService.getLists();
ArrayAdapter<GtasksList> adapter = new ArrayAdapter<GtasksList>(context, R.layout.simple_list_item_single_choice_themed, lists) {
@SuppressLint("NewApi")
@NonNull
List<String> 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));

@ -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<String> 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());

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

@ -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<String> {
@ -26,11 +27,7 @@ public class SingleCheckedArrayAdapter extends ArrayAdapter<String> {
private int checkedPosition = -1;
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);
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<String> {
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<String> {
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));
}

@ -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:id="@android:id/text1"
android:layout_width="match_parent"
android:checkMark="@drawable/ic_check_white_24dp"
android:checkMark="@drawable/ic_check_black_24dp"
android:checkMarkTint="?colorAccent"
android:checked="false"
android:layout_height="?android:attr/listPreferredItemHeightSmall"

Loading…
Cancel
Save