Merged from 2.9.0

------------------------------------------------------------
Use --include-merges or -n0 to see merged revisions.
pull/14/head
Tim Su 15 years ago
parent 7b8f3b3d60
commit 80fca66a3d

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<projectDescription> <projectDescription>
<name>astrid</name> <name>astrid-2.9.0</name>
<comment></comment> <comment></comment>
<projects> <projects>
</projects> </projects>

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.timsu.astrid" package="com.timsu.astrid"
android:versionName="2.8.8.1" android:versionCode="116"> android:versionCode="118" android:versionName="2.9.0.1">
<!-- ============================ Metadata ============================ --> <!-- ============================ Metadata ============================ -->
@ -39,7 +39,7 @@
android:label="@string/taskEdit_label"> android:label="@string/taskEdit_label">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
</activity> </activity>
@ -47,7 +47,7 @@
<activity android:name=".activities.TagView"> <activity android:name=".activities.TagView">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
</activity> </activity>
@ -88,7 +88,7 @@
<receiver android:name=".utilities.StartupReceiver"> <receiver android:name=".utilities.StartupReceiver">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" />
</intent-filter> </intent-filter>
</receiver> </receiver>

@ -27,9 +27,9 @@
<EditText android:id="@+id/timepicker_input" <EditText android:id="@+id/timepicker_input"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center"
android:inputType="number"
style="?android:attr/textAppearanceLargeInverse" style="?android:attr/textAppearanceLargeInverse"
android:gravity="center"
android:inputType="phone"
android:textSize="30sp" android:textSize="30sp"
android:background="@drawable/timepicker_input" android:background="@drawable/timepicker_input"
/> />

@ -360,7 +360,7 @@
<string name="notif_definiteDueDate">Termini Absolut!</string> <string name="notif_definiteDueDate">Termini Absolut!</string>
<string name="notif_preferredDueDate">Termini Objectiu!</string> <string name="notif_preferredDueDate">Termini Objectiu!</string>
<string name="notif_timerStarted">Treballant en:</string> <string name="notif_timerStarted">Treballant en:</string>
<string name="notif_tagNotification">Tens %d Tasques etiquetades com %s!</string> <string name="notif_tagNotification">Tens $NUM etiquetades com $TAG!</string>
<!-- Error Messages --> <!-- Error Messages -->
<skip/> <skip/>

@ -365,7 +365,7 @@ d</string>
<string name="notif_definiteDueDate">Absolute Frist!</string> <string name="notif_definiteDueDate">Absolute Frist!</string>
<string name="notif_preferredDueDate">Zielfrist!</string> <string name="notif_preferredDueDate">Zielfrist!</string>
<string name="notif_timerStarted">Arbeite an:</string> <string name="notif_timerStarted">Arbeite an:</string>
<string name="notif_tagNotification">Du hast %d Aufgabe(n) mit Tags versehen %s!</string> <string name="notif_tagNotification">Du hast $NUM mit Tags versehen $TAG!</string>
<!-- Error Messages --> <!-- Error Messages -->
<skip/> <skip/>

@ -361,7 +361,7 @@
<string name="notif_definiteDueDate">¡Fecha límite absoluta!</string> <string name="notif_definiteDueDate">¡Fecha límite absoluta!</string>
<string name="notif_preferredDueDate">¡Fin de fecha límite!</string> <string name="notif_preferredDueDate">¡Fin de fecha límite!</string>
<string name="notif_timerStarted">Trabajando en:</string> <string name="notif_timerStarted">Trabajando en:</string>
<string name="notif_tagNotification">¡Tienes %d tarea(s) etiquetada(s) %s!</string> <string name="notif_tagNotification">¡Tienes $NUM etiquetada(s) $TAG!</string>
<!-- Error Messages --> <!-- Error Messages -->
<skip/> <skip/>

