Show calendar selection dialog in onCreate

Prevent exception when showing dialog after onSaveInstanceState
pull/513/head
Alex Baker 8 years ago
parent 96749d9b30
commit be048c8365

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

@ -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<String> calendarNames = new ArrayList<>();
private final List<AndroidCalendar> 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<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);
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);

Loading…
Cancel
Save