Merge and resolve conflicts from upstream/master

pull/14/head
Sam Bosley 13 years ago
commit 5fb49bf8f0

@ -140,7 +140,7 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
try { try {
task = PluginServices.getTaskService().fetchById(t, Task.NOTES, Task.ID, Task.UUID, Task.TITLE); task = PluginServices.getTaskService().fetchById(t, Task.NOTES, Task.ID, Task.UUID, Task.TITLE);
} catch (SQLiteException e) { } catch (SQLiteException e) {
StartupService.handleSQLiteColumnMissing(ContextManager.getContext(), e); StartupService.handleSQLiteError(ContextManager.getContext(), e);
} }
if(task == null) { if(task == null) {
return; return;

@ -373,6 +373,19 @@ public class Database extends AbstractDatabase {
return builder.toString(); return builder.toString();
} }
public void tryAddColumn(Table table, Property<?> column, String defaultValue) {
try {
SqlConstructorVisitor visitor = new SqlConstructorVisitor();
String sql = "ALTER TABLE " + table.name + " ADD " + //$NON-NLS-1$//$NON-NLS-2$
column.accept(visitor, null);
if (!TextUtils.isEmpty(defaultValue))
sql += " DEFAULT " + defaultValue;
database.execSQL(sql);
} catch (SQLiteException e) {
// ignored, column already exists
}
}
/** /**
* Create table generation SQL * Create table generation SQL
* @param sql * @param sql

@ -28,10 +28,12 @@ import android.widget.Toast;
import com.crittercism.app.Crittercism; import com.crittercism.app.Crittercism;
import com.timsu.astrid.R; import com.timsu.astrid.R;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.ExceptionService; import com.todoroo.andlib.service.ExceptionService;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.Preferences; import com.todoroo.andlib.utility.Preferences;
@ -42,6 +44,7 @@ import com.todoroo.astrid.backup.BackupConstants;
import com.todoroo.astrid.backup.BackupService; import com.todoroo.astrid.backup.BackupService;
import com.todoroo.astrid.backup.TasksXmlImporter; import com.todoroo.astrid.backup.TasksXmlImporter;
import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gtasks.GtasksPreferenceService; import com.todoroo.astrid.gtasks.GtasksPreferenceService;
import com.todoroo.astrid.gtasks.sync.GtasksSyncService; import com.todoroo.astrid.gtasks.sync.GtasksSyncService;
import com.todoroo.astrid.helper.UUIDHelper; import com.todoroo.astrid.helper.UUIDHelper;
@ -128,8 +131,9 @@ public class StartupService {
try { try {
database.openForWriting(); database.openForWriting();
checkForMissingColumns();
} catch (SQLiteException e) { } catch (SQLiteException e) {
handleSQLiteColumnMissing(context, e); handleSQLiteError(context, e);
return; return;
} }
@ -255,15 +259,32 @@ public class StartupService {
* @param context * @param context
* @param e error that was raised * @param e error that was raised
*/ */
public static void handleSQLiteColumnMissing(Context context, final SQLiteException e) { public static void handleSQLiteError(Context context, final SQLiteException e) {
new AlertDialog.Builder(context) new AlertDialog.Builder(context)
.setTitle(R.string.DB_corrupted_title) .setTitle(R.string.DB_corrupted_title)
.setMessage(R.string.DB_corrupted_body) .setMessage(R.string.DB_corrupted_body)
.setPositiveButton(R.string.DLG_ok, null) .setPositiveButton(R.string.DLG_ok, null)
.create().show(); .create().show();
e.printStackTrace(); e.printStackTrace();
} }
private void checkForMissingColumns() {
// For some reason these properties are missing for some users.
// Make them exist!
try {
TodorooCursor<Task> tasks = taskService.query(Query.select(Task.REMOTE_ID, Task.USER_ID, Task.USER).limit(1));
try {
System.err.println(tasks.getCount());
} finally {
tasks.close();
}
} catch (SQLiteException e) {
database.tryAddColumn(Task.TABLE, Task.REMOTE_ID, "0"); //$NON-NLS-1$
database.tryAddColumn(Task.TABLE, Task.USER_ID, "0"); //$NON-NLS-1$
database.tryAddColumn(Task.TABLE, Task.USER, null);
}
}
/** /**
* If database exists, no tasks but metadata, and a backup file exists, restore it * If database exists, no tasks but metadata, and a backup file exists, restore it
*/ */

@ -110,35 +110,40 @@ public class UpdateMessageService {
} }
} }
protected void displayUpdateDialog(Pair<String, Spannable> message) { protected void displayUpdateDialog(final Pair<String, Spannable> message) {
if(activity == null) if(activity == null)
return; return;
final DialogShower ds; final DialogShower ds;
if (message.getRight() != null) { if (message.getRight() != null) {
final View view = activity.getLayoutInflater().inflate(R.layout.update_message_link, null);
TextView messageView = (TextView) view.findViewById(R.id.update_message);
messageView.setText(message.getLeft());
messageView.setTextColor(activity.getResources().getColor(ThemeService.getDialogTextColor()));
final TextView linkView = (TextView) view.findViewById(R.id.update_link);
linkView.setMovementMethod(LinkMovementMethod.getInstance());
linkView.setText(message.getRight());
ds = new DialogShower() { ds = new DialogShower() {
@Override @Override
public void showDialog(Activity a) { public void showDialog(Activity a) {
final Dialog d = new AlertDialog.Builder(a) try {
.setTitle(R.string.UpS_updates_title) View view = activity.getLayoutInflater().inflate(R.layout.update_message_link, null);
.setView(view) TextView messageView = (TextView) view.findViewById(R.id.update_message);
.setPositiveButton(R.string.DLG_ok, null) messageView.setText(message.getLeft());
.create(); messageView.setTextColor(activity.getResources().getColor(ThemeService.getDialogTextColor()));
linkView.setOnClickListener(new OnClickListener() {
@Override TextView linkView = (TextView) view.findViewById(R.id.update_link);
public void onClick(View v) { linkView.setMovementMethod(LinkMovementMethod.getInstance());
d.dismiss(); linkView.setText(message.getRight());
}
}); final Dialog d = new AlertDialog.Builder(a)
d.show(); .setTitle(R.string.UpS_updates_title)
.setView(view)
.setPositiveButton(R.string.DLG_ok, null)
.create();
linkView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
d.dismiss();
}
});
d.show();
} catch (Exception e) {
// This should never ever crash
}
} }
}; };
} else { } else {

@ -53,6 +53,7 @@ import com.todoroo.astrid.utility.AstridPreferences;
public final class UpgradeService { public final class UpgradeService {
public static final int V4_4_0 = 285; public static final int V4_4_0 = 285;
public static final int V4_3_4_1 = 283;
public static final int V4_3_4 = 282; public static final int V4_3_4 = 282;
public static final int V4_3_3 = 281; public static final int V4_3_3 = 281;
public static final int V4_3_2 = 280; public static final int V4_3_2 = 280;

@ -14,6 +14,7 @@ import org.json.JSONObject;
import android.content.Context; import android.content.Context;
import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteException;
import android.os.Looper;
import android.util.Log; import android.util.Log;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
@ -66,11 +67,12 @@ public final class ABTestEventReportingService {
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
Looper.prepare(); // In case something goes wrong
try { try {
abTestEventDao.createRelativeDateEvents(); abTestEventDao.createRelativeDateEvents();
pushAllUnreportedABTestEvents(); pushAllUnreportedABTestEvents();
} catch (SQLiteException e) { } catch (SQLiteException e) {
StartupService.handleSQLiteColumnMissing(context, e); StartupService.handleSQLiteError(context, e);
} }
} }
}).start(); }).start();

