yay! fixed the timer cache thing

pull/14/head
Tim Su 14 years ago
parent 7f3f92eb63
commit 3fa8579c3e

@ -83,30 +83,29 @@ public class Calendars {
Resources r = context.getResources(); Resources r = context.getResources();
Cursor c = cr.query(getCalendarContentUri(CALENDAR_CONTENT_CALENDARS), CALENDARS_PROJECTION, Cursor c = cr.query(getCalendarContentUri(CALENDAR_CONTENT_CALENDARS), CALENDARS_PROJECTION,
CALENDARS_WHERE, null, CALENDARS_SORT); CALENDARS_WHERE, null, CALENDARS_SORT);
try {
// Fetch the current setting. Invalid calendar id will
// be changed to default value.
String defaultSetting = Preferences.getStringValue(R.string.gcal_p_default);
// Fetch the current setting. Invalid calendar id will CalendarResult result = new CalendarResult();
// be changed to default value.
String defaultSetting = Preferences.getStringValue(R.string.gcal_p_default);
CalendarResult result = new CalendarResult(); if (c == null || c.getCount() == 0) {
// Something went wrong when querying calendars. Only offer them
// the system default choice
result.calendars = new String[] {
r.getString(R.string.gcal_GCP_default) };
result.calendarIds = new String[] { null };
result.defaultIndex = 0;
return result;
}
if (c == null || c.getCount() == 0) { int calendarCount = c.getCount();
// Something went wrong when querying calendars. Only offer them
// the system default choice
result.calendars = new String[] {
r.getString(R.string.gcal_GCP_default) };
result.calendarIds = new String[] { null };
result.defaultIndex = 0;
return result;
}
int calendarCount = c.getCount(); result.calendars = new String[calendarCount];
result.calendarIds = new String[calendarCount];
result.calendars = new String[calendarCount]; // Iterate calendars one by one, and fill up the list preference
result.calendarIds = new String[calendarCount];
// Iterate calendars one by one, and fill up the list preference
try {
int row = 0; int row = 0;
int idColumn = c.getColumnIndex(ID_COLUMN_NAME); int idColumn = c.getColumnIndex(ID_COLUMN_NAME);
int nameColumn = c.getColumnIndex(DISPLAY_COLUMN_NAME); int nameColumn = c.getColumnIndex(DISPLAY_COLUMN_NAME);
@ -130,7 +129,8 @@ public class Calendars {
return result; return result;
} finally { } finally {
c.deactivate(); if(c != null)
c.close();
} }
} }

@ -44,7 +44,7 @@ public class TimerActionExposer extends BroadcastReceiver {
Intent newIntent = new Intent(TIMER_ACTION); Intent newIntent = new Intent(TIMER_ACTION);
newIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, taskId); newIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, taskId);
TaskAction action = new TaskAction(label, TaskAction action = new TaskAction(label,
PendingIntent.getBroadcast(context, 0, newIntent, 0)); PendingIntent.getBroadcast(context, (int)taskId, newIntent, 0));
// transmit // transmit
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_ACTIONS); Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_ACTIONS);

@ -77,7 +77,7 @@ public class TimerPlugin extends BroadcastReceiver {
Intent notifyIntent = ShortcutActivity.createIntent(filter); Intent notifyIntent = ShortcutActivity.createIntent(filter);
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); notifyIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(context, PendingIntent pendingIntent = PendingIntent.getActivity(context,
0, notifyIntent, 0); Constants.NOTIFICATION_TIMER, notifyIntent, 0);
Resources r = context.getResources(); Resources r = context.getResources();
String appName = r.getString(R.string.app_name); String appName = r.getString(R.string.app_name);

@ -2,20 +2,23 @@
<!-- See the file "LICENSE" for the full license governing this code. --> <!-- See the file "LICENSE" for the full license governing this code. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="fill_parent"
android:gravity="center"
android:orientation="vertical" android:orientation="vertical"
android:paddingLeft="3px"> android:paddingLeft="3px">
<ImageView <ImageView
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="3"
android:gravity="bottom|center"
android:scaleType="center" android:scaleType="center"
android:src="@drawable/timers_decoration" /> android:src="@drawable/timers_decoration" />
<Chronometer android:id="@+id/timer" <Chronometer android:id="@+id/timer"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="top|center"
android:textSize="10sp" /> android:textSize="10sp" />
</LinearLayout> </LinearLayout>

