Set checked on listview

pull/645/head
Alex Baker 6 years ago
parent 54ea6afbf5
commit 0ca7a89711

@ -83,11 +83,11 @@ public class SupportGoogleTaskListPicker extends InjectingDialogFragment {
: super.getDrawableColor(position);
}
};
if (selected != null) {
adapter.setChecked(selected.getTitle());
}
int selectedIndex = selected == null ? -1 : listNames.indexOf(selected.getTitle());
return dialogBuilder.newDialog()
.setSingleChoiceItems(adapter, -1, (dialog, which) -> {
.setSingleChoiceItems(adapter, selectedIndex, (dialog, which) -> {
handler.selectedList(lists.get(which));
dialog.dismiss();
})

@ -299,7 +299,7 @@
<activity
android:name=".activities.CalendarSelectionActivity"
android:theme="@style/TasksDialog" />
android:theme="@style/TranslucentDialog" />
<activity
android:name="com.todoroo.astrid.gcal.CalendarReminderActivity"

@ -234,13 +234,10 @@ public class RepeatControlSet extends TaskEditControlFragment
boolean customPicked = isCustomValue();
List<String> repeatOptions = newArrayList(context.getResources().getStringArray(R.array.repeat_options));
SingleCheckedArrayAdapter adapter = new SingleCheckedArrayAdapter(context, repeatOptions, theme.getThemeAccent());
int selected = 0;
if (customPicked) {
adapter.insert(repeatRuleToString.toString(rrule), 0);
adapter.setChecked(0);
} else if (rrule == null) {
adapter.setChecked(0);
} else {
int selected;
} else if (rrule != null) {
switch (rrule.getFreq()) {
case DAILY:
selected = 1;
@ -258,12 +255,12 @@ public class RepeatControlSet extends TaskEditControlFragment
selected = 0;
break;
}
adapter.setChecked(selected);
}
dialogBuilder.newDialog()
.setAdapter(adapter, (dialogInterface, i) -> {
.setSingleChoiceItems(adapter, selected, (dialogInterface, i) -> {
if (customPicked) {
if (i == 0) {
dialogInterface.dismiss();
return;
}
i--;
@ -273,6 +270,7 @@ public class RepeatControlSet extends TaskEditControlFragment
} else if (i == 5) {
newCustomRecurrenceDialog(this, rrule, dueDate)
.show(getFragmentManager(), FRAG_TAG_CUSTOM_RECURRENCE);
dialogInterface.dismiss();
return;
} else {
rrule = new RRule();
@ -298,8 +296,8 @@ public class RepeatControlSet extends TaskEditControlFragment
}
callback.repeatChanged(rrule != null);
refreshDisplayView();
dialogInterface.dismiss();
})
.setOnCancelListener(d -> refreshDisplayView())
.show();

@ -2,24 +2,39 @@ package org.tasks.activities;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.FragmentManager;
import org.tasks.calendars.AndroidCalendar;
import org.tasks.injection.ActivityComponent;
import org.tasks.injection.InjectingAppCompatActivity;
import org.tasks.injection.ThemedInjectingAppCompatActivity;
import org.tasks.preferences.ActivityPermissionRequestor;
import org.tasks.preferences.PermissionRequestor;
import javax.inject.Inject;
import static org.tasks.PermissionUtil.verifyPermissions;
import static org.tasks.activities.CalendarSelectionDialog.newCalendarSelectionDialog;
public class CalendarSelectionActivity extends InjectingAppCompatActivity implements CalendarSelectionDialog.CalendarSelectionHandler {
public class CalendarSelectionActivity extends ThemedInjectingAppCompatActivity implements CalendarSelectionDialog.CalendarSelectionHandler {
private static final String FRAG_TAG_CALENDAR_PREFERENCE_SELECTION = "frag_tag_calendar_preference_selection";
public static final String EXTRA_CALENDAR_ID = "extra_calendar_id";
public static final String EXTRA_CALENDAR_NAME = "extra_calendar_name";
@Inject ActivityPermissionRequestor permissionRequestor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (permissionRequestor.requestCalendarPermissions()) {
showDialog();
}
}
private void showDialog() {
FragmentManager fragmentManager = getSupportFragmentManager();
CalendarSelectionDialog fragmentByTag = (CalendarSelectionDialog) fragmentManager.findFragmentByTag(FRAG_TAG_CALENDAR_PREFERENCE_SELECTION);
if (fragmentByTag == null) {
@ -48,4 +63,17 @@ public class CalendarSelectionActivity extends InjectingAppCompatActivity implem
public void cancel() {
finish();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == PermissionRequestor.REQUEST_CALENDAR) {
if (verifyPermissions(grantResults)) {
showDialog();
} else {
finish();
}
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
}

@ -14,9 +14,7 @@ import org.tasks.calendars.CalendarProvider;
import org.tasks.dialogs.DialogBuilder;
import org.tasks.injection.DialogFragmentComponent;
import org.tasks.injection.InjectingDialogFragment;
import org.tasks.preferences.FragmentPermissionRequestor;
import org.tasks.preferences.PermissionChecker;
import org.tasks.preferences.PermissionRequestor;
import org.tasks.themes.Theme;
import org.tasks.ui.SingleCheckedArrayAdapter;
@ -26,7 +24,6 @@ import java.util.List;
import javax.inject.Inject;
import static com.google.common.collect.Lists.transform;
import static org.tasks.PermissionUtil.verifyPermissions;
public class CalendarSelectionDialog extends InjectingDialogFragment {
@ -48,38 +45,46 @@ public class CalendarSelectionDialog extends InjectingDialogFragment {
@Inject DialogBuilder dialogBuilder;
@Inject CalendarProvider calendarProvider;
@Inject FragmentPermissionRequestor fragmentPermissionRequestor;
@Inject PermissionChecker permissionChecker;
@Inject Theme theme;
private CalendarSelectionHandler handler;
private String selected;
private SingleCheckedArrayAdapter adapter;
private final List<AndroidCalendar> calendars = new ArrayList<>();
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
fragmentPermissionRequestor.requestCalendarPermissions();
Bundle arguments = getArguments();
selected = arguments.getString(EXTRA_SELECTED);
String selected = arguments.getString(EXTRA_SELECTED);
theme.applyToContext(getActivity());
adapter = new SingleCheckedArrayAdapter(getActivity(), transform(calendars, AndroidCalendar::getName), theme.getThemeAccent()) {
@Override
protected int getDrawable(int position) {
return R.drawable.ic_event_24dp;
}
@Override
protected int getDrawableColor(int position) {
return calendars.get(position).getColor();
}
};
int selectedIndex = -1;
calendars.clear();
calendars.addAll(calendarProvider.getCalendars());
if (calendars.isEmpty()) {
Toast.makeText(getActivity(), R.string.no_calendars_found, Toast.LENGTH_LONG).show();
handler.cancel();
} else {
calendars.add(0, new AndroidCalendar(null, getString(R.string.dont_add_to_calendar), -1));
List<String> calendarNames = transform(calendars, AndroidCalendar::getName);
adapter = new SingleCheckedArrayAdapter(getActivity(), calendarNames, theme.getThemeAccent()) {
@Override
protected int getDrawable(int position) {
return R.drawable.ic_event_24dp;
}
@Override
protected int getDrawableColor(int position) {
return calendars.get(position).getColor();
}
};
selectedIndex = Strings.isNullOrEmpty(selected) ? 0 : calendarNames.indexOf(selected);
}
return dialogBuilder.newDialog()
.setSingleChoiceItems(adapter, -1, (dialog, which) -> handler.selectedCalendar(calendars.get(which)))
.setSingleChoiceItems(adapter, selectedIndex, (dialog, which) -> handler.selectedCalendar(calendars.get(which)))
.setOnDismissListener(dialogInterface -> handler.cancel())
.show();
}
@ -88,21 +93,8 @@ public class CalendarSelectionDialog extends InjectingDialogFragment {
public void onResume() {
super.onResume();
if (permissionChecker.canAccessCalendars()) {
calendars.clear();
calendars.addAll(calendarProvider.getCalendars());
if (calendars.isEmpty()) {
Toast.makeText(getActivity(), R.string.no_calendars_found, Toast.LENGTH_LONG).show();
handler.cancel();
} else {
calendars.add(0, new AndroidCalendar(null, getString(R.string.dont_add_to_calendar), -1));
if (Strings.isNullOrEmpty(selected)) {
adapter.setChecked(0);
} else {
adapter.setChecked(selected);
}
adapter.notifyDataSetChanged();
}
if (!permissionChecker.canAccessCalendars()) {
handler.cancel();
}
}
@ -113,17 +105,6 @@ public class CalendarSelectionDialog extends InjectingDialogFragment {
handler.cancel();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == PermissionRequestor.REQUEST_CALENDAR) {
if (!verifyPermissions(grantResults)) {
handler.cancel();
}
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
@Override
protected void inject(DialogFragmentComponent component) {
component.inject(this);

@ -83,10 +83,9 @@ public class ColorPickerDialog extends InjectingDialogFragment {
return getDisplayColor(position);
}
};
adapter.setChecked(selected);
AlertDialogBuilder builder = dialogBuilder.newDialog(theme)
.setAdapter(adapter, (dialog, which) -> {
.setSingleChoiceItems(adapter, selected, (dialog, which) -> {
if (preferences.hasPurchase(R.string.p_purchased_themes) || which < getNumFree()) {
callback.themePicked(palette, which);
} else {

@ -47,9 +47,8 @@ public class LocalePickerDialog extends InjectingNativeDialogFragment {
}
final List<String> display = transform(locales, Locale::getDisplayName);
SingleCheckedArrayAdapter adapter = new SingleCheckedArrayAdapter(context, display, themeAccent);
adapter.setChecked(display.indexOf(locale.getDisplayName()));
return dialogBuilder.newDialog()
.setSingleChoiceItems(adapter, -1, (dialogInterface, i) -> {
.setSingleChoiceItems(adapter, display.indexOf(locale.getDisplayName()), (dialogInterface, i) -> {
callback.onLocaleSelected(locales.get(i));
dialogInterface.dismiss();
})

@ -1,11 +1,18 @@
package org.tasks.ui;
import android.content.Context;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.StateListDrawable;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.res.ResourcesCompat;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.support.v4.widget.CompoundButtonCompat;
import android.support.v7.widget.AppCompatCheckedTextView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
@ -16,24 +23,23 @@ import org.tasks.themes.ThemeAccent;
import java.util.List;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastJellybean;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastJellybeanMR1;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop;
import static com.todoroo.andlib.utility.AndroidUtilities.preLollipop;
import static org.tasks.preferences.ResourceResolver.getData;
import static org.tasks.preferences.ResourceResolver.getDimen;
public class SingleCheckedArrayAdapter extends ArrayAdapter<String> {
@NonNull private final Context context;
private final List<String> items;
private final ThemeAccent accent;
private final int alpha;
private final int tint;
private int checkedPosition = -1;
public SingleCheckedArrayAdapter(@NonNull Context context, @NonNull List<String> items, ThemeAccent accent) {
super(context, R.layout.simple_list_item_single_choice_themed, items);
this.context = context;
this.items = items;
this.accent = accent;
this.alpha = (int)(255 * getDimen(context, R.dimen.alpha_secondary));
this.tint = getData(context, R.attr.icon_tint);
@ -43,19 +49,14 @@ public class SingleCheckedArrayAdapter extends ArrayAdapter<String> {
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
CheckedTextView view = (CheckedTextView) super.getView(position, convertView, parent);
if (this.checkedPosition == position) {
if (atLeastLollipop()) {
view.setCheckMarkDrawable(R.drawable.ic_check_black_24dp);
} else {
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);
}
view.setChecked(true);
} else {
view.setCheckMarkDrawable(null);
view.setChecked(false);
if (preLollipop()) {
ColorStateList tintList = new ColorStateList(new int[][]{
new int[]{-android.R.attr.state_checked}, new int[]{android.R.attr.state_checked}},
new int[]{ResourcesCompat.getColor(context.getResources(), android.R.color.transparent, null), accent.getAccentColor()});
Drawable original = ContextCompat.getDrawable(context, R.drawable.ic_check_black_24dp);
Drawable wrapped = DrawableCompat.wrap(original.mutate());
DrawableCompat.setTintList(wrapped, tintList);
view.setCheckMarkDrawable(wrapped);
}
int drawable = getDrawable(position);
if (drawable > 0) {
@ -85,12 +86,4 @@ public class SingleCheckedArrayAdapter extends ArrayAdapter<String> {
protected int getDrawableColor(int position) {
return 0;
}
public void setChecked(String item) {
setChecked(items.indexOf(item));
}
public void setChecked(int position) {
this.checkedPosition = position;
}
}

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_check_black_24dp" android:state_checked="true" />
<item android:state_checked="false">
<shape />
</item>
</selector>

@ -13,10 +13,10 @@
limitations under the License.
-->
<android.support.v7.widget.AppCompatCheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:checkMark="@drawable/ic_check_black_24dp"
android:checkMark="@drawable/checkmark"
android:checkMarkTint="?colorAccent"
android:checked="false"
android:layout_height="?android:attr/listPreferredItemHeightSmall"

Loading…
Cancel
Save