From be048c83655d66084d348d0ce31cdfc4a9a2ab71 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Fri, 29 Jun 2018 16:46:27 -0500 Subject: [PATCH] Show calendar selection dialog in onCreate Prevent exception when showing dialog after onSaveInstanceState --- .../activities/CalendarSelectionActivity.java | 27 +----- .../activities/CalendarSelectionDialog.java | 96 ++++++++++++------- 2 files changed, 64 insertions(+), 59 deletions(-) diff --git a/app/src/main/java/org/tasks/activities/CalendarSelectionActivity.java b/app/src/main/java/org/tasks/activities/CalendarSelectionActivity.java index 3d05d25a7..c09b44bee 100644 --- a/app/src/main/java/org/tasks/activities/CalendarSelectionActivity.java +++ b/app/src/main/java/org/tasks/activities/CalendarSelectionActivity.java @@ -1,18 +1,13 @@ package org.tasks.activities; -import static org.tasks.PermissionUtil.verifyPermissions; import static org.tasks.activities.CalendarSelectionDialog.newCalendarSelectionDialog; import android.content.Intent; import android.os.Bundle; -import android.support.annotation.NonNull; import android.support.v4.app.FragmentManager; -import javax.inject.Inject; import org.tasks.calendars.AndroidCalendar; import org.tasks.injection.ActivityComponent; import org.tasks.injection.ThemedInjectingAppCompatActivity; -import org.tasks.preferences.ActivityPermissionRequestor; -import org.tasks.preferences.PermissionRequestor; public class CalendarSelectionActivity extends ThemedInjectingAppCompatActivity implements CalendarSelectionDialog.CalendarSelectionHandler { @@ -21,18 +16,11 @@ public class CalendarSelectionActivity extends ThemedInjectingAppCompatActivity public static final String EXTRA_CALENDAR_NAME = "extra_calendar_name"; private static final String FRAG_TAG_CALENDAR_PREFERENCE_SELECTION = "frag_tag_calendar_preference_selection"; - @Inject ActivityPermissionRequestor permissionRequestor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (permissionRequestor.requestCalendarPermissions()) { - showDialog(); - } - } - - private void showDialog() { FragmentManager fragmentManager = getSupportFragmentManager(); if (fragmentManager.findFragmentByTag(FRAG_TAG_CALENDAR_PREFERENCE_SELECTION) == null) { Intent intent = getIntent(); @@ -61,16 +49,9 @@ public class CalendarSelectionActivity extends ThemedInjectingAppCompatActivity } @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); - } + public void finish() { + super.finish(); + + overridePendingTransition(0, 0); } } diff --git a/app/src/main/java/org/tasks/activities/CalendarSelectionDialog.java b/app/src/main/java/org/tasks/activities/CalendarSelectionDialog.java index ebfa14c66..8901b41ad 100644 --- a/app/src/main/java/org/tasks/activities/CalendarSelectionDialog.java +++ b/app/src/main/java/org/tasks/activities/CalendarSelectionDialog.java @@ -1,12 +1,15 @@ package org.tasks.activities; import static com.google.common.collect.Lists.transform; +import static org.tasks.PermissionUtil.verifyPermissions; import android.app.Activity; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.v7.app.AlertDialog; +import android.widget.ListView; import android.widget.Toast; import com.google.common.base.Strings; import java.util.ArrayList; @@ -18,20 +21,25 @@ 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; public class CalendarSelectionDialog extends InjectingDialogFragment { private static final String EXTRA_SELECTED = "extra_selected"; + private final List calendarNames = new ArrayList<>(); private final List calendars = new ArrayList<>(); @Inject DialogBuilder dialogBuilder; @Inject CalendarProvider calendarProvider; @Inject PermissionChecker permissionChecker; + @Inject FragmentPermissionRequestor permissionRequestor; @Inject Theme theme; private CalendarSelectionHandler handler; private SingleCheckedArrayAdapter adapter; + private ListView listView; public static CalendarSelectionDialog newCalendarSelectionDialog(String selected) { CalendarSelectionDialog dialog = new CalendarSelectionDialog(); @@ -44,43 +52,54 @@ public class CalendarSelectionDialog extends InjectingDialogFragment { @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - Bundle arguments = getArguments(); - String selected = arguments.getString(EXTRA_SELECTED); - theme.applyToContext(getActivity()); - int selectedIndex = -1; + 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(); + } + }; + + AlertDialog dialog = dialogBuilder + .newDialog() + .setSingleChoiceItems( + adapter, -1, (d, which) -> handler.selectedCalendar(calendars.get(which))) + .setOnDismissListener(dialogInterface -> handler.cancel()) + .show(); + listView = dialog.getListView(); + if (permissionChecker.canAccessCalendars()) { + loadCalendars(); + } else if (savedInstanceState == null) { + permissionRequestor.requestCalendarPermissions(); + } + return dialog; + } + + private void loadCalendars() { calendars.clear(); + calendarNames.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 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); + calendarNames.addAll(transform(calendars, AndroidCalendar::getName)); + Bundle arguments = getArguments(); + String selected = arguments.getString(EXTRA_SELECTED); + int selectedIndex = Strings.isNullOrEmpty(selected) ? 0 : calendarNames.indexOf(selected); + adapter.notifyDataSetChanged(); + listView.setItemChecked(selectedIndex, true); + listView.setSelection(selectedIndex); } - - return dialogBuilder - .newDialog() - .setSingleChoiceItems( - adapter, - selectedIndex, - (dialog, which) -> handler.selectedCalendar(calendars.get(which))) - .setOnDismissListener(dialogInterface -> handler.cancel()) - .show(); } @Override @@ -90,15 +109,6 @@ public class CalendarSelectionDialog extends InjectingDialogFragment { handler = (CalendarSelectionHandler) activity; } - @Override - public void onResume() { - super.onResume(); - - if (!permissionChecker.canAccessCalendars()) { - handler.cancel(); - } - } - @Override public void onCancel(DialogInterface dialog) { super.onCancel(dialog); @@ -106,6 +116,20 @@ 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)) { + loadCalendars(); + } else { + handler.cancel(); + } + } else { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + } + } + @Override protected void inject(DialogFragmentComponent component) { component.inject(this);