@ -1,7 +1,6 @@
package com.todoroo.astrid.adapter; package com.todoroo.astrid.adapter;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
@ -15,7 +14,6 @@ import android.database.Cursor;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.Paint; import android.graphics.Paint;
import android.text.Html; import android.text.Html;
import android.util.Log;
import android.view.ContextMenu; import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo; import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -109,6 +107,9 @@ public class TaskAdapter extends CursorAdapter {
protected OnCompletedTaskListener onCompletedTaskListener = null; protected OnCompletedTaskListener onCompletedTaskListener = null;
private int fontSize; private int fontSize;
// the task that's expanded
private long expanded = -1;
// --- task detail and decoration soft caches // --- task detail and decoration soft caches
public final DetailManager detailManager = new DetailManager(false); public final DetailManager detailManager = new DetailManager(false);
@ -161,6 +162,7 @@ public class TaskAdapter extends CursorAdapter {
// create view holder // create view holder
ViewHolder viewHolder = new ViewHolder(); ViewHolder viewHolder = new ViewHolder();
viewHolder.task = new Task(); viewHolder.task = new Task();
viewHolder.view = view;
viewHolder.nameView = (TextView)view.findViewById(R.id.title); viewHolder.nameView = (TextView)view.findViewById(R.id.title);
viewHolder.completeBox = (CheckBox)view.findViewById(R.id.completeBox); viewHolder.completeBox = (CheckBox)view.findViewById(R.id.completeBox);
viewHolder.dueDate = (TextView)view.findViewById(R.id.dueDate); viewHolder.dueDate = (TextView)view.findViewById(R.id.dueDate);
@ -189,11 +191,12 @@ public class TaskAdapter extends CursorAdapter {
public void bindView(View view, Context context, Cursor c) { public void bindView(View view, Context context, Cursor c) {
TodorooCursor<Task> cursor = (TodorooCursor<Task>)c; TodorooCursor<Task> cursor = (TodorooCursor<Task>)c;
ViewHolder viewHolder = ((ViewHolder)view.getTag()); ViewHolder viewHolder = ((ViewHolder)view.getTag());
Task actionItem = viewHolder.task;
actionItem.readFromCursor(cursor); Task task = viewHolder.task;
task.readFromCursor(cursor);
setFieldContentsAndVisibility(view); setFieldContentsAndVisibility(view);
setTaskAppearance(viewHolder, actionItem.isCompleted()); setTaskAppearance(viewHolder, task.isCompleted());
} }
/** Helper method to set the visibility based on if there's stuff inside */ /** Helper method to set the visibility based on if there's stuff inside */
@ -212,6 +215,7 @@ public class TaskAdapter extends CursorAdapter {
*/ */
public class ViewHolder { public class ViewHolder {
public Task task; public Task task;
public View view;
public TextView nameView; public TextView nameView;
public CheckBox completeBox; public CheckBox completeBox;
public TextView dueDate; public TextView dueDate;
@ -220,7 +224,6 @@ public class TaskAdapter extends CursorAdapter {
public View importance; public View importance;
public LinearLayout actions; public LinearLayout actions;
public LinearLayout taskRow; public LinearLayout taskRow;
public boolean expanded;
public View[] decorations; public View[] decorations;
} }
@ -286,10 +289,17 @@ public class TaskAdapter extends CursorAdapter {
importanceView.setBackgroundColor(IMPORTANCE_COLORS[value]); importanceView.setBackgroundColor(IMPORTANCE_COLORS[value]);
} }
// details and decorations // details and decorations, expanded
if(!isFling) { if(!isFling) {
detailManager.request(viewHolder); detailManager.request(viewHolder);
decorationManager.request(viewHolder); decorationManager.request(viewHolder);
if(expanded == task.getId()) {
extendedDetailManager.request(viewHolder);
taskActionManager.request(viewHolder);
} else {
viewHolder.extendedDetails.setVisibility(View.GONE);
viewHolder.actions.setVisibility(View.GONE);
}
} }
} }
@ -365,7 +375,7 @@ public class TaskAdapter extends CursorAdapter {
continue; continue;
activity.runOnUiThread(new Runnable() { activity.runOnUiThread(new Runnable() {
public void run() { public void run() {
draw(viewHolder, cacheList); draw(viewHolder, taskId, cacheList);
} }
}); });
} }
@ -379,17 +389,15 @@ public class TaskAdapter extends CursorAdapter {
@SuppressWarnings("nls") @SuppressWarnings("nls")
@Override @Override
void draw(ViewHolder viewHolder, Collection<String> details) { void draw(ViewHolder viewHolder, long taskId, Collection<String> details) {
if(details == null) if(details == null || viewHolder.task.getId() != taskId)
return; return;
TextView view = extended ? viewHolder.extendedDetails : viewHolder.details; TextView view = extended ? viewHolder.extendedDetails : viewHolder.details;
view.setVisibility(!details.isEmpty() ? View.VISIBLE : View.GONE); if(details.isEmpty() || (extended && expanded != taskId)) {
if(details.isEmpty() || (extended && !viewHolder.expanded)) {
view.setVisibility(View.GONE); view.setVisibility(View.GONE);
return; return;
} else {
view.setVisibility(View.VISIBLE);
} }
view.setVisibility(View.VISIBLE);
StringBuilder detailText = new StringBuilder(); StringBuilder detailText = new StringBuilder();
for(Iterator<String> iterator = details.iterator(); iterator.hasNext(); ) { for(Iterator<String> iterator = details.iterator(); iterator.hasNext(); ) {
detailText.append(iterator.next()); detailText.append(iterator.next());
@ -420,16 +428,17 @@ public class TaskAdapter extends CursorAdapter {
} }
@Override @Override
void draw(ViewHolder viewHolder, Collection<TaskDecoration> decorations) { void draw(ViewHolder viewHolder, long taskId, Collection<TaskDecoration> decorations) {
if(decorations == null || decorations.size() == 0) if(decorations == null || viewHolder.task.getId() != taskId)
return; return;
if(viewHolder.decorations != null) { if(viewHolder.decorations != null) {
for(View view : viewHolder.decorations) for(View view : viewHolder.decorations)
viewHolder.taskRow.removeView(view); viewHolder.taskRow.removeView(view);
((View)viewHolder.taskRow.getParent()).setBackgroundColor(Color.TRANSPARENT);
} }
viewHolder.view.setBackgroundColor(Color.TRANSPARENT);
if(decorations.size() == 0)
return;
int i = 0; int i = 0;
boolean colorSet = false; boolean colorSet = false;
@ -437,7 +446,7 @@ public class TaskAdapter extends CursorAdapter {
for(TaskDecoration decoration : decorations) { for(TaskDecoration decoration : decorations) {
if(decoration.color != 0 && !colorSet) { if(decoration.color != 0 && !colorSet) {
colorSet = true; colorSet = true;
((View)viewHolder.taskRow.getParent()).setBackgroundColor(decoration.color); viewHolder.view.setBackgroundColor(decoration.color);
} }
if(decoration.decoration != null) { if(decoration.decoration != null) {
View view = decoration.decoration.apply(activity, viewHolder.taskRow); View view = decoration.decoration.apply(activity, viewHolder.taskRow);
@ -470,11 +479,11 @@ public class TaskAdapter extends CursorAdapter {
} }
@Override @Override
void draw(final ViewHolder viewHolder, Collection<TaskAction> actions) { void draw(final ViewHolder viewHolder, final long taskId, Collection<TaskAction> actions) {
if(actions == null) if(actions == null || viewHolder.task.getId() != taskId)
return; return;
if(!viewHolder.expanded) { if(expanded != taskId) {
viewHolder.actions.setVisibility(View.GONE); viewHolder.actions.setVisibility(View.GONE);
return; return;
} }
@ -491,7 +500,6 @@ public class TaskAdapter extends CursorAdapter {
@Override @Override
public void onClick(View arg0) { public void onClick(View arg0) {
Intent intent = new Intent(activity, TaskEditActivity.class); Intent intent = new Intent(activity, TaskEditActivity.class);
long taskId = viewHolder.task.getId();
intent.putExtra(TaskEditActivity.ID_TOKEN, taskId); intent.putExtra(TaskEditActivity.ID_TOKEN, taskId);
activity.startActivity(intent); activity.startActivity(intent);
} }
@ -542,13 +550,9 @@ public class TaskAdapter extends CursorAdapter {
public void onClick(View v) { public void onClick(View v) {
try { try {
action.intent.send(); action.intent.send();
// refresh ourselves
getCursor().requery();
notifyDataSetChanged();
} catch (Exception e) { } catch (Exception e) {
// oh too bad. exceptionService.displayAndReportError(activity,
Log.i("astrid-action-error", "Error launching intent", e); //$NON-NLS-1$ //$NON-NLS-2$ "Error launching action", e); //$NON-NLS-1$
} }
} }
}; };
@ -565,15 +569,13 @@ public class TaskAdapter extends CursorAdapter {
public void onClick(View v) { public void onClick(View v) {
// expand view // expand view
final ViewHolder viewHolder = (ViewHolder)v.getTag(); final ViewHolder viewHolder = (ViewHolder)v.getTag();
viewHolder.expanded = !viewHolder.expanded; long taskId = viewHolder.task.getId();
if(expanded == taskId) {
if(viewHolder.expanded) { expanded = -1;
extendedDetailManager.request(viewHolder);
taskActionManager.request(viewHolder);
} else { } else {
viewHolder.extendedDetails.setVisibility(View.GONE); expanded = taskId;
viewHolder.actions.setVisibility(View.GONE);
} }
notifyDataSetInvalidated();
} }
} }
@ -640,8 +642,7 @@ public class TaskAdapter extends CursorAdapter {
abstract private class AddOnManager<TYPE> { abstract private class AddOnManager<TYPE> {
private final Map<Long, HashMap<String, TYPE>> cache = private final Map<Long, HashMap<String, TYPE>> cache =
Collections.synchronizedMap(new SoftHashMap<Long, new SoftHashMap<Long, HashMap<String, TYPE>>();
HashMap<String, TYPE>>());
// --- interface // --- interface
@ -654,14 +655,14 @@ public class TaskAdapter extends CursorAdapter {
Collection<TYPE> list = initialize(taskId); Collection<TYPE> list = initialize(taskId);
if(list != null) { if(list != null) {
draw(viewHolder, list); draw(viewHolder, taskId, list);
return false; return false;
} }
// request details // request details
draw(viewHolder, taskId, get(taskId));
Intent broadcastIntent = createBroadcastIntent(taskId); Intent broadcastIntent = createBroadcastIntent(taskId);
activity.sendOrderedBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ); activity.sendOrderedBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
draw(viewHolder, get(taskId));
return true; return true;
} }
@ -669,7 +670,7 @@ public class TaskAdapter extends CursorAdapter {
abstract Intent createBroadcastIntent(long taskId); abstract Intent createBroadcastIntent(long taskId);
/** updates the given view */ /** updates the given view */
abstract void draw(ViewHolder viewHolder, Collection<TYPE> list); abstract void draw(ViewHolder viewHolder, long taskId, Collection<TYPE> list);
/** on receive an intent */ /** on receive an intent */
public void addNew(long taskId, String addOn, TYPE item) { public void addNew(long taskId, String addOn, TYPE item) {
@ -685,7 +686,7 @@ public class TaskAdapter extends CursorAdapter {
ViewHolder viewHolder = (ViewHolder) listView.getChildAt(i).getTag(); ViewHolder viewHolder = (ViewHolder) listView.getChildAt(i).getTag();
if(viewHolder == null || viewHolder.task.getId() != taskId) if(viewHolder == null || viewHolder.task.getId() != taskId)
continue; continue;
draw(viewHolder, cacheList); draw(viewHolder, taskId, cacheList);
break; break;
} }
} }
@ -706,7 +707,7 @@ public class TaskAdapter extends CursorAdapter {
* @param taskId * @param taskId
* @return list if there was already one * @return list if there was already one
*/ */
protected Collection<TYPE> initialize(long taskId) { protected synchronized Collection<TYPE> initialize(long taskId) {
if(cache.containsKey(taskId)) if(cache.containsKey(taskId))
return get(taskId); return get(taskId);
cache.put(taskId, new HashMap<String, TYPE>()); cache.put(taskId, new HashMap<String, TYPE>());
@ -719,7 +720,7 @@ public class TaskAdapter extends CursorAdapter {
* @param item * @param item
* @return iterator if item was added, null if it already existed * @return iterator if item was added, null if it already existed
*/ */
protected Collection<TYPE> addIfNotExists(long taskId, String addOn, protected synchronized Collection<TYPE> addIfNotExists(long taskId, String addOn,
TYPE item) { TYPE item) {
HashMap<String, TYPE> list = cache.get(taskId); HashMap<String, TYPE> list = cache.get(taskId);
if(list == null) if(list == null)

Loading…
Cancel
Save