Add option to delete cal event from edit screen

Closes #313
pull/384/head
Alex Baker 9 years ago
parent 580337559e
commit ae2f2b24c4

@ -33,12 +33,16 @@ public abstract class PermissionRequestor {
} }
public boolean requestCalendarPermissions() { public boolean requestCalendarPermissions() {
return requestCalendarPermissions(REQUEST_CALENDAR);
}
public boolean requestCalendarPermissions(int requestCode) {
if (permissionChecker.canAccessCalendars()) { if (permissionChecker.canAccessCalendars()) {
return true; return true;
} }
requestPermissions( requestPermissions(
new String[]{Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR}, new String[]{Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR},
REQUEST_CALENDAR); requestCode);
return false; return false;
} }

@ -4,7 +4,9 @@ import android.app.Activity;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.ContentValues; import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor; import android.database.Cursor;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
@ -23,7 +25,9 @@ import com.todoroo.astrid.gcal.GCalHelper;
import org.tasks.R; import org.tasks.R;
import org.tasks.activities.CalendarSelectionActivity; import org.tasks.activities.CalendarSelectionActivity;
import org.tasks.analytics.Tracker; import org.tasks.analytics.Tracker;
import org.tasks.dialogs.DialogBuilder;
import org.tasks.injection.ForActivity; import org.tasks.injection.ForActivity;
import org.tasks.preferences.FragmentPermissionRequestor;
import org.tasks.preferences.PermissionChecker; import org.tasks.preferences.PermissionChecker;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
@ -39,7 +43,10 @@ public class CalendarControlSet extends TaskEditControlFragment {
public static final int TAG = R.string.TEA_ctrl_gcal; public static final int TAG = R.string.TEA_ctrl_gcal;
private static final int REQUEST_CODE_CALENDAR = 70; private static final int REQUEST_CODE_PICK_CALENDAR = 70;
private static final int REQUEST_CODE_OPEN_EVENT = 71;
private static final int REQUEST_CODE_CLEAR_EVENT = 72;
private static final String EXTRA_URI = "extra_uri"; private static final String EXTRA_URI = "extra_uri";
private static final String EXTRA_ID = "extra_id"; private static final String EXTRA_ID = "extra_id";
private static final String EXTRA_NAME = "extra_name"; private static final String EXTRA_NAME = "extra_name";
@ -51,7 +58,9 @@ public class CalendarControlSet extends TaskEditControlFragment {
@Inject Preferences preferences; @Inject Preferences preferences;
@Inject @ForActivity Context context; @Inject @ForActivity Context context;
@Inject PermissionChecker permissionChecker; @Inject PermissionChecker permissionChecker;
@Inject FragmentPermissionRequestor permissionRequestor;
@Inject Tracker tracker; @Inject Tracker tracker;
@Inject DialogBuilder dialogBuilder;
private String calendarId; private String calendarId;
private String calendarName; private String calendarName;
@ -62,11 +71,12 @@ public class CalendarControlSet extends TaskEditControlFragment {
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = super.onCreateView(inflater, container, savedInstanceState); View view = super.onCreateView(inflater, container, savedInstanceState);
boolean canAccessCalendars = permissionChecker.canAccessCalendars();
if (savedInstanceState != null) { if (savedInstanceState != null) {
eventUri = savedInstanceState.getString(EXTRA_URI); eventUri = savedInstanceState.getString(EXTRA_URI);
calendarName = savedInstanceState.getString(EXTRA_NAME); calendarName = savedInstanceState.getString(EXTRA_NAME);
calendarId = savedInstanceState.getString(EXTRA_ID); calendarId = savedInstanceState.getString(EXTRA_ID);
} else if (isNewTask && permissionChecker.canAccessCalendars()) { } else if (isNewTask && canAccessCalendars) {
calendarId = preferences.getDefaultCalendar(); calendarId = preferences.getDefaultCalendar();
if (!Strings.isNullOrEmpty(calendarId)) { if (!Strings.isNullOrEmpty(calendarId)) {
try { try {
@ -76,14 +86,15 @@ public class CalendarControlSet extends TaskEditControlFragment {
} else { } else {
calendarName = defaultCalendar.getName(); calendarName = defaultCalendar.getName();
} }
} catch(Exception e) { } catch (Exception e) {
Timber.e(e, e.getMessage()); Timber.e(e, e.getMessage());
tracker.reportException(e); tracker.reportException(e);
calendarId = null; calendarId = null;
} }
} }
} }
if (!calendarEntryExists(eventUri)) {
if (canAccessCalendars && !calendarEntryExists(eventUri)) {
eventUri = null; eventUri = null;
} }
refreshDisplayView(); refreshDisplayView();
@ -111,13 +122,36 @@ public class CalendarControlSet extends TaskEditControlFragment {
eventUri = task.getCalendarURI(); eventUri = task.getCalendarURI();
} }
@SuppressWarnings("SimplifiableIfStatement")
@Override @Override
public boolean hasChanges(Task original) { public boolean hasChanges(Task original) {
return !isNullOrEmpty(calendarId); if (!permissionChecker.canAccessCalendars()) {
return false;
}
if (!isNullOrEmpty(calendarId)) {
return true;
}
String originalUri = original.getCalendarURI();
if (isNullOrEmpty(eventUri) && isNullOrEmpty(originalUri)) {
return false;
}
return !originalUri.equals(eventUri);
} }
@Override @Override
public void apply(Task task) { public void apply(Task task) {
if (!permissionChecker.canAccessCalendars()) {
return;
}
if (!isNullOrEmpty(task.getCalendarURI())) {
if (eventUri == null) {
gcalHelper.deleteTaskEvent(task);
} else if (!calendarEntryExists(task.getCalendarURI())) {
task.setCalendarUri("");
}
}
if (!task.hasDueDate()) { if (!task.hasDueDate()) {
return; return;
} }
@ -174,6 +208,24 @@ public class CalendarControlSet extends TaskEditControlFragment {
@OnClick(R.id.clear) @OnClick(R.id.clear)
void clearCalendar(View view) { void clearCalendar(View view) {
if (isNullOrEmpty(eventUri)) {
clear();
} else {
dialogBuilder.newMessageDialog(R.string.delete_calendar_event_confirmation)
.setPositiveButton(R.string.delete, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (permissionRequestor.requestCalendarPermissions(REQUEST_CODE_CLEAR_EVENT)) {
clear();
}
}
})
.setNegativeButton(android.R.string.cancel, null)
.show();
}
}
private void clear() {
calendarName = null; calendarName = null;
calendarId = null; calendarId = null;
eventUri = null; eventUri = null;
@ -183,36 +235,42 @@ public class CalendarControlSet extends TaskEditControlFragment {
@OnClick(R.id.calendar_display_which) @OnClick(R.id.calendar_display_which)
void clickCalendar(View view) { void clickCalendar(View view) {
if (Strings.isNullOrEmpty(eventUri)) { if (Strings.isNullOrEmpty(eventUri)) {
startActivityForResult(new Intent(context, CalendarSelectionActivity.class), REQUEST_CODE_CALENDAR); startActivityForResult(new Intent(context, CalendarSelectionActivity.class), REQUEST_CODE_PICK_CALENDAR);
} else { } else {
ContentResolver cr = getActivity().getContentResolver(); if (permissionRequestor.requestCalendarPermissions(REQUEST_CODE_OPEN_EVENT)) {
Uri uri = Uri.parse(eventUri); openCalendarEvent();
Intent intent = new Intent(Intent.ACTION_VIEW, uri); }
Cursor cursor = cr.query(uri, new String[] { "dtstart", "dtend" }, null, null, null); }
try { }
if(cursor.getCount() == 0) {
// event no longer exists private void openCalendarEvent() {
eventUri = null; ContentResolver cr = getActivity().getContentResolver();
refreshDisplayView(); Uri uri = Uri.parse(eventUri);
return; Intent intent = new Intent(Intent.ACTION_VIEW, uri);
} Cursor cursor = cr.query(uri, new String[] { "dtstart", "dtend" }, null, null, null);
try {
if(cursor.getCount() == 0) {
// event no longer exists
Toast.makeText(context, R.string.calendar_event_not_found, Toast.LENGTH_SHORT).show();
eventUri = null;
refreshDisplayView();
} else {
cursor.moveToFirst(); cursor.moveToFirst();
intent.putExtra("beginTime", cursor.getLong(0)); intent.putExtra("beginTime", cursor.getLong(0));
intent.putExtra("endTime", cursor.getLong(1)); intent.putExtra("endTime", cursor.getLong(1));
} catch (Exception e) { startActivity(intent);
Timber.e(e, e.getMessage());
Toast.makeText(getActivity(), R.string.gcal_TEA_error, Toast.LENGTH_LONG).show();
} finally {
cursor.close();
} }
} catch (Exception e) {
startActivity(intent); Timber.e(e, e.getMessage());
Toast.makeText(getActivity(), R.string.gcal_TEA_error, Toast.LENGTH_LONG).show();
} finally {
cursor.close();
} }
} }
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_CALENDAR) { if (requestCode == REQUEST_CODE_PICK_CALENDAR) {
if (resultCode == Activity.RESULT_OK) { if (resultCode == Activity.RESULT_OK) {
calendarId = data.getStringExtra(CalendarSelectionActivity.EXTRA_CALENDAR_ID); calendarId = data.getStringExtra(CalendarSelectionActivity.EXTRA_CALENDAR_ID);
calendarName = data.getStringExtra(CalendarSelectionActivity.EXTRA_CALENDAR_NAME); calendarName = data.getStringExtra(CalendarSelectionActivity.EXTRA_CALENDAR_NAME);
@ -223,11 +281,26 @@ public class CalendarControlSet extends TaskEditControlFragment {
} }
} }
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == REQUEST_CODE_OPEN_EVENT) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
openCalendarEvent();
}
} else if (requestCode == REQUEST_CODE_CLEAR_EVENT) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
clear();
}
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
private void refreshDisplayView() { private void refreshDisplayView() {
if (!Strings.isNullOrEmpty(eventUri)) { if (!Strings.isNullOrEmpty(eventUri)) {
calendar.setAlpha(1.0f); calendar.setAlpha(1.0f);
calendar.setText(R.string.gcal_TEA_showCalendar_label); calendar.setText(R.string.gcal_TEA_showCalendar_label);
cancelButton.setVisibility(View.GONE); cancelButton.setVisibility(View.VISIBLE);
} else if (calendarName != null) { } else if (calendarName != null) {
calendar.setAlpha(1.0f); calendar.setAlpha(1.0f);
calendar.setText(calendarName); calendar.setText(calendarName);

@ -532,6 +532,9 @@ File %1$s contained %2$s.\n\n
<!-- Label when calendar event already exists --> <!-- Label when calendar event already exists -->
<string name="gcal_TEA_showCalendar_label">Open Calendar Event</string> <string name="gcal_TEA_showCalendar_label">Open Calendar Event</string>
<string name="delete_calendar_event_confirmation">Delete calendar event?</string>
<string name="calendar_event_not_found">Calendar event not found</string>
<!-- ======================================================== Calendars == --> <!-- ======================================================== Calendars == -->
<!-- Calendar event name when task is completed (%s => task title) --> <!-- Calendar event name when task is completed (%s => task title) -->

Loading…
Cancel
Save