@ -360,7 +360,7 @@
<string name="notif_definiteDueDate">Date Limite !</string> <string name="notif_definiteDueDate">Date Limite !</string>
<string name="notif_preferredDueDate">Date prévue !</string> <string name="notif_preferredDueDate">Date prévue !</string>
<string name="notif_timerStarted">Travaille sur :</string> <string name="notif_timerStarted">Travaille sur :</string>
<string name="notif_tagNotification">Vous avez %d tâche(s) avec tags %s !</string> <string name="notif_tagNotification">Vous avez $NUM avec tags $TAG!</string>
<!-- Error Messages --> <!-- Error Messages -->
<skip/> <skip/>

@ -360,7 +360,7 @@
<string name="notif_definiteDueDate">期日!</string> <string name="notif_definiteDueDate">期日!</string>
<string name="notif_preferredDueDate">目標日!</string> <string name="notif_preferredDueDate">目標日!</string>
<string name="notif_timerStarted">処理中:</string> <string name="notif_timerStarted">処理中:</string>
<string name="notif_tagNotification">You have %d task(s) tagged %s!</string> <string name="notif_tagNotification">'$TAG'とタグ付けされた$NUMがあります!</string>
<!-- Error Messages --> <!-- Error Messages -->
<skip/> <skip/>

@ -360,7 +360,7 @@
<string name="notif_definiteDueDate">Абсолютный срок!</string> <string name="notif_definiteDueDate">Абсолютный срок!</string>
<string name="notif_preferredDueDate">Срок цели!</string> <string name="notif_preferredDueDate">Срок цели!</string>
<string name="notif_timerStarted">Работаю над:</string> <string name="notif_timerStarted">Работаю над:</string>
<string name="notif_tagNotification">У вас %d задач отмеченных %s!</string> <string name="notif_tagNotification">У вас $NUM отмеченных $TAG!</string>
<!-- Error Messages --> <!-- Error Messages -->
<skip/> <skip/>

@ -383,7 +383,8 @@ Thanks for using Astrid!\n
<string name="notif_definiteDueDate">Absolute Deadline!</string> <string name="notif_definiteDueDate">Absolute Deadline!</string>
<string name="notif_preferredDueDate">Goal Deadline!</string> <string name="notif_preferredDueDate">Goal Deadline!</string>
<string name="notif_timerStarted">Working on:</string> <string name="notif_timerStarted">Working on:</string>
<string name="notif_tagNotification">You have %d task(s) tagged %s!</string> <!-- $NUM is replaced with # of tasks + units, i.e. "1 task", $TAG is replaced with tag name -->
<string name="notif_tagNotification">You have $NUM tagged $TAG!</string>
<!-- Error Messages --> <!-- Error Messages -->
<skip /> <skip />

