From ff0ec40698ee8401e4ac5c196d95652df9adb24b Mon Sep 17 00:00:00 2001 From: Tim Su Date: Tue, 25 May 2010 02:57:25 -0700 Subject: [PATCH] Fixed crashes all around, created a changelist displayer in upgrade service --- astrid/AndroidManifest.xml | 2 +- .../andlib/utility/DialogUtilities.java | 2 +- astrid/res/layout/main.xml | 4 +- astrid/res/values/strings.xml | 6 +- .../astrid/activities/TaskListAdapter.java | 2 +- .../activities/TaskListSubActivity.java | 45 +++++++++++--- .../astrid/utilities/StartupReceiver.java | 6 ++ .../com/timsu/astrid/widget/ViewFlipper.java | 28 +++++++++ .../astrid/service/UpgradeService.java | 58 ++++++++++++++++++- 9 files changed, 135 insertions(+), 18 deletions(-) create mode 100644 astrid/src-legacy/com/timsu/astrid/widget/ViewFlipper.java diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml index 10eb75b51..28a695f87 100644 --- a/astrid/AndroidManifest.xml +++ b/astrid/AndroidManifest.xml @@ -1,7 +1,7 @@ + android:versionCode="131" android:versionName="2.14.0"> diff --git a/astrid/common-src/com/todoroo/andlib/utility/DialogUtilities.java b/astrid/common-src/com/todoroo/andlib/utility/DialogUtilities.java index 895cb37ea..32d5a94a5 100644 --- a/astrid/common-src/com/todoroo/andlib/utility/DialogUtilities.java +++ b/astrid/common-src/com/todoroo/andlib/utility/DialogUtilities.java @@ -71,7 +71,7 @@ public class DialogUtilities { * @param text * @param okListener */ - public void okDialog(final Activity activity, final int icon, final String text, + public void okDialog(final Activity activity, final int icon, final CharSequence text, final DialogInterface.OnClickListener okListener) { activity.runOnUiThread(new Runnable() { public void run() { diff --git a/astrid/res/layout/main.xml b/astrid/res/layout/main.xml index 871993754..2786e139a 100644 --- a/astrid/res/layout/main.xml +++ b/astrid/res/layout/main.xml @@ -19,7 +19,7 @@ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --> - @@ -136,4 +136,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/astrid/res/values/strings.xml b/astrid/res/values/strings.xml index 4ee307c5a..3bc5797fa 100644 --- a/astrid/res/values/strings.xml +++ b/astrid/res/values/strings.xml @@ -308,9 +308,11 @@ to the plugin creator for fastest service. E-mail Todoroo + + - - Todoroo Help + + What\'s New In Astrid? diff --git a/astrid/src-legacy/com/timsu/astrid/activities/TaskListAdapter.java b/astrid/src-legacy/com/timsu/astrid/activities/TaskListAdapter.java index 5b76511a9..10a73a131 100644 --- a/astrid/src-legacy/com/timsu/astrid/activities/TaskListAdapter.java +++ b/astrid/src-legacy/com/timsu/astrid/activities/TaskListAdapter.java @@ -194,7 +194,7 @@ public class TaskListAdapter extends ArrayAdapter { public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; - if(objects.get(position) == null) + if(objects.size() <= position || objects.get(position) == null) return deletedItemView; if(view == null) { diff --git a/astrid/src-legacy/com/timsu/astrid/activities/TaskListSubActivity.java b/astrid/src-legacy/com/timsu/astrid/activities/TaskListSubActivity.java index a1f2c6e5a..caacf3afe 100644 --- a/astrid/src-legacy/com/timsu/astrid/activities/TaskListSubActivity.java +++ b/astrid/src-legacy/com/timsu/astrid/activities/TaskListSubActivity.java @@ -19,6 +19,15 @@ */ package com.timsu.astrid.activities; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Random; + import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; @@ -31,12 +40,24 @@ import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.util.Log; -import android.view.*; +import android.view.ContextMenu; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; import android.view.ContextMenu.ContextMenuInfo; import android.view.View.OnClickListener; import android.view.View.OnCreateContextMenuListener; -import android.widget.*; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.ImageButton; +import android.widget.ListView; +import android.widget.TextView; +import android.widget.Toast; import android.widget.AdapterView.OnItemClickListener; + import com.flurry.android.FlurryAgent; import com.timsu.astrid.R; import com.timsu.astrid.activities.TaskListAdapter.TaskListAdapterHooks; @@ -50,15 +71,19 @@ import com.timsu.astrid.data.task.TaskModelForList; import com.timsu.astrid.sync.SynchronizationService; import com.timsu.astrid.sync.Synchronizer; import com.timsu.astrid.sync.Synchronizer.SynchronizerListener; -import com.timsu.astrid.utilities.*; +import com.timsu.astrid.utilities.AstridUtilities; +import com.timsu.astrid.utilities.Constants; +import com.timsu.astrid.utilities.DialogUtilities; +import com.timsu.astrid.utilities.Notifications; +import com.timsu.astrid.utilities.Preferences; +import com.timsu.astrid.utilities.TasksXmlExporter; +import com.timsu.astrid.utilities.TasksXmlImporter; import com.timsu.astrid.widget.FilePickerBuilder; -import com.timsu.astrid.widget.NNumberPickerDialog.OnNNumberPickedListener; import com.timsu.astrid.widget.NumberPicker; import com.timsu.astrid.widget.NumberPickerDialog; +import com.timsu.astrid.widget.NNumberPickerDialog.OnNNumberPickedListener; import com.timsu.astrid.widget.NumberPickerDialog.OnNumberPickedListener; -import java.util.*; - /** * Primary view for the Astrid Application. Lists all of the tasks in the * system, and allows users to interact with them. @@ -818,9 +843,13 @@ public class TaskListSubActivity extends SubActivity { /** Set up the adapter for our task list */ private void setUpListUI() { + // if something happened, don't finish setting up the list + if(context.taskArray == null) + return; + // set up our adapter context.listAdapter = new TaskListAdapter(getParent(), - R.layout.task_list_row, context.taskArray, new TaskListHooks()); + R.layout.task_list_row, context.taskArray, new TaskListHooks()); listView.setAdapter(context.listAdapter); listView.setItemsCanFocus(true); @@ -1306,7 +1335,7 @@ public class TaskListSubActivity extends SubActivity { }; DialogUtilities.filePicker(ctx, ctx.getString(R.string.import_file_prompt), - TasksXmlExporter.getExportDirectory(), + TasksXmlExporter.getExportDirectory(), listener); } diff --git a/astrid/src-legacy/com/timsu/astrid/utilities/StartupReceiver.java b/astrid/src-legacy/com/timsu/astrid/utilities/StartupReceiver.java index f5670a9dd..17aeedbc2 100644 --- a/astrid/src-legacy/com/timsu/astrid/utilities/StartupReceiver.java +++ b/astrid/src-legacy/com/timsu/astrid/utilities/StartupReceiver.java @@ -19,7 +19,9 @@ import com.timsu.astrid.R; import com.timsu.astrid.activities.SyncPreferences; import com.timsu.astrid.appwidget.AstridAppWidgetProvider.UpdateService; import com.timsu.astrid.sync.SynchronizationService; +import com.todoroo.andlib.service.ContextManager; import com.todoroo.astrid.service.AstridDependencyInjector; +import com.todoroo.astrid.service.UpgradeService; public class StartupReceiver extends BroadcastReceiver { @@ -32,6 +34,7 @@ public class StartupReceiver extends BroadcastReceiver { @Override /** Called when the system is started up */ public void onReceive(Context context, Intent intent) { + ContextManager.setContext(context); Notifications.scheduleAllAlarms(context); } @@ -40,6 +43,8 @@ public class StartupReceiver extends BroadcastReceiver { if(hasStartedUp) return; + ContextManager.setContext(context); + int latestSetVersion = Preferences.getCurrentVersion(context); int version = 0; try { @@ -72,6 +77,7 @@ public class StartupReceiver extends BroadcastReceiver { Preferences.setCurrentVersion(context, finalVersion); } + new UpgradeService().performUpgrade(latestSetVersion, version); // perform startup activities in a background thread diff --git a/astrid/src-legacy/com/timsu/astrid/widget/ViewFlipper.java b/astrid/src-legacy/com/timsu/astrid/widget/ViewFlipper.java new file mode 100644 index 000000000..16a1f9b48 --- /dev/null +++ b/astrid/src-legacy/com/timsu/astrid/widget/ViewFlipper.java @@ -0,0 +1,28 @@ +package com.timsu.astrid.widget; + +import android.content.Context; +import android.util.AttributeSet; + +/** + * This class exists solely to suppress an Android 2.1 error + * @author Tim Su + * + */ +public class ViewFlipper extends android.widget.ViewFlipper { + public ViewFlipper(Context context) { + super(context); + } + + public ViewFlipper(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onDetachedFromWindow() { + try { + super.onDetachedFromWindow(); + } catch (Exception e) { + // stupid Android 2.1 exception + } + } +} diff --git a/astrid/src/com/todoroo/astrid/service/UpgradeService.java b/astrid/src/com/todoroo/astrid/service/UpgradeService.java index 49088f701..0d7d67c65 100644 --- a/astrid/src/com/todoroo/astrid/service/UpgradeService.java +++ b/astrid/src/com/todoroo/astrid/service/UpgradeService.java @@ -3,13 +3,16 @@ package com.todoroo.astrid.service; import java.util.HashMap; import java.util.Map.Entry; +import android.app.Activity; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteDatabase.CursorFactory; +import android.text.Html; import android.util.Log; +import com.timsu.astrid.R; import com.timsu.astrid.data.AbstractController; import com.timsu.astrid.data.task.AbstractTaskModel; import com.todoroo.andlib.data.AbstractModel; @@ -19,6 +22,7 @@ import com.todoroo.andlib.data.Property.PropertyVisitor; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.DependencyInjectionService; +import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.TaskDao; @@ -47,6 +51,9 @@ public final class UpgradeService { @Autowired private String tagTaskTable; + @Autowired + private DialogUtilities dialogUtilities; + // --- implementation public UpgradeService() { @@ -62,12 +69,56 @@ public final class UpgradeService { * @param to */ public void performUpgrade(int from, int to) { + from = 130; if(from == to) return; - if(from < 150) { - upgrade2To3(); + // display changelog + showChangeLog(from, to); + } + + /** + * Return a change log string. Releases occur often enough that we don't + * expect change sets to be localized. + * + * @param from + * @param to + * @return + */ + @SuppressWarnings("nls") + public void showChangeLog(int from, int to) { + StringBuilder changeLog = new StringBuilder(); + + switch(from) { + case 130: + default: + newVersionString(changeLog, "2.14.0", new String[] { + "Pick a calendar to 'Add to Calendar' (in Preferences)", + "Fixed crashes with backups & sync"}); + + // came from bizarre version } + + if(changeLog.length() == 0) + return; + + dialogUtilities.okDialog((Activity)ContextManager.getContext(), + R.string.UpS_changelog_title, + Html.fromHtml(changeLog.toString()), null); + } + + /** + * Helper for adding a single version to the changelog + * @param changeLog + * @param version + * @param changes + */ + @SuppressWarnings("nls") + private void newVersionString(StringBuilder changeLog, String version, String[] changes) { + changeLog.append("Version ").append(version).append(":
"); + for(String change : changes) + changeLog.append("• ").append(change).append("
"); + changeLog.append("
"); } // --- database upgrade logic @@ -97,7 +148,7 @@ public final class UpgradeService { /** * Perform the upgrade from Astrid 2 to Astrid 3 */ - private void upgrade2To3() { + public void upgrade2To3() { Context context = ContextManager.getContext(); database.openForWriting(); @@ -148,6 +199,7 @@ public final class UpgradeService { * @author Tim Su * */ + @SuppressWarnings("nls") protected static final class ColumnUpgradeVisitor implements PropertyVisitor { @Override public Void visitDouble(Property property, UpgradeVisitorContainer data) {