Fix calendar permission crash

pull/437/head
Alex Baker 9 years ago
parent de6779c069
commit 7dd203cb01

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

@ -0,0 +1,18 @@
package org.tasks;
import android.content.pm.PackageManager;
public abstract class PermissionUtil {
public static boolean verifyPermissions(int[] grantResults) {
if(grantResults.length < 1){
return false;
}
for (int result : grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
}

@ -1,17 +1,12 @@
package org.tasks.activities;
import android.support.v4.app.FragmentManager;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import org.tasks.calendars.AndroidCalendar;
import org.tasks.injection.ActivityComponent;
import org.tasks.injection.InjectingAppCompatActivity;
import org.tasks.preferences.ActivityPermissionRequestor;
import org.tasks.preferences.PermissionRequestor;
import javax.inject.Inject;
public class CalendarSelectionActivity extends InjectingAppCompatActivity implements CalendarSelectionDialog.CalendarSelectionHandler {
@ -21,15 +16,19 @@ public class CalendarSelectionActivity extends InjectingAppCompatActivity implem
public static final String EXTRA_CALENDAR_NAME = "extra_calendar_name";
public static final String EXTRA_SHOW_NONE = "extra_show_none";
@Inject ActivityPermissionRequestor permissionRequestor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (permissionRequestor.requestCalendarPermissions()) {
showDialog();
FragmentManager fragmentManager = getSupportFragmentManager();
CalendarSelectionDialog fragmentByTag = (CalendarSelectionDialog) fragmentManager.findFragmentByTag(FRAG_TAG_CALENDAR_PREFERENCE_SELECTION);
if (fragmentByTag == null) {
fragmentByTag = new CalendarSelectionDialog();
if (getIntent().getBooleanExtra(EXTRA_SHOW_NONE, false)) {
fragmentByTag.enableNone();
}
fragmentByTag.show(fragmentManager, FRAG_TAG_CALENDAR_PREFERENCE_SELECTION);
}
fragmentByTag.setCalendarSelectionHandler(this);
}
@Override
@ -43,36 +42,11 @@ public class CalendarSelectionActivity extends InjectingAppCompatActivity implem
putExtra(EXTRA_CALENDAR_ID, androidCalendar.getId());
putExtra(EXTRA_CALENDAR_NAME, androidCalendar.getName());
}});
}
@Override
public void dismiss() {
finish();
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == PermissionRequestor.REQUEST_CALENDAR) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
showDialog();
} else {
finish();
}
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
private void showDialog() {
FragmentManager fragmentManager = getSupportFragmentManager();
CalendarSelectionDialog fragmentByTag = (CalendarSelectionDialog) fragmentManager.findFragmentByTag(FRAG_TAG_CALENDAR_PREFERENCE_SELECTION);
if (fragmentByTag == null) {
fragmentByTag = new CalendarSelectionDialog();
if (getIntent().getBooleanExtra(EXTRA_SHOW_NONE, false)) {
fragmentByTag.enableNone();
}
fragmentByTag.show(fragmentManager, FRAG_TAG_CALENDAR_PREFERENCE_SELECTION);
}
fragmentByTag.setCalendarSelectionHandler(this);
public void cancel() {
finish();
}
}

@ -5,6 +5,7 @@ import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.widget.ArrayAdapter;
import android.widget.Toast;
import com.google.common.base.Function;
@ -17,70 +18,64 @@ import org.tasks.dialogs.DialogBuilder;
import org.tasks.injection.DialogFragmentComponent;
import org.tasks.injection.ForActivity;
import org.tasks.injection.InjectingDialogFragment;
import org.tasks.preferences.FragmentPermissionRequestor;
import org.tasks.preferences.PermissionChecker;
import org.tasks.preferences.PermissionRequestor;
import java.util.ArrayList;
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 {
public void enableNone() {
enableNone = true;
}
@Override
protected void inject(DialogFragmentComponent component) {
component.inject(this);
}
public interface CalendarSelectionHandler {
void selectedCalendar(AndroidCalendar calendar);
void dismiss();
void cancel();
}
@Inject DialogBuilder dialogBuilder;
@Inject CalendarProvider calendarProvider;
@Inject @ForActivity Context context;
@Inject FragmentPermissionRequestor fragmentPermissionRequestor;
@Inject PermissionChecker permissionChecker;
private CalendarSelectionHandler handler;
private boolean enableNone;
private ArrayAdapter<String> adapter;
private final List<AndroidCalendar> calendars = new ArrayList<>();
private final List<String> calendarNames = new ArrayList<>();
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final List<AndroidCalendar> calendars = calendarProvider.getCalendars();
List<String> calendarNames = transform(calendars, new Function<AndroidCalendar, String>() {
@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<AndroidCalendar, String>() {
@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) {

@ -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() {

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2008 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.
-->
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical"
android:paddingEnd="@dimen/keyline_first"
android:paddingLeft="@dimen/keyline_first"
android:paddingRight="@dimen/keyline_first"
android:paddingStart="@dimen/keyline_first"
android:textColor="?attr/asTextColor" />

@ -26,6 +26,7 @@
<style name="TasksDialogAlert" parent="@style/Theme.AppCompat.DayNight.Dialog.Alert">
<item name="android:windowBackground">@color/background_color_dialog</item>
<item name="colorAccent">?attr/colorAccentDialog</item>
<item name="colorAccentDialog">@color/blue_grey_400</item>
<item name="asTextColor">@color/text_primary</item>
<item name="icon_tint">@color/icon_tint</item>
</style>
@ -33,6 +34,7 @@
<style name="TasksDialog" parent="@style/Theme.AppCompat.DayNight.Dialog">
<item name="android:windowBackground">@color/background_color_dialog</item>
<item name="colorAccent">?attr/colorAccentDialog</item>
<item name="colorAccentDialog">@color/blue_grey_400</item>
<item name="asTextColor">@color/text_primary</item>
<item name="icon_tint">@color/icon_tint</item>
</style>

Loading…
Cancel
Save