@ -61,6 +61,7 @@ import com.timsu.astrid.data.tag.TagIdentifier;
import com.timsu.astrid.data.tag.TagModelForView; import com.timsu.astrid.data.tag.TagModelForView;
import com.timsu.astrid.data.task.TaskIdentifier; import com.timsu.astrid.data.task.TaskIdentifier;
import com.timsu.astrid.utilities.DialogUtilities; import com.timsu.astrid.utilities.DialogUtilities;
import com.timsu.astrid.utilities.Preferences;
/** /**
@ -79,15 +80,15 @@ public class TagListSubActivity extends SubActivity {
private static final int CONTEXT_SHOWHIDE_ID = Menu.FIRST + 12; private static final int CONTEXT_SHOWHIDE_ID = Menu.FIRST + 12;
private static final int CONTEXT_SHORTCUT_ID = Menu.FIRST + 13; private static final int CONTEXT_SHORTCUT_ID = Menu.FIRST + 13;
private ListView listView; protected ListView listView;
private LinkedList<TagModelForView> tagArray; protected LinkedList<TagModelForView> tagArray;
HashMap<TagModelForView, Integer> tagToTaskCount; HashMap<TagModelForView, Integer> tagToTaskCount;
private Handler handler; protected Handler handler;
private TextView loadingText; protected TextView loadingText;
private boolean untaggedTagDisplayed; protected boolean untaggedTagDisplayed;
private static SortMode sortMode = SortMode.SIZE; protected static SortMode sortMode = SortMode.SIZE;
private static boolean sortReverse = false; protected static boolean sortReverse = false;
public TagListSubActivity(TaskList parent, int code, View view) { public TagListSubActivity(TaskList parent, int code, View view) {
super(parent, code, view); super(parent, code, view);
@ -102,11 +103,12 @@ public class TagListSubActivity extends SubActivity {
// time to go! // time to go!
new Thread(new Runnable() { new Thread(new Runnable() {
public void run() { public void run() {
loadTagListSort();
fillData(); fillData();
} }
}).start(); }).start();
FlurryAgent.onEvent("view-tags"); FlurryAgent.onEvent("view-tags"); //$NON-NLS-1$
} }
// --- stuff for sorting // --- stuff for sorting
@ -179,10 +181,36 @@ public class TagListSubActivity extends SubActivity {
Collections.reverse(tagArray); Collections.reverse(tagArray);
} }
/** Save the sorting mode to the preferences */
private void saveTagListSort() {
int sortId = sortMode.ordinal() + 1;
if (sortReverse)
sortId *= -1;
Preferences.setTagListSort(getParent(), sortId);
}
/** Save the sorting mode to the preferences */
protected void loadTagListSort() {
try {
int sortId = Preferences.getTagListSort(getParent());
if (sortId == 0)
return;
sortReverse = sortId < 0;
sortId = Math.abs(sortId) - 1;
sortMode = SortMode.values()[sortId];
} catch (Exception e) {
// do nothing
}
}
// --- fill data // --- fill data
/** Fill in the Tag List with our tags */ /** Fill in the Tag List with our tags */
private synchronized void fillData() { protected synchronized void fillData() {
try { try {
tagArray = getTagController().getAllTags(); tagArray = getTagController().getAllTags();
@ -190,10 +218,10 @@ public class TagListSubActivity extends SubActivity {
} catch (StaleDataException e) { } catch (StaleDataException e) {
// happens when you rotate the screen while the thread is // happens when you rotate the screen while the thread is
// still running. i don't think it's avoidable? // still running. i don't think it's avoidable?
Log.w("astrid", "StaleDataException", e); Log.w("astrid", "StaleDataException", e); //$NON-NLS-1$ //$NON-NLS-2$
return; return;
} catch (Exception e) { } catch (Exception e) {
Log.e("astrid", "Error loading list", e); Log.e("astrid", "Error loading list", e); //$NON-NLS-1$ //$NON-NLS-2$
} }
handler.post(new Runnable() { handler.post(new Runnable() {
@ -212,7 +240,7 @@ public class TagListSubActivity extends SubActivity {
} }
/** Set up list handlers and adapter. run on the UI thread */ /** Set up list handlers and adapter. run on the UI thread */
private void setUpListUI(ListAdapter adapter) { protected void setUpListUI(ListAdapter adapter) {
// set up the title // set up the title
Resources r = getResources(); Resources r = getResources();
int tags = tagArray.size(); int tags = tagArray.size();
@ -324,6 +352,7 @@ public class TagListSubActivity extends SubActivity {
sortMode = SortMode.ALPHA; sortMode = SortMode.ALPHA;
sortReverse = false; sortReverse = false;
} }
saveTagListSort();
fillData(); fillData();
return true; return true;
case MENU_SORT_SIZE_ID: case MENU_SORT_SIZE_ID:
@ -333,6 +362,7 @@ public class TagListSubActivity extends SubActivity {
sortMode = SortMode.SIZE; sortMode = SortMode.SIZE;
sortReverse = false; sortReverse = false;
} }
saveTagListSort();
fillData(); fillData();
return true; return true;
case CONTEXT_CREATE_ID: case CONTEXT_CREATE_ID:
@ -361,7 +391,7 @@ public class TagListSubActivity extends SubActivity {
Intent shortcutIntent = new Intent(Intent.ACTION_VIEW); Intent shortcutIntent = new Intent(Intent.ACTION_VIEW);
shortcutIntent.setComponent(new ComponentName( shortcutIntent.setComponent(new ComponentName(
getParent().getApplicationContext(), TagView.class)); getParent().getApplicationContext(), TagView.class));
shortcutIntent.setData(Uri.parse("tag:" + tag.getTagIdentifier().getId())); shortcutIntent.setData(Uri.parse("tag:" + tag.getTagIdentifier().getId())); //$NON-NLS-1$
Intent createShortcutIntent = new Intent(); Intent createShortcutIntent = new Intent();
createShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); createShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
@ -371,12 +401,12 @@ public class TagListSubActivity extends SubActivity {
// add the @ sign if the task starts with a letter, for clarity // add the @ sign if the task starts with a letter, for clarity
if(Character.isLetterOrDigit(label.charAt(0))) if(Character.isLetterOrDigit(label.charAt(0)))
label = "@" + label; label = "@" + label; //$NON-NLS-1$
createShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, label); createShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, label);
createShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON, createShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON,
((BitmapDrawable)r.getDrawable(R.drawable.icon_tag)).getBitmap()); ((BitmapDrawable)r.getDrawable(R.drawable.icon_tag)).getBitmap());
createShortcutIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT"); createShortcutIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT"); //$NON-NLS-1$
getParent().sendBroadcast(createShortcutIntent); getParent().sendBroadcast(createShortcutIntent);
Toast.makeText(getParent(), R.string.tagList_shortcut_created, Toast.LENGTH_SHORT).show(); Toast.makeText(getParent(), R.string.tagList_shortcut_created, Toast.LENGTH_SHORT).show();
@ -454,7 +484,7 @@ public class TagListSubActivity extends SubActivity {
else else
name.setTextColor(r.getColor(android.R.color.white)); name.setTextColor(r.getColor(android.R.color.white));
} catch (Exception e) { } catch (Exception e) {
Log.e("astrid", "Error loading tag list", e); Log.e("astrid", "Error loading tag list", e); //$NON-NLS-1$ //$NON-NLS-2$
} }
} }
} }

