Feature updates:

- hiding tags from home page
   - inactive tags colored gray
   - quiet hours

  Bug fixes
   - cosmetic fix with progress %
   - don't set alarms all the time
pull/14/head
Tim Su 16 years ago
parent 080878e216
commit 519acb304f

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.timsu.astrid"
android:versionCode="22"
android:versionName="1.7.12">
android:versionCode="23"
android:versionName="1.8">
<uses-permission android:name="android.permission.VIBRATE"/>
@ -26,6 +26,10 @@
<activity android:name=".activities.TaskEdit"/>
<activity android:name=".activities.TagList"/>
<activity android:name=".activities.EditPreferences"/>
<!-- Receivers -->
<receiver android:name=".utilities.Notifications">
</receiver>

@ -18,48 +18,18 @@
<!-- Enabled states -->
<item android:state_checked="true" android:state_window_focused="false"
android:state_enabled="true"
android:drawable="@drawable/btn_check_on" />
<item android:state_checked="false" android:state_window_focused="false"
android:state_enabled="true"
android:drawable="@drawable/btn_check_off" />
<item android:state_checked="true" android:state_pressed="true"
android:state_enabled="true"
android:drawable="@drawable/btn_check_on_pressed" />
<item android:state_checked="false" android:state_pressed="true"
android:state_enabled="true"
android:drawable="@drawable/btn_check_off_pressed" />
<item android:state_checked="true" android:state_focused="true"
android:state_enabled="true"
android:drawable="@drawable/btn_check_on_selected" />
<item android:state_checked="false" android:state_focused="true"
android:state_enabled="true"
android:drawable="@drawable/btn_check_off_selected" />
android:drawable="@drawable/btn_check_on_pressed" />
<item android:state_checked="false"
android:state_enabled="true"
android:drawable="@drawable/btn_check_off" />
android:drawable="@drawable/btn_check_0" />
<item android:state_checked="true"
android:state_enabled="true"
android:drawable="@drawable/btn_check_on" />
<!-- Disabled states -->
<item android:state_checked="true" android:state_window_focused="false"
android:drawable="@drawable/btn_check_on_disable" />
<item android:state_checked="false" android:state_window_focused="false"
android:drawable="@drawable/btn_check_off_disable" />
<item android:state_checked="true" android:state_focused="true"
android:drawable="@drawable/btn_check_on_disable_focused" />
<item android:state_checked="false" android:state_focused="true"
android:drawable="@drawable/btn_check_off_disable_focused" />
<item android:state_checked="false" android:drawable="@drawable/btn_check_off_disable" />
<item android:state_checked="true" android:drawable="@drawable/btn_check_on_disable" />
</selector>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

@ -30,8 +30,8 @@
<CheckBox android:id="@+id/cb1"
android:gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="5dip"/>
android:layout_height="fill_parent"
android:paddingLeft="5dip" />
<ImageView android:id="@+id/image1"
android:gravity="center_vertical"

@ -92,6 +92,7 @@
<string name="taskList_filter_title">Filters</string>
<string name="taskList_filter_hidden">Hidden/Blocked Tasks</string>
<string name="taskList_filter_done">Completed Tasks</string>
<string name="taskList_filter_tagged">Tagged \'%s\'</string>
<!-- TaskEdit -->
<skip />
@ -143,12 +144,14 @@
<string name="ago_suffix"> Ago</string>
<string name="progress_dialog">% of Task Finished</string>
<!-- TaskList -->
<!-- Tag List -->
<skip />
<string name="tagList_titlePrefix">Astrid: Tag View: </string>
<string name="tagList_context_create">Create Task With Tag</string>
<string name="tagList_context_edit">Edit Tag</string>
<string name="tagList_context_delete">Delete Tag</string>
<string name="tagList_context_showTag">Show on Home Page</string>
<string name="tagList_context_hideTag">Hide on Home Page</string>
<string name="tagList_menu_sortAlpha">Sort A-Z</string>
<string name="tagList_menu_sortSize">Sort by Size</string>
@ -172,10 +175,16 @@
<string name="notif_definiteDueDate">Absolute Deadline!</string>
<string name="notif_preferredDueDate">Goal Deadline!</string>
<!-- Error MEssages -->
<!-- Error Messages -->
<skip />
<string name="error_opening">Couldn't find this item:</string>
<string name="error_saving">Couldn't save:</string>
<!-- Preference Keys -->
<skip />
<string name="p_notif_quietStart">notif_qstart</string>
<string name="p_notif_quietEnd">notif_qend</string>
</resources>

