From 7dd203cb01ef76b92def8d12eee0e8fb3d361b2a Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Mon, 1 Aug 2016 09:59:53 -0500 Subject: [PATCH] Fix calendar permission crash --- src/main/AndroidManifest.xml | 2 +- src/main/java/org/tasks/PermissionUtil.java | 18 +++ .../activities/CalendarSelectionActivity.java | 50 ++------- .../activities/CalendarSelectionDialog.java | 104 ++++++++++++------ .../tasks/injection/DialogFragmentModule.java | 6 + .../simple_list_item_single_choice_themed.xml | 25 +++++ src/main/res/values/theme.xml | 2 + 7 files changed, 135 insertions(+), 72 deletions(-) create mode 100644 src/main/java/org/tasks/PermissionUtil.java create mode 100644 src/main/res/layout/simple_list_item_single_choice_themed.xml diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 74b3483d3..4d85646e2 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -356,7 +356,7 @@ + android:theme="@style/TasksDialog" /> adapter; + private final List calendars = new ArrayList<>(); + private final List calendarNames = new ArrayList<>(); @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - final List calendars = calendarProvider.getCalendars(); - List calendarNames = transform(calendars, new Function() { - @Override - public String apply(AndroidCalendar androidCalendar) { - return androidCalendar.getName(); - } - }); - - if (calendarNames.isEmpty()) { - Toast.makeText(context, R.string.no_calendars_found, Toast.LENGTH_LONG).show(); - handler.dismiss(); + if (savedInstanceState == null) { + fragmentPermissionRequestor.requestCalendarPermissions(); } + adapter = new ArrayAdapter<>(context, R.layout.simple_list_item_single_choice_themed, calendarNames); + AlertDialogBuilder builder = dialogBuilder.newDialog() - .setItems(calendarNames, new DialogInterface.OnClickListener() { + .setAdapter(adapter, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { handler.selectedCalendar(calendars.get(which)); - dialog.dismiss(); + } + }) + .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + handler.cancel(); } }); if (enableNone) { - builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - } - }).setNeutralButton(R.string.none, new DialogInterface.OnClickListener() { + builder.setNeutralButton(R.string.none, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { handler.selectedCalendar(AndroidCalendar.NONE); - dialog.dismiss(); } }); } @@ -89,10 +84,53 @@ public class CalendarSelectionDialog extends InjectingDialogFragment { } @Override - public void onDismiss(DialogInterface dialog) { - super.onDismiss(dialog); + public void onResume() { + super.onResume(); + + if (permissionChecker.canAccessCalendars()) { + calendars.clear(); + calendars.addAll(calendarProvider.getCalendars()); + calendarNames.clear(); + calendarNames.addAll(transform(calendars, new Function() { + @Override + public String apply(AndroidCalendar androidCalendar) { + return androidCalendar.getName(); + } + })); + if (calendarNames.isEmpty()) { + Toast.makeText(context, R.string.no_calendars_found, Toast.LENGTH_LONG).show(); + handler.cancel(); + } else { + adapter.notifyDataSetChanged(); + } + } + } + + @Override + public void onCancel(DialogInterface dialog) { + super.onCancel(dialog); - handler.dismiss(); + handler.cancel(); + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + if (requestCode == PermissionRequestor.REQUEST_CALENDAR) { + if (grantResults.length > 0 && !verifyPermissions(grantResults)) { + handler.cancel(); + } + } else { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + } + } + + @Override + protected void inject(DialogFragmentComponent component) { + component.inject(this); + } + + public void enableNone() { + enableNone = true; } public void setCalendarSelectionHandler(CalendarSelectionHandler handler) { diff --git a/src/main/java/org/tasks/injection/DialogFragmentModule.java b/src/main/java/org/tasks/injection/DialogFragmentModule.java index 522089610..a0c658579 100644 --- a/src/main/java/org/tasks/injection/DialogFragmentModule.java +++ b/src/main/java/org/tasks/injection/DialogFragmentModule.java @@ -3,6 +3,7 @@ package org.tasks.injection; import android.app.Activity; import android.content.Context; import android.support.v4.app.DialogFragment; +import android.support.v4.app.Fragment; import dagger.Module; import dagger.Provides; @@ -20,6 +21,11 @@ public class DialogFragmentModule { return dialogFragment.getActivity(); } + @Provides + public Fragment getFragment() { + return dialogFragment; + } + @Provides @ForActivity public Context getContext() { diff --git a/src/main/res/layout/simple_list_item_single_choice_themed.xml b/src/main/res/layout/simple_list_item_single_choice_themed.xml new file mode 100644 index 000000000..bfd402403 --- /dev/null +++ b/src/main/res/layout/simple_list_item_single_choice_themed.xml @@ -0,0 +1,25 @@ + + + diff --git a/src/main/res/values/theme.xml b/src/main/res/values/theme.xml index 2fd7a01fa..4c2a2f4b6 100644 --- a/src/main/res/values/theme.xml +++ b/src/main/res/values/theme.xml @@ -26,6 +26,7 @@ @@ -33,6 +34,7 @@