@ -37,6 +37,7 @@ import android.database.Cursor;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.text.Editable; import android.text.Editable;
import android.text.InputType;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -136,6 +137,7 @@ public class TaskEdit extends TaskModificationTabbedActivity<TaskModelForEdit> {
private AlertController alertController; private AlertController alertController;
private List<TagModelForView> tags; private List<TagModelForView> tags;
private List<TagIdentifier> taskTags; private List<TagIdentifier> taskTags;
private int nameEditInputType;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -168,6 +170,10 @@ public class TaskEdit extends TaskModificationTabbedActivity<TaskModelForEdit> {
setUpUIComponents(); setUpUIComponents();
setUpListeners(); setUpListeners();
// hack to disable name input box until user requests it
nameEditInputType = name.getInputType();
name.setInputType(InputType.TYPE_NULL);
} }
@Override @Override
@ -198,6 +204,7 @@ public class TaskEdit extends TaskModificationTabbedActivity<TaskModelForEdit> {
FlurryAgent.onEvent("edit-task"); FlurryAgent.onEvent("edit-task");
name.setText(model.getName()); name.setText(model.getName());
} }
if(model.getName().length() > 0) if(model.getName().length() > 0)
setTitle(new StringBuilder(). setTitle(new StringBuilder().
append(r.getString(R.string.taskEdit_titlePrefix)). append(r.getString(R.string.taskEdit_titlePrefix)).
@ -264,6 +271,7 @@ public class TaskEdit extends TaskModificationTabbedActivity<TaskModelForEdit> {
repeatInterval.setSelection(repeatInfo.getInterval().ordinal()); repeatInterval.setSelection(repeatInfo.getInterval().ordinal());
} else } else
setRepeatValue(0); setRepeatValue(0);
} }
/** Save task model from values in UI components */ /** Save task model from values in UI components */
@ -478,6 +486,14 @@ public class TaskEdit extends TaskModificationTabbedActivity<TaskModelForEdit> {
repeatValueClick(); repeatValueClick();
} }
}); });
name.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
name.setInputType(nameEditInputType);
}
});
} }
/** Set up the repeat value button */ /** Set up the repeat value button */