@ -0,0 +1,11 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<EditTextPreference
android:key="@string/p_notif_quietStart"
android:title="Quiet Hours Start"
android:summary="Starting hour when Astrid should be quiet (e.g. 22)" />
<EditTextPreference
android:key="@string/p_notif_quietEnd"
android:title="Quiet Hours End"
android:summary="Ending hour when Astrid should be quiet (e.g. 08)" />
</PreferenceScreen>

@ -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);
}
}

@ -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<TaskModelForList> taskArray =
taskController.createTaskListFromCursor(taskCursor, true);
taskController.createTaskListFromCursor(taskCursor);
taskMap = new HashMap<Long, TaskModelForList>();
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<TagModelForView, Integer>();
@ -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);

@ -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<TaskModelForList> taskArray;
private Map<TagIdentifier, TagModelForView> tagMap;
private List<TaskModelForList> taskArray;
private Map<TaskModelForList, List<TagModelForView>> 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<TaskIdentifier> 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<TaskModelForList, List<TagModelForView>>();
for(Iterator<TaskModelForList> 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<TagIdentifier> tagIds = tagController.getTaskTags(this,
task.getTaskIdentifier());
List<TagModelForView> tags = new LinkedList<TagModelForView>();
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<TagIdentifier, TagModelForView> getTagMap() {
return tagMap;
public List<TagModelForView> 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);

@ -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<TaskModelForList> {
public interface TaskListAdapterHooks {
List<TaskModelForList> getTaskArray();
Map<TagIdentifier, TagModelForView> getTagMap();
List<TagModelForView> getTagsFor(TaskModelForList task);
TaskController getTaskController();
TagController getTagController();
void performItemClick(View v, int position);
@ -166,11 +164,10 @@ public class TaskListAdapter extends ArrayAdapter<TaskModelForList> {
}
// tags
List<TagIdentifier> tags = hooks.getTagController().getTaskTags(
activity, task.getTaskIdentifier());
List<TagModelForView> tags = hooks.getTagsFor(task);
StringBuilder tagString = new StringBuilder();
for(Iterator<TagIdentifier> i = tags.iterator(); i.hasNext(); ) {
TagModelForView tag = hooks.getTagMap().get(i.next());
for(Iterator<TagModelForView> i = tags.iterator(); i.hasNext(); ) {
TagModelForView tag = i.next();
tagString.append(tag.getName());
if(i.hasNext())
tagString.append(", ");

@ -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());
}
}

@ -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);
}

@ -99,8 +99,7 @@ public class TaskController extends AbstractController {
}
/** Create a weighted list of tasks from the db cursor given */
public List<TaskModelForList> createTaskListFromCursor(Cursor cursor,
boolean hideHidden) {
public List<TaskModelForList> createTaskListFromCursor(Cursor cursor) {
List<TaskModelForList> list = new ArrayList<TaskModelForList>();
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 */

@ -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<TaskModelForList> sortAndFilterList(
List<TaskModelForList> list, boolean hideHidden) {
static List<TaskModelForList> sortTaskList(List<TaskModelForList> list) {
final HashMap<TaskModelForList, Integer> weights = new
HashMap<TaskModelForList, Integer>();
// first, load everything
for(Iterator<TaskModelForList> 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

@ -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 {

@ -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;
}
}
}

@ -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;
}
}

Loading…
Cancel
Save