/** * Copyright (c) 2012 Todoroo Inc * * See the file "LICENSE" for the full license governing this code. */ package com.todoroo.astrid.core; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.preference.Preference; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceScreen; import com.facebook.Session; import com.timsu.astrid.GCMIntentService; import com.timsu.astrid.R; import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.andlib.utility.Preferences; import com.todoroo.andlib.utility.TodorooPreferenceActivity; import com.todoroo.astrid.actfm.sync.ActFmSyncService; import com.todoroo.astrid.actfm.sync.ActFmSyncThread; import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.gcal.GCalHelper; import com.todoroo.astrid.service.MetadataService; import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.utility.AstridPreferences; /** * Displays the preference screen for users to manage their old tasks and events * * @author Tim Su <tim@todoroo.com> * */ public class OldTaskPreferences extends TodorooPreferenceActivity { @Autowired TaskService taskService; @Autowired MetadataService metadataService; @Autowired Database database; @Autowired ActFmSyncService actFmSyncService; ProgressDialog pd; @Override public int getPreferenceResource() { return R.xml.preferences_oldtasks; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); PreferenceScreen screen = getPreferenceScreen(); DependencyInjectionService.getInstance().inject(this); // Extended prefs Preference preference = screen.findPreference(getString(R.string.EPr_manage_delete_completed)); preference.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference p) { showDeleteCompletedDialog(); return true; } }); preference = screen.findPreference(getString(R.string.EPr_reset_sync_state)); preference.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference p) { showResetSyncStateDialog(); return true; } }); preference = screen.findPreference(getString(R.string.EPr_manage_purge_deleted)); preference.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference p) { showPurgeDeletedDialog(); return true; } }); preference = screen.findPreference(getString(R.string.EPr_manage_delete_completed_gcal)); preference.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference p) { showDeleteCompletedEventsDialog(); return true; } }); preference = screen.findPreference(getString(R.string.EPr_manage_delete_all_gcal)); preference.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference p) { showDeleteAllEventsDialog(); return true; } }); preference= screen.findPreference(getString(R.string.EPr_manage_clear_all)); preference.setOnPreferenceClickListener(new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference p) { showClearDataDialog(); return true; } }); } private void showClearDataDialog() { DialogUtilities.okCancelDialog( this, getResources().getString( R.string.EPr_manage_clear_all_message), new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Editor editor = Preferences.getPrefs(OldTaskPreferences.this).edit(); editor.clear(); editor.commit(); deleteDatabase(database.getName()); Session activeSession = Session.getActiveSession(); if (activeSession != null) { activeSession.closeAndClearTokenInformation(); } AstridPreferences.setPreferenceDefaults(); GCMIntentService.unregister(OldTaskPreferences.this); System.exit(0); } }, null); } /* (non-Javadoc) * @see android.app.Activity#onPause() */ @Override protected void onPause() { DialogUtilities.dismissDialog(this, pd); super.onPause(); } /** Show the dialog to delete completed tasks */ private void showDeleteCompletedDialog() { DialogUtilities.okCancelDialog( this, getResources().getString( R.string.EPr_manage_delete_completed_message), new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { pd = DialogUtilities.runWithProgressDialog(OldTaskPreferences.this, new Runnable() { @Override public void run() { TodorooCursor<Task> cursor = taskService.query(Query.select(Task.ID, Task.CALENDAR_URI).where( Criterion.and(Task.COMPLETION_DATE.gt(0), Task.CALENDAR_URI.isNotNull()))); try { Task task = new Task(); int length = cursor.getCount(); for(int i = 0; i < length; i++) { cursor.moveToNext(); task.readFromCursor(cursor); GCalHelper.deleteTaskEvent(task); } } finally { cursor.close(); } Task template = new Task(); template.setValue(Task.DELETION_DATE, DateUtilities.now()); int result = taskService.update( Task.COMPLETION_DATE.gt(0), template); showResult( R.string.EPr_manage_delete_completed_status, result); } }); } }, null); } /** Show the dialog to purge deleted tasks */ private void showPurgeDeletedDialog() { DialogUtilities.okCancelDialog( this, getResources().getString( R.string.EPr_manage_purge_deleted_message), new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { pd = DialogUtilities.runWithProgressDialog(OldTaskPreferences.this, new Runnable() { @Override public void run() { TodorooCursor<Task> cursor = taskService.query(Query.select(Task.ID, Task.TITLE, Task.CALENDAR_URI).where( Criterion.and(Task.DELETION_DATE.gt(0), Task.CALENDAR_URI.isNotNull()))); try { Task task = new Task(); int length = cursor.getCount(); for(int i = 0; i < length; i++) { cursor.moveToNext(); task.readFromCursor(cursor); GCalHelper.deleteTaskEvent(task); } } finally { cursor.close(); } int result = taskService.deleteWhere(Task.DELETION_DATE.gt(0)); metadataService.cleanup(); showResult( R.string.EPr_manage_purge_deleted_status, result); } }); } }, null); } /** Show the dialog to delete completed events */ private void showDeleteCompletedEventsDialog() { DialogUtilities.okCancelDialog( this, getResources().getString( R.string.EPr_manage_delete_completed_gcal_message), new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { pd = DialogUtilities.runWithProgressDialog(OldTaskPreferences.this, new Runnable() { @Override public void run() { int deletedEventCount = 0; TodorooCursor<Task> cursor = taskService.query(Query.select(Task.ID, Task.CALENDAR_URI).where( Criterion.and(Task.COMPLETION_DATE.gt(0), Task.CALENDAR_URI.isNotNull()))); try { Task task = new Task(); int length = cursor.getCount(); for(int i = 0; i < length; i++) { cursor.moveToNext(); task.readFromCursor(cursor); if (GCalHelper.deleteTaskEvent(task)) deletedEventCount++; } } finally { cursor.close(); } // mass update the CALENDAR_URI here, // since the GCalHelper doesnt save it due to performance-reasons Task template = new Task(); template.setValue(Task.CALENDAR_URI, ""); //$NON-NLS-1$ taskService.update( Criterion.and(Task.COMPLETION_DATE.gt(0), Task.CALENDAR_URI.isNotNull()), template); showResult(R.string.EPr_manage_delete_completed_gcal_status, deletedEventCount); } }); } }, null); } /** Show the dialog to delete all events */ private void showDeleteAllEventsDialog() { DialogUtilities.okCancelDialog( this, getResources().getString( R.string.EPr_manage_delete_all_gcal_message), new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { pd = DialogUtilities.runWithProgressDialog(OldTaskPreferences.this, new Runnable() { @Override public void run() { int deletedEventCount = 0; TodorooCursor<Task> cursor = taskService.query(Query.select(Task.ID, Task.CALENDAR_URI).where( Task.CALENDAR_URI.isNotNull())); try { Task task = new Task(); int length = cursor.getCount(); for(int i = 0; i < length; i++) { cursor.moveToNext(); task.readFromCursor(cursor); if (GCalHelper.deleteTaskEvent(task)) deletedEventCount++; } } finally { cursor.close(); } // mass update the CALENDAR_URI here, // since the GCalHelper doesnt save it due to performance-reasons Task template = new Task(); template.setValue(Task.CALENDAR_URI, ""); //$NON-NLS-1$ taskService.update( Task.CALENDAR_URI.isNotNull(), template); showResult(R.string.EPr_manage_delete_all_gcal_status, deletedEventCount); } }); } }, null); } private void showResetSyncStateDialog() { DialogUtilities.okCancelDialog(this, getString(R.string.EPr_reset_sync_state_detailed), new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ActFmSyncThread.clearTablePushedAtValues(); } }, null); } protected void showResult(int resourceText, int result) { DialogUtilities.okDialog(this, getString(resourceText, result), null); } @Override public void updatePreferences(Preference preference, Object value) { // :) } }