@ -326,15 +326,16 @@ public class TaskListAdapter extends ArrayAdapter<TaskModelForList> {
if(task.getCompletionDate() != null) { if(task.getCompletionDate() != null) {
int secondsLeft = (int)((task.getCompletionDate().getTime() - int secondsLeft = (int)((task.getCompletionDate().getTime() -
System.currentTimeMillis()) / 1000); System.currentTimeMillis()) / 1000);
label.append(r.getString(R.string.taskList_completedPrefix)). String finishedTime;
append(" ");
if(Math.abs(secondsLeft) < FULL_DATE_THRESHOLD) if(Math.abs(secondsLeft) < FULL_DATE_THRESHOLD)
label.append(r.getString(R.string.ago_string, finishedTime = r.getString(R.string.ago_string,
DateUtilities.getDurationString(r, DateUtilities.getDurationString(r,
Math.abs(secondsLeft), 1))); Math.abs(secondsLeft), 1));
else else
label.append(DateUtilities.getFormattedDate(r, finishedTime = DateUtilities.getFormattedDate(r,
task.getCompletionDate())); task.getCompletionDate());
label.append(r.getString(R.string.taskList_completedPrefix,
finishedTime));
} }
} else { } else {
boolean taskOverdue = false; boolean taskOverdue = false;

@ -174,7 +174,7 @@ public abstract class AbstractTagModel extends AbstractModel {
// --- setters // --- setters
protected void setName(String name) { protected void setName(String name) {
setValues.put(NAME, name); setValues.put(NAME, name.trim());
} }
protected void setNotes(String notes) { protected void setNotes(String notes) {

@ -58,8 +58,9 @@ public class LocaleReceiver extends BroadcastReceiver {
int count = TagListSubActivity.countActiveTasks(activeTasks, tasks); int count = TagListSubActivity.countActiveTasks(activeTasks, tasks);
if(count > 0) { if(count > 0) {
Resources r = context.getResources(); Resources r = context.getResources();
String reminder = r.getString(R.string.notif_tagNotification, String reminder = r.getString(R.string.notif_tagNotification).
count, tagName); replace("$NUM", r.getQuantityString(R.plurals.Ntasks, count, count)).
replace("$TAG", tagName);
Notifications.showTagNotification(context, tagId, reminder); Notifications.showTagNotification(context, tagId, reminder);
Preferences.setLocaleLastAlertTime(context, tagId, Preferences.setLocaleLastAlertTime(context, tagId,

@ -23,6 +23,7 @@ public class Preferences {
private static final String P_SYNC_LAST_SYNC_ATTEMPT = "lastsyncattempt"; private static final String P_SYNC_LAST_SYNC_ATTEMPT = "lastsyncattempt";
private static final String P_LOCALE_LAST_NOTIFY = "locnot"; private static final String P_LOCALE_LAST_NOTIFY = "locnot";
private static final String P_DID_ANDROID_AND_ME_SURVEY = "aamsurvey"; private static final String P_DID_ANDROID_AND_ME_SURVEY = "aamsurvey";
private static final String P_TAG_LIST_SORT = "tgsort";
// pref values // pref values
public static final int ICON_SET_PINK = 0; public static final int ICON_SET_PINK = 0;
@ -205,6 +206,18 @@ public class Preferences {
editor.commit(); editor.commit();
} }
/** TagListSort: the sorting method for the tag list */
public static int getTagListSort(Context context) {
return getPrefs(context).getInt(P_TASK_LIST_SORT, 0);
}
/** TagListSort: the sorting method for the tag list */
public static void setTagListSort(Context context, int value) {
Editor editor = getPrefs(context).edit();
editor.putInt(P_TASK_LIST_SORT, value);
editor.commit();
}
// --- synchronization preferences // --- synchronization preferences
/** RTM authentication token, or null if doesn't exist */ /** RTM authentication token, or null if doesn't exist */

Loading…
Cancel
Save