@ -17,6 +17,7 @@ import android.text.style.ClickableSpan;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.RestClient; import com.todoroo.andlib.service.RestClient;
import com.todoroo.andlib.utility.Pair;
import com.todoroo.astrid.dao.StoreObjectDao; import com.todoroo.astrid.dao.StoreObjectDao;
import com.todoroo.astrid.dao.StoreObjectDao.StoreObjectCriteria; import com.todoroo.astrid.dao.StoreObjectDao.StoreObjectCriteria;
import com.todoroo.astrid.test.DatabaseTestCase; import com.todoroo.astrid.test.DatabaseTestCase;
@ -32,7 +33,7 @@ public class UpdateMessageServiceTest extends DatabaseTestCase {
new TestUpdateMessageService() { new TestUpdateMessageService() {
@Override @Override
void verifyMessage(CharSequence message) { void verifyMessage(Pair<String, Spannable> message) {
fail("should not have displayed updates"); fail("should not have displayed updates");
} }
@ -51,7 +52,7 @@ public class UpdateMessageServiceTest extends DatabaseTestCase {
new TestUpdateMessageService() { new TestUpdateMessageService() {
@Override @Override
void verifyMessage(CharSequence message) { void verifyMessage(Pair<String, Spannable> message) {
fail("should not have displayed updates"); fail("should not have displayed updates");
} }
@ -68,8 +69,8 @@ public class UpdateMessageServiceTest extends DatabaseTestCase {
new TestUpdateMessageService() { new TestUpdateMessageService() {
@Override @Override
void verifyMessage(CharSequence message) { void verifyMessage(Pair<String, Spannable> message) {
assertTrue(message.toString().contains("yo")); assertTrue(message.getLeft().toString().contains("yo"));
} }
@Override @Override
@ -85,9 +86,9 @@ public class UpdateMessageServiceTest extends DatabaseTestCase {
new TestUpdateMessageService() { new TestUpdateMessageService() {
@Override @Override
void verifyMessage(CharSequence message) { void verifyMessage(Pair<String, Spannable> message) {
assertTrue(message.toString().contains("yo")); assertTrue(message.getLeft().toString().contains("yo"));
assertFalse(message.toString().contains("cat")); // We only process the first update now assertFalse(message.getLeft().toString().contains("cat")); // We only process the first update now
} }
@Override @Override
@ -103,8 +104,8 @@ public class UpdateMessageServiceTest extends DatabaseTestCase {
new TestUpdateMessageService() { new TestUpdateMessageService() {
@Override @Override
void verifyMessage(CharSequence message) { void verifyMessage(Pair<String, Spannable> message) {
assertTrue(message.toString().contains("yo")); assertTrue(message.getLeft().toString().contains("yo"));
} }
@Override @Override
@ -116,7 +117,7 @@ public class UpdateMessageServiceTest extends DatabaseTestCase {
new TestUpdateMessageService() { new TestUpdateMessageService() {
@Override @Override
void verifyMessage(CharSequence message) { void verifyMessage(Pair<String, Spannable> message) {
fail("should have not displayed again"); fail("should have not displayed again");
} }
@ -138,9 +139,9 @@ public class UpdateMessageServiceTest extends DatabaseTestCase {
new TestUpdateMessageService() { new TestUpdateMessageService() {
@Override @Override
void verifyMessage(CharSequence message) { void verifyMessage(Pair<String, Spannable> message) {
assertTrue(message.toString().contains("yo")); assertTrue(message.getLeft().toString().contains("yo"));
assertTrue(message.toString().contains("date")); assertTrue(message.getLeft().toString().contains("date"));
} }
@Override @Override
@ -157,8 +158,8 @@ public class UpdateMessageServiceTest extends DatabaseTestCase {
new TestUpdateMessageService() { new TestUpdateMessageService() {
@Override @Override
void verifyMessage(CharSequence message) { void verifyMessage(Pair<String, Spannable> message) {
assertTrue(message.toString().contains("rmilk man")); assertTrue(message.getLeft().toString().contains("rmilk man"));
} }
@Override @Override
@ -175,7 +176,7 @@ public class UpdateMessageServiceTest extends DatabaseTestCase {
new TestUpdateMessageService() { new TestUpdateMessageService() {
@Override @Override
void verifyMessage(CharSequence message) { void verifyMessage(Pair<String, Spannable> message) {
fail("displayed update"); fail("displayed update");
} }
@ -197,8 +198,8 @@ public class UpdateMessageServiceTest extends DatabaseTestCase {
new TestUpdateMessageService() { new TestUpdateMessageService() {
@Override @Override
void verifyMessage(CharSequence message) { void verifyMessage(Pair<String, Spannable> message) {
assertTrue(message.toString().contains("astrid man")); assertTrue(message.getLeft().toString().contains("astrid man"));
} }
@Override @Override
@ -214,7 +215,7 @@ public class UpdateMessageServiceTest extends DatabaseTestCase {
new TestUpdateMessageService() { new TestUpdateMessageService() {
@Override @Override
void verifyMessage(CharSequence message) { void verifyMessage(Pair<String, Spannable> message) {
fail("displayed update"); fail("displayed update");
} }
@ -236,9 +237,9 @@ public class UpdateMessageServiceTest extends DatabaseTestCase {
new TestUpdateMessageService() { new TestUpdateMessageService() {
@Override @Override
void verifyMessage(CharSequence message) { void verifyMessage(Pair<String, Spannable> message) {
assertTrue(message instanceof Spannable); assertNotNull(message.getRight());
assertTrue(((Spannable)message).getSpans(0, message.length(), ClickableSpan.class).length > 0); assertTrue(((Spannable)message).getSpans(0, message.getRight().length(), ClickableSpan.class).length > 0);
} }
@Override @Override
@ -254,9 +255,9 @@ public class UpdateMessageServiceTest extends DatabaseTestCase {
new TestUpdateMessageService() { new TestUpdateMessageService() {
@Override @Override
void verifyMessage(CharSequence message) { void verifyMessage(Pair<String, Spannable> message) {
assertTrue(message instanceof Spannable); assertNotNull(message.getRight());
assertTrue(((Spannable)message).getSpans(0, message.length(), ClickableSpan.class).length > 0); assertTrue(((Spannable)message).getSpans(0, message.getRight().length(), ClickableSpan.class).length > 0);
} }
@Override @Override
@ -289,7 +290,7 @@ public class UpdateMessageServiceTest extends DatabaseTestCase {
}; };
} }
abstract void verifyMessage(CharSequence message); abstract void verifyMessage(Pair<String, Spannable> message);
abstract String getUpdates(String url) throws IOException; abstract String getUpdates(String url) throws IOException;
@ -298,15 +299,15 @@ public class UpdateMessageServiceTest extends DatabaseTestCase {
} }
@Override @Override
protected CharSequence buildUpdateMessage(JSONArray updates) { protected Pair<String, Spannable> buildUpdateMessage(JSONArray updates) {
CharSequence builder = super.buildUpdateMessage(updates); Pair<String, Spannable> message = super.buildUpdateMessage(updates);
if(builder.length() == 0) if(message == null || message.getLeft().length() == 0)
onEmptyMessage(); onEmptyMessage();
return builder; return message;
} }
@Override @Override
protected void displayUpdateDialog(CharSequence builder) { protected void displayUpdateDialog(Pair<String, Spannable> builder) {
verifyMessage(builder); verifyMessage(builder);
} }
} }

Loading…
Cancel
Save