diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 5d92f6a44..bef2c9293 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -13,9 +13,11 @@ + + @@ -23,14 +25,32 @@ + - + + + + + + + + + + + + + + + + + diff --git a/res/drawable/icon_add.png b/res/drawable/icon_add.png new file mode 100644 index 000000000..14e1362c9 Binary files /dev/null and b/res/drawable/icon_add.png differ diff --git a/res/drawable/icon_tag.png b/res/drawable/icon_tag.png new file mode 100644 index 000000000..75de4e666 Binary files /dev/null and b/res/drawable/icon_tag.png differ diff --git a/res/values/strings.xml b/res/values/strings.xml index b64f912d5..964785a2b 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -101,6 +101,7 @@ Tagged \"%s\": hidden New Task + Could Not Find Requested Tag! H @@ -227,6 +228,9 @@ If you don\'t want to see the new task right after you complete the old one, you Delete Tag Show on Home Page Hide on Home Page + Create Shortcut + Shortcut created on your home screen! + Tag: Sort A-Z Sort by Size diff --git a/src/com/timsu/astrid/activities/TagListSubActivity.java b/src/com/timsu/astrid/activities/TagListSubActivity.java index 61912dee2..3910f17e6 100644 --- a/src/com/timsu/astrid/activities/TagListSubActivity.java +++ b/src/com/timsu/astrid/activities/TagListSubActivity.java @@ -25,12 +25,15 @@ import java.util.LinkedList; import java.util.List; import android.app.AlertDialog; +import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.res.Resources; import android.database.Cursor; import android.database.StaleDataException; +import android.graphics.drawable.BitmapDrawable; +import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.util.Log; @@ -48,6 +51,7 @@ import android.widget.ArrayAdapter; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.TextView; +import android.widget.Toast; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.OnItemClickListener; @@ -55,7 +59,6 @@ import com.timsu.astrid.R; import com.timsu.astrid.data.tag.TagIdentifier; import com.timsu.astrid.data.tag.TagModelForView; import com.timsu.astrid.data.task.TaskIdentifier; -import com.timsu.astrid.data.task.TaskModelForList; import com.timsu.astrid.utilities.DialogUtilities; @@ -73,10 +76,10 @@ public class TagListSubActivity extends SubActivity { 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 static final int CONTEXT_SHORTCUT_ID = Menu.FIRST + 13; private ListView listView; private LinkedList tagArray; - private HashMap taskMap; HashMap tagToTaskCount; private Handler handler; private TextView loadingText; @@ -126,26 +129,13 @@ public class TagListSubActivity extends SubActivity { // get all tasks Cursor taskCursor = getTaskController().getActiveTaskListCursor(); startManagingCursor(taskCursor); - List taskArray = - getTaskController().createTaskListFromCursor(taskCursor); - taskMap = new HashMap(); - for(TaskModelForList task : taskArray) { - if(task.isHidden()) - continue; - taskMap.put(task.getTaskIdentifier().getId(), task); - } - // get accurate task count for each tag + // get task count for each tag tagToTaskCount = new HashMap(); for(TagModelForView tag : tagArray) { - int count = 0; - List tasks = getTagController().getTaggedTasks( + LinkedList tasks = getTagController().getTaggedTasks( getParent(), tag.getTagIdentifier()); - - for(TaskIdentifier taskId : tasks) - if(taskMap.containsKey(taskId.getId())) - count++; - tagToTaskCount.put(tag, count); + tagToTaskCount.put(tag, tasks.size()); } // do sort @@ -240,6 +230,9 @@ public class TagListSubActivity extends SubActivity { menu.add(position, CONTEXT_SHOWHIDE_ID, Menu.NONE, showHideLabel); + menu.add(position, CONTEXT_SHORTCUT_ID, Menu.NONE, + R.string.tagList_context_shortcut); + menu.setHeaderTitle(tagArray.get(position).getName()); } }); @@ -332,6 +325,27 @@ public class TagListSubActivity extends SubActivity { } fillData(); return true; + case CONTEXT_SHORTCUT_ID: + tag = tagArray.get(item.getGroupId()); + Resources r = getResources(); + Intent shortcutIntent = new Intent(Intent.ACTION_VIEW); + shortcutIntent.setComponent(new ComponentName( + getParent().getApplicationContext(), TagView.class)); + shortcutIntent.setData(Uri.parse("tag:" + tag.getTagIdentifier().getId())); + + Intent createShortcutIntent = new Intent(); + createShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); + String label = tag.getName(); + if(tag.shouldHideFromMainList()) + label = label.substring(1); + createShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, label); + createShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON, + ((BitmapDrawable)r.getDrawable(R.drawable.icon_tag)).getBitmap()); + createShortcutIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT"); + + getParent().sendBroadcast(createShortcutIntent); + Toast.makeText(getParent(), R.string.tagList_shortcut_created, Toast.LENGTH_SHORT).show(); + return true; } return false; diff --git a/src/com/timsu/astrid/activities/TagView.java b/src/com/timsu/astrid/activities/TagView.java new file mode 100644 index 000000000..fdde8bd8d --- /dev/null +++ b/src/com/timsu/astrid/activities/TagView.java @@ -0,0 +1,62 @@ +/* + * ASTRID: Android's Simple Task Recording Dashboard + * + * Copyright (c) 2009 Tim Su + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package com.timsu.astrid.activities; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; + +/** + * This activity is launched from a desktop shortcut and takes the user to + * view a specific tag + * + * @author timsu + * + */ +public class TagView extends Activity { + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + launchTaskList(getIntent()); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + + launchTaskList(intent); + } + + private void launchTaskList(Intent intent) { + String tag = intent.getData().toString(); + long tagId = Long.parseLong(tag.substring(tag.indexOf(":")+1)); + + Bundle variables = new Bundle(); + variables.putLong(TaskListSubActivity.TAG_TOKEN, tagId); + + Intent taskListIntent = new Intent(this, TaskList.class); + taskListIntent.putExtra(TaskList.VARIABLES_TAG, variables); + startActivity(taskListIntent); + + finish(); + } +} diff --git a/src/com/timsu/astrid/activities/TaskEdit.java b/src/com/timsu/astrid/activities/TaskEdit.java index 1f36e1c62..b5267f3bc 100644 --- a/src/com/timsu/astrid/activities/TaskEdit.java +++ b/src/com/timsu/astrid/activities/TaskEdit.java @@ -263,6 +263,9 @@ public class TaskEdit extends TaskModificationTabbedActivity { if(name.getText().length() == 0) return; + // tell the task list to update itself + TaskListSubActivity.shouldRefreshTaskList = true; + model.setName(name.getText().toString()); model.setEstimatedSeconds(estimatedDuration.getTimeDurationInSeconds()); model.setElapsedSeconds(elapsedDuration.getTimeDurationInSeconds()); @@ -553,6 +556,9 @@ public class TaskEdit extends TaskModificationTabbedActivity { new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { + // tell the task list to update itself + TaskListSubActivity.shouldRefreshTaskList = true; + controller.deleteTask(model.getTaskIdentifier()); shouldSaveState = false; setResult(Constants.RESULT_GO_HOME); diff --git a/src/com/timsu/astrid/activities/TaskListNotify.java b/src/com/timsu/astrid/activities/TaskListNotify.java index b6d409405..75fbb2b6b 100644 --- a/src/com/timsu/astrid/activities/TaskListNotify.java +++ b/src/com/timsu/astrid/activities/TaskListNotify.java @@ -25,7 +25,7 @@ import android.os.Bundle; /** * This activity is launched when a user opens up a notification from the - * tray. It launches the appropriate activity based on the passed in parametes. + * tray. It launches the appropriate activity based on the passed in parameters. * * @author timsu * diff --git a/src/com/timsu/astrid/activities/TaskListSubActivity.java b/src/com/timsu/astrid/activities/TaskListSubActivity.java index aafb3f514..6ea5889ed 100644 --- a/src/com/timsu/astrid/activities/TaskListSubActivity.java +++ b/src/com/timsu/astrid/activities/TaskListSubActivity.java @@ -49,6 +49,7 @@ import android.view.View.OnCreateContextMenuListener; import android.widget.Button; import android.widget.ListView; import android.widget.TextView; +import android.widget.Toast; import com.timsu.astrid.R; import com.timsu.astrid.activities.TaskListAdapter.TaskListAdapterHooks; @@ -123,6 +124,10 @@ public class TaskListSubActivity extends SubActivity { private View layout; private TextView loadingText; + // indicator flag set if task list should be refreshed (something changed + // in another activity) + static boolean shouldRefreshTaskList = false; + // other instance variables class TaskListContext { Map tagMap; @@ -194,7 +199,10 @@ public class TaskListSubActivity extends SubActivity { if(variables != null && variables.containsKey(TAG_TOKEN)) { TagIdentifier identifier = new TagIdentifier(variables.getLong(TAG_TOKEN)); context.tagMap = getTagController().getAllTagsAsMap(getParent()); - context.filterTag = context.tagMap.get(identifier); + if(context.tagMap.containsKey(identifier)) + context.filterTag = context.tagMap.get(identifier); + else + Toast.makeText(getParent(), R.string.missing_tag, Toast.LENGTH_SHORT).show(); } // time to go! @@ -776,6 +784,15 @@ public class TaskListSubActivity extends SubActivity { context.loadingThread.stop(); } + @Override + void onWindowFocusChanged(boolean hasFocus) { + super.onWindowFocusChanged(hasFocus); + + if(shouldRefreshTaskList) + reloadList(); + shouldRefreshTaskList = false; + } + @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(resultCode == Constants.RESULT_SYNCHRONIZE) { @@ -792,11 +809,6 @@ public class TaskListSubActivity extends SubActivity { }); } else if(requestCode == ACTIVITY_TAGS) { switchToActivity(TaskList.AC_TAG_LIST, null); - } else if((requestCode == ACTIVITY_EDIT || requestCode == ACTIVITY_CREATE) && - resultCode != Constants.RESULT_DISCARD) { - - // refresh, since stuff might have changed... - reloadList(); } }