diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 6be1e5726..443ed8ea1 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="23" + android:versionName="1.8"> @@ -26,6 +26,10 @@ + + + + diff --git a/res/drawable/btn_check0.xml b/res/drawable/btn_check0.xml index 824aff074..9061d8956 100644 --- a/res/drawable/btn_check0.xml +++ b/res/drawable/btn_check0.xml @@ -18,48 +18,18 @@ - - - - - - + android:drawable="@drawable/btn_check_on_pressed" /> + android:drawable="@drawable/btn_check_0" /> - - - - - - - - - - - - diff --git a/res/drawable/btn_check_0.png b/res/drawable/btn_check_0.png new file mode 100644 index 000000000..8bd6db1f1 Binary files /dev/null and b/res/drawable/btn_check_0.png differ diff --git a/res/layout/task_list_row.xml b/res/layout/task_list_row.xml index d663f9bba..5c67b5500 100644 --- a/res/layout/task_list_row.xml +++ b/res/layout/task_list_row.xml @@ -30,8 +30,8 @@ + android:layout_height="fill_parent" + android:paddingLeft="5dip" /> Filters Hidden/Blocked Tasks Completed Tasks + Tagged \'%s\' @@ -143,12 +144,14 @@ Ago % of Task Finished - + Astrid: Tag View: Create Task With Tag Edit Tag Delete Tag + Show on Home Page + Hide on Home Page Sort A-Z Sort by Size @@ -172,10 +175,16 @@ Absolute Deadline! Goal Deadline! - + Couldn't find this item: Couldn't save: + + + notif_qstart + notif_qend + + diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml new file mode 100644 index 000000000..9b6050173 --- /dev/null +++ b/res/xml/preferences.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/src/com/timsu/astrid/activities/EditPreferences.java b/src/com/timsu/astrid/activities/EditPreferences.java new file mode 100644 index 000000000..73ceb43d1 --- /dev/null +++ b/src/com/timsu/astrid/activities/EditPreferences.java @@ -0,0 +1,15 @@ +package com.timsu.astrid.activities; + +import android.os.Bundle; +import android.preference.PreferenceActivity; + +import com.timsu.astrid.R; + +public class EditPreferences extends PreferenceActivity { + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.preferences); + } +} \ No newline at end of file diff --git a/src/com/timsu/astrid/activities/TagList.java b/src/com/timsu/astrid/activities/TagList.java index 4068cbd2f..46f9e3637 100644 --- a/src/com/timsu/astrid/activities/TagList.java +++ b/src/com/timsu/astrid/activities/TagList.java @@ -69,6 +69,7 @@ public class TagList extends Activity { private static final int MENU_SORT_SIZE_ID = Menu.FIRST + 1; private static final int CONTEXT_CREATE_ID = Menu.FIRST + 10; private static final int CONTEXT_DELETE_ID = Menu.FIRST + 11; + private static final int CONTEXT_SHOWHIDE_ID = Menu.FIRST + 12; private TagController controller; private TaskController taskController; @@ -116,10 +117,13 @@ public class TagList extends Activity { Cursor taskCursor = taskController.getActiveTaskListCursor(); startManagingCursor(taskCursor); List taskArray = - taskController.createTaskListFromCursor(taskCursor, true); + taskController.createTaskListFromCursor(taskCursor); taskMap = new HashMap(); - for(TaskModelForList task : taskArray) + for(TaskModelForList task : taskArray) { + if(task.isHidden()) + continue; taskMap.put(task.getTaskIdentifier().getId(), task); + } // get accurate task count for each tag tagToTaskCount = new HashMap(); @@ -195,6 +199,12 @@ public class TagList extends Activity { menu.add(position, CONTEXT_DELETE_ID, Menu.NONE, R.string.tagList_context_delete); + int showHideLabel = R.string.tagList_context_hideTag; + if(tagArray.get(position).shouldHideFromMainList()) + showHideLabel = R.string.tagList_context_showTag; + menu.add(position, CONTEXT_SHOWHIDE_ID, Menu.NONE, + showHideLabel); + menu.setHeaderTitle(tagArray.get(position).getName()); } }); @@ -203,7 +213,10 @@ public class TagList extends Activity { @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { - fillData(); + if(resultCode == TaskList.RESULT_CODE_CLEAR_TAG) + finish(); + else + fillData(); } // --- list adapter @@ -234,12 +247,15 @@ public class TagList extends Activity { } public void setupView(View view, final TagModelForView tag) { - // set up basic properties + Resources r = getResources(); view.setTag(tag); final TextView name = ((TextView)view.findViewById(android.R.id.text1)); name.setText(new StringBuilder(tag.getName()). append(" (").append(tagToTaskCount.get(tag)).append(")")); + + if(tagToTaskCount.get(tag) == 0) + name.setTextColor(r.getColor(R.color.task_list_done)); } } @@ -279,7 +295,7 @@ public class TagList extends Activity { sortReverse = false; } fillData(); - break; + return true; case MENU_SORT_SIZE_ID: if(sortMode == SortMode.SIZE) sortReverse = !sortReverse; @@ -288,7 +304,7 @@ public class TagList extends Activity { sortReverse = false; } fillData(); - break; + return true; case CONTEXT_CREATE_ID: TagModelForView tag = tagArray.get(item.getGroupId()); createTask(tag); @@ -297,6 +313,12 @@ public class TagList extends Activity { tag = tagArray.get(item.getGroupId()); deleteTag(tag.getTagIdentifier()); return true; + case CONTEXT_SHOWHIDE_ID: + tag = tagArray.get(item.getGroupId()); + tag.toggleHideFromMainList(); + controller.saveTag(tag); + fillData(); + return true; } return super.onMenuItemSelected(featureId, item); diff --git a/src/com/timsu/astrid/activities/TaskList.java b/src/com/timsu/astrid/activities/TaskList.java index c91dfcd0d..f444d34c6 100644 --- a/src/com/timsu/astrid/activities/TaskList.java +++ b/src/com/timsu/astrid/activities/TaskList.java @@ -19,6 +19,9 @@ */ package com.timsu.astrid.activities; import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -49,6 +52,7 @@ import com.timsu.astrid.data.task.TaskController; import com.timsu.astrid.data.task.TaskIdentifier; import com.timsu.astrid.data.task.TaskModelForList; import com.timsu.astrid.utilities.Notifications; +import com.timsu.astrid.utilities.StartupReceiver; /** Primary view for the Astrid Application. Lists all of the tasks in the @@ -62,6 +66,9 @@ public class TaskList extends Activity { // bundle tokens public static final String TAG_TOKEN = "tag"; + // result codes + public static final int RESULT_CODE_CLEAR_TAG = RESULT_FIRST_USER; + // activities private static final int ACTIVITY_CREATE = 0; private static final int ACTIVITY_VIEW = 1; @@ -72,8 +79,11 @@ public class TaskList extends Activity { private static final int INSERT_ID = Menu.FIRST; private static final int FILTERS_ID = Menu.FIRST + 1; private static final int TAGS_ID = Menu.FIRST + 2; + private static final int SETTINGS_ID = Menu.FIRST + 3; + private static final int CONTEXT_FILTER_HIDDEN = Menu.FIRST + 20; private static final int CONTEXT_FILTER_DONE = Menu.FIRST + 21; + private static final int CONTEXT_FILTER_TAG = Menu.FIRST + 22; // UI components private TaskController controller; @@ -82,8 +92,9 @@ public class TaskList extends Activity { private Button addButton; // other instance variables - private List taskArray; private Map tagMap; + private List taskArray; + private Map> taskTags; private boolean filterShowHidden = false; private boolean filterShowDone = false; private TagModelForView filterTag = null; @@ -100,10 +111,7 @@ public class TaskList extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.task_list); - // if we've never been started, do this - if(!Notifications.areAlarmsSet()) - Notifications.scheduleAllAlarms(this); - + StartupReceiver.onStartupApplication(this); shouldCloseInstance = false; controller = new TaskController(this); @@ -123,27 +131,7 @@ public class TaskList extends Activity { fillData(); - // filters context menu - listView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() { - @Override - public void onCreateContextMenu(ContextMenu menu, View v, - ContextMenuInfo menuInfo) { - if(menu.hasVisibleItems()) - return; - - MenuItem item = menu.add(Menu.NONE, CONTEXT_FILTER_HIDDEN, Menu.NONE, - R.string.taskList_filter_hidden); - item.setCheckable(true); - item.setChecked(filterShowHidden); - - item = menu.add(Menu.NONE, CONTEXT_FILTER_DONE, Menu.NONE, - R.string.taskList_filter_done); - item.setCheckable(true); - item.setChecked(filterShowDone); - - menu.setHeaderTitle(R.string.taskList_filter_title); - } - }); + Notifications.showNotification(this, 1, 0, "haha"); } @Override @@ -157,17 +145,20 @@ public class TaskList extends Activity { item.setIcon(android.R.drawable.ic_menu_add); item.setAlphabeticShortcut('n'); - if(filterTag == null) { - item = menu.add(Menu.NONE, FILTERS_ID, Menu.NONE, - R.string.taskList_menu_filters); - item.setIcon(android.R.drawable.ic_menu_view); - item.setAlphabeticShortcut('f'); - - item = menu.add(Menu.NONE, TAGS_ID, Menu.NONE, - R.string.taskList_menu_tags); - item.setIcon(android.R.drawable.ic_menu_myplaces); - item.setAlphabeticShortcut('t'); - } + item = menu.add(Menu.NONE, FILTERS_ID, Menu.NONE, + R.string.taskList_menu_filters); + item.setIcon(android.R.drawable.ic_menu_view); + item.setAlphabeticShortcut('f'); + + item = menu.add(Menu.NONE, TAGS_ID, Menu.NONE, + R.string.taskList_menu_tags); + item.setIcon(android.R.drawable.ic_menu_myplaces); + item.setAlphabeticShortcut('t'); + + item = menu.add(Menu.NONE, SETTINGS_ID, Menu.NONE, + R.string.taskList_menu_settings); + item.setIcon(android.R.drawable.ic_menu_preferences); + item.setAlphabeticShortcut('p'); return true; } @@ -176,12 +167,24 @@ public class TaskList extends Activity { * ====================================================== populating list * ====================================================================== */ + private boolean isTaskHidden(TaskModelForList task) { + if(task.isHidden()) + return true; + + if(filterTag == null) { + for(TagModelForView tags : taskTags.get(task)) { + if(tags.shouldHideFromMainList()) + return true; + } + } + + return false; + } + /** Fill in the Task List with our tasks */ private void fillData() { Resources r = getResources(); - Cursor tasksCursor; - // load tags (they might've changed) tagMap = tagController.getAllTagsAsMap(this); Bundle extras = getIntent().getExtras(); @@ -190,7 +193,8 @@ public class TaskList extends Activity { filterTag = tagMap.get(identifier); } - // get the array of tasks + // get a cursor to the task list + Cursor tasksCursor; if(filterTag != null) { List tasks = tagController.getTaggedTasks(this, filterTag.getTagIdentifier()); @@ -202,18 +206,46 @@ public class TaskList extends Activity { tasksCursor = controller.getActiveTaskListCursor(); } startManagingCursor(tasksCursor); + taskArray = controller.createTaskListFromCursor(tasksCursor); + + // read tags and apply filters + int hiddenTasks = 0; // # of tasks hidden + int completedTasks = 0; // # of tasks on list that are done + taskTags = new HashMap>(); + for(Iterator i = taskArray.iterator(); i.hasNext();) { + TaskModelForList task = i.next(); + + if(task.isTaskCompleted()) { + if(!filterShowDone) { + i.remove(); + continue; + } else + completedTasks++; + } - taskArray = controller.createTaskListFromCursor(tasksCursor, - !filterShowHidden); - int hiddenTasks = tasksCursor.getCount() - taskArray.size(); - int doneTasks = 0; - for(TaskModelForList task : taskArray) - if(task.isTaskCompleted()) - doneTasks++; - int activeTasks = taskArray.size() - doneTasks; + // get list of tags + List tagIds = tagController.getTaskTags(this, + task.getTaskIdentifier()); + List tags = new LinkedList(); + for(TagIdentifier tagId : tagIds) { + TagModelForView tag = tagMap.get(tagId); + tags.add(tag); + } + taskTags.put(task, tags); + + // hide hidden + if(!filterShowHidden) { + if(isTaskHidden(task)) { + hiddenTasks++; + i.remove(); + continue; + } + } + } + int activeTasks = taskArray.size() - completedTasks; // hide "add" button if we have a few tasks - if(taskArray.size() > 2) + if(taskArray.size() > 4) addButton.setVisibility(View.GONE); else addButton.setVisibility(View.VISIBLE); @@ -226,7 +258,7 @@ public class TaskList extends Activity { filterTag.getName())).append(" "); } - if(doneTasks > 0) + if(completedTasks > 0) title.append(r.getQuantityString(R.plurals.NactiveTasks, activeTasks, activeTasks, taskArray.size())); else @@ -237,7 +269,11 @@ public class TaskList extends Activity { append(r.getString(R.string.taskList_hiddenSuffix)).append(")"); setTitle(title); - // set up our adapter + setUpListUI(); + } + + private void setUpListUI() { + // set up our adapter TaskListAdapter tasks = new TaskListAdapter(this, this, R.layout.task_list_row, taskArray, new TaskListAdapterHooks() { @Override @@ -246,8 +282,9 @@ public class TaskList extends Activity { } @Override - public Map getTagMap() { - return tagMap; + public List getTagsFor( + TaskModelForList task) { + return taskTags.get(task); } @Override @@ -281,6 +318,37 @@ public class TaskList extends Activity { startActivityForResult(intent, ACTIVITY_VIEW); } }); + + // filters context menu + listView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() { + @Override + public void onCreateContextMenu(ContextMenu menu, View v, + ContextMenuInfo menuInfo) { + if(menu.hasVisibleItems()) + return; + Resources r = getResources(); + + MenuItem item = menu.add(Menu.NONE, CONTEXT_FILTER_HIDDEN, + Menu.NONE, R.string.taskList_filter_hidden); + item.setCheckable(true); + item.setChecked(filterShowHidden); + + item = menu.add(Menu.NONE, CONTEXT_FILTER_DONE, Menu.NONE, + R.string.taskList_filter_done); + item.setCheckable(true); + item.setChecked(filterShowDone); + + if(filterTag != null) { + item = menu.add(Menu.NONE, CONTEXT_FILTER_TAG, Menu.NONE, + r.getString(R.string.taskList_filter_tagged, + filterTag.getName())); + item.setCheckable(true); + item.setChecked(true); + } + + menu.setHeaderTitle(R.string.taskList_filter_title); + } + }); } /* ====================================================================== @@ -353,6 +421,9 @@ public class TaskList extends Activity { finish(); } return true; + case SETTINGS_ID: + startActivity(new Intent(this, EditPreferences.class)); + return true; case TaskListAdapter.CONTEXT_EDIT_ID: task = taskArray.get(item.getGroupId()); @@ -383,6 +454,10 @@ public class TaskList extends Activity { filterShowDone = !filterShowDone; fillData(); return true; + case CONTEXT_FILTER_TAG: + setResult(RESULT_CODE_CLEAR_TAG); + finish(); + return true; } return super.onMenuItemSelected(featureId, item); diff --git a/src/com/timsu/astrid/activities/TaskListAdapter.java b/src/com/timsu/astrid/activities/TaskListAdapter.java index 8e25a319a..3a396ca6d 100644 --- a/src/com/timsu/astrid/activities/TaskListAdapter.java +++ b/src/com/timsu/astrid/activities/TaskListAdapter.java @@ -20,7 +20,6 @@ package com.timsu.astrid.activities; import java.util.Date; import java.util.Iterator; import java.util.List; -import java.util.Map; import android.app.Activity; import android.app.AlertDialog; @@ -43,7 +42,6 @@ import android.widget.CompoundButton.OnCheckedChangeListener; import com.timsu.astrid.R; import com.timsu.astrid.data.tag.TagController; -import com.timsu.astrid.data.tag.TagIdentifier; import com.timsu.astrid.data.tag.TagModelForView; import com.timsu.astrid.data.task.TaskController; import com.timsu.astrid.data.task.TaskModelForList; @@ -68,7 +66,7 @@ public class TaskListAdapter extends ArrayAdapter { public interface TaskListAdapterHooks { List getTaskArray(); - Map getTagMap(); + List getTagsFor(TaskModelForList task); TaskController getTaskController(); TagController getTagController(); void performItemClick(View v, int position); @@ -166,11 +164,10 @@ public class TaskListAdapter extends ArrayAdapter { } // tags - List tags = hooks.getTagController().getTaskTags( - activity, task.getTaskIdentifier()); + List tags = hooks.getTagsFor(task); StringBuilder tagString = new StringBuilder(); - for(Iterator i = tags.iterator(); i.hasNext(); ) { - TagModelForView tag = hooks.getTagMap().get(i.next()); + for(Iterator i = tags.iterator(); i.hasNext(); ) { + TagModelForView tag = i.next(); tagString.append(tag.getName()); if(i.hasNext()) tagString.append(", "); diff --git a/src/com/timsu/astrid/data/tag/TagModelForView.java b/src/com/timsu/astrid/data/tag/TagModelForView.java index e6214ce8f..c12c98f66 100644 --- a/src/com/timsu/astrid/data/tag/TagModelForView.java +++ b/src/com/timsu/astrid/data/tag/TagModelForView.java @@ -33,6 +33,7 @@ public class TagModelForView extends AbstractTagModel { }; public static TagModelForView UNTAGGED_TASKS = new TagModelForView("[untagged]"); + public static String HIDDEN_FROM_MAIN_LIST_PREFIX = "_"; // --- constructors @@ -59,4 +60,15 @@ public class TagModelForView extends AbstractTagModel { public String toString() { return getName(); } + + public boolean shouldHideFromMainList() { + return getName().startsWith(HIDDEN_FROM_MAIN_LIST_PREFIX); + } + + public void toggleHideFromMainList() { + if(shouldHideFromMainList()) + setName(getName().substring(HIDDEN_FROM_MAIN_LIST_PREFIX.length())); + else + setName(HIDDEN_FROM_MAIN_LIST_PREFIX + getName()); + } } diff --git a/src/com/timsu/astrid/data/task/AbstractTaskModel.java b/src/com/timsu/astrid/data/task/AbstractTaskModel.java index a3642ff5a..392ca2e3b 100644 --- a/src/com/timsu/astrid/data/task/AbstractTaskModel.java +++ b/src/com/timsu/astrid/data/task/AbstractTaskModel.java @@ -160,6 +160,9 @@ public abstract class AbstractTaskModel extends AbstractModel { /** Stops the timer & increments elapsed time. Requires timerStart and * elapsedSeconds */ protected void stopTimerAndUpdateElapsedTime() { + if(getTimerStart() == null) + return; + long start = getTimerStart().getTime(); setTimerStart(null); long secondsElapsed = (System.currentTimeMillis() - start)/1000; @@ -278,6 +281,12 @@ public abstract class AbstractTaskModel extends AbstractModel { return retrieveDate(HIDDEN_UNTIL); } + protected boolean isHidden() { + if(getHiddenUntil() == null) + return false; + return getHiddenUntil().after(new Date()); + } + protected Date getCreationDate() { return retrieveDate(CREATION_DATE); } diff --git a/src/com/timsu/astrid/data/task/TaskController.java b/src/com/timsu/astrid/data/task/TaskController.java index 3d88c7962..07f65a14d 100644 --- a/src/com/timsu/astrid/data/task/TaskController.java +++ b/src/com/timsu/astrid/data/task/TaskController.java @@ -99,8 +99,7 @@ public class TaskController extends AbstractController { } /** Create a weighted list of tasks from the db cursor given */ - public List createTaskListFromCursor(Cursor cursor, - boolean hideHidden) { + public List createTaskListFromCursor(Cursor cursor) { List list = new ArrayList(); if(cursor.getCount() == 0) @@ -111,7 +110,7 @@ public class TaskController extends AbstractController { list.add(new TaskModelForList(cursor)); } while(!cursor.isLast()); - return TaskModelForList.sortAndFilterList(list, hideHidden); + return TaskModelForList.sortTaskList(list); } /** Create a weighted list of tasks from the db cursor given */ diff --git a/src/com/timsu/astrid/data/task/TaskModelForList.java b/src/com/timsu/astrid/data/task/TaskModelForList.java index 32a5aabde..a63846bf3 100644 --- a/src/com/timsu/astrid/data/task/TaskModelForList.java +++ b/src/com/timsu/astrid/data/task/TaskModelForList.java @@ -52,21 +52,13 @@ public class TaskModelForList extends AbstractTaskModel { /** Takes the incoming list of task models and weights it, removing hidden * tasks if desired. This mutates the list */ - static List sortAndFilterList( - List list, boolean hideHidden) { + static List sortTaskList(List list) { final HashMap weights = new HashMap(); // first, load everything for(Iterator i = list.iterator(); i.hasNext(); ) { TaskModelForList task = i.next(); - if(hideHidden) { - if(task.getHiddenUntil() != null && task.getHiddenUntil(). - getTime() > System.currentTimeMillis()) { - i.remove(); - continue; - } - } weights.put(task, task.getWeight()); } @@ -117,7 +109,10 @@ public class TaskModelForList extends AbstractTaskModel { return weight; } - + @Override + public boolean isHidden() { + return super.isHidden(); + } // --- constructors diff --git a/src/com/timsu/astrid/utilities/Notifications.java b/src/com/timsu/astrid/utilities/Notifications.java index cd133c866..282ce9219 100644 --- a/src/com/timsu/astrid/utilities/Notifications.java +++ b/src/com/timsu/astrid/utilities/Notifications.java @@ -94,10 +94,6 @@ public class Notifications extends BroadcastReceiver { return false; } - public static boolean areAlarmsSet() { - return alarmsSet; - } - public static void scheduleAllAlarms(Context context) { TaskController controller = new TaskController(context); controller.open(); @@ -240,6 +236,20 @@ public class Notifications extends BroadcastReceiver { public static boolean showNotification(Context context, long id, int flags, String reminder) { + // quiet hours? + Integer quietHoursStart = Preferences.getQuietHourStart(context); + Integer quietHoursEnd = Preferences.getQuietHourEnd(context); + if(quietHoursStart != null && quietHoursEnd != null) { + int hour = new Date().getHours(); + if(quietHoursStart < quietHoursEnd) { + if(hour >= quietHoursStart && hour < quietHoursEnd) + return true; + } else { // wrap across 24/hour boundary + if(hour >= quietHoursStart || hour < quietHoursEnd) + return true; + } + } + String taskName; TaskController controller = new TaskController(context); try { diff --git a/src/com/timsu/astrid/utilities/Preferences.java b/src/com/timsu/astrid/utilities/Preferences.java new file mode 100644 index 000000000..800c3818a --- /dev/null +++ b/src/com/timsu/astrid/utilities/Preferences.java @@ -0,0 +1,54 @@ +package com.timsu.astrid.utilities; + +import android.content.Context; +import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; +import android.content.res.Resources; +import android.preference.PreferenceManager; + +import com.timsu.astrid.R; + +public class Preferences { + + private static String CURRENT_VERSION = "cv"; + + private static SharedPreferences getPrefs(Context context) { + return PreferenceManager.getDefaultSharedPreferences(context); + } + + public static int getCurrentVersion(Context context) { + return getPrefs(context).getInt(CURRENT_VERSION, 0); + } + + public static void setCurrentVersion(Context context, int version) { + Editor editor = getPrefs(context).edit(); + editor.putInt(CURRENT_VERSION, version); + editor.commit(); + } + + /** returns hour at which quiet hours start, or null if not set */ + public static Integer getQuietHourStart(Context context) { + Resources r = context.getResources(); + String value = getPrefs(context).getString(r.getString( + R.string.p_notif_quietStart), ""); + + try { + return Integer.parseInt(value); + } catch (Exception e) { + return null; + } + } + + /** returns hour at which quiet hours start, or null if not set */ + public static Integer getQuietHourEnd(Context context) { + Resources r = context.getResources(); + String value = getPrefs(context).getString(r.getString( + R.string.p_notif_quietEnd), ""); + + try { + return Integer.parseInt(value); + } catch (Exception e) { + return null; + } + } +} diff --git a/src/com/timsu/astrid/utilities/StartupReceiver.java b/src/com/timsu/astrid/utilities/StartupReceiver.java index d031061f4..f9fee27e2 100644 --- a/src/com/timsu/astrid/utilities/StartupReceiver.java +++ b/src/com/timsu/astrid/utilities/StartupReceiver.java @@ -3,12 +3,42 @@ package com.timsu.astrid.utilities; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.util.Log; public class StartupReceiver extends BroadcastReceiver { + private static boolean hasStartedUp = false; + @Override + /** Called when the system is started up */ public void onReceive(Context context, Intent intent) { Notifications.scheduleAllAlarms(context); } + /** Called when this application is started up */ + public static void onStartupApplication(Context context) { + if(hasStartedUp) + return; + + int latestSetVersion = Preferences.getCurrentVersion(context); + int version = 0; + try { + PackageManager pm = context.getPackageManager(); + PackageInfo pi = pm.getPackageInfo("com.timsu.astrid", 0); + version = pi.versionCode; + } catch (Exception e) { + Log.e("StartupAstrid", "Error getting version!", e); + } + + // if we just got upgraded, set the alarms + boolean justUpgraded = latestSetVersion != version; + if(justUpgraded) { + Notifications.scheduleAllAlarms(context); + Preferences.setCurrentVersion(context, version); + } + + hasStartedUp = true; + } }