diff --git a/astrid/.project b/astrid/.project index fa28c40a2..e141deba9 100644 --- a/astrid/.project +++ b/astrid/.project @@ -47,5 +47,10 @@ 2 _android_astridApi_98e6a2cf/src + + astridApi_src + 2 + _android_astridApi_98e6a2cf/src + diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml index bd4f0785b..a6481cc55 100644 --- a/astrid/AndroidManifest.xml +++ b/astrid/AndroidManifest.xml @@ -56,8 +56,7 @@ android:minSdkVersion="3" /> - - + diff --git a/astrid/plugin-src/com/todoroo/astrid/timers/TimerActionExposer.java b/astrid/plugin-src/com/todoroo/astrid/timers/TimerActionExposer.java index 08517a80a..bb1d2bb22 100644 --- a/astrid/plugin-src/com/todoroo/astrid/timers/TimerActionExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/timers/TimerActionExposer.java @@ -7,6 +7,9 @@ import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; import com.timsu.astrid.R; import com.todoroo.andlib.service.ContextManager; @@ -45,8 +48,10 @@ public class TimerActionExposer extends BroadcastReceiver { label = context.getString(R.string.TAE_stopTimer); Intent newIntent = new Intent(TIMER_ACTION); newIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, taskId); + Drawable timer = context.getResources().getDrawable(R.drawable.tango_clock); + Bitmap icon = ((BitmapDrawable)timer).getBitmap(); TaskAction action = new TaskAction(label, - PendingIntent.getBroadcast(context, (int)taskId, newIntent, 0)); + PendingIntent.getBroadcast(context, (int)taskId, newIntent, 0), icon); // transmit Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_ACTIONS); diff --git a/astrid/res/values/styles.xml b/astrid/res/values/styles.xml index 08f4b734d..6e0df491d 100644 --- a/astrid/res/values/styles.xml +++ b/astrid/res/values/styles.xml @@ -12,7 +12,7 @@ bold - diff --git a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java index 0bca24d88..f18d89843 100644 --- a/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java +++ b/astrid/src/com/todoroo/astrid/adapter/TaskAdapter.java @@ -1,5 +1,10 @@ package com.todoroo.astrid.adapter; +import greendroid.widget.QuickAction; +import greendroid.widget.QuickActionBar; +import greendroid.widget.QuickActionWidget; +import greendroid.widget.QuickActionWidget.OnQuickActionClickListener; + import java.util.Collection; import java.util.Collections; import java.util.Date; @@ -15,26 +20,27 @@ import android.content.Intent; import android.content.res.Resources; import android.database.Cursor; import android.graphics.Paint; +import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.text.Html; -import android.text.Spanned; -import android.text.TextUtils; import android.text.Html.ImageGetter; import android.text.Html.TagHandler; +import android.text.Spanned; +import android.text.TextUtils; import android.text.util.Linkify; import android.view.ContextMenu; +import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; import android.view.View; -import android.view.ViewGroup; -import android.view.ContextMenu.ContextMenuInfo; import android.view.View.OnClickListener; import android.view.View.OnCreateContextMenuListener; +import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; -import android.widget.Button; import android.widget.CheckBox; import android.widget.CursorAdapter; import android.widget.Filterable; import android.widget.LinearLayout; +import android.widget.ListView; import android.widget.TextView; import com.timsu.astrid.R; @@ -114,6 +120,10 @@ public class TaskAdapter extends CursorAdapter implements Filterable { // the task that's expanded private long expanded = -1; + // actions for QuickActionBar/mel + private QuickActionWidget mBar; + //private View mBarAnchor; + // --- task detail and decoration soft caches public final ExtendedDetailManager extendedDetailManager; @@ -734,55 +744,100 @@ public class TaskAdapter extends CursorAdapter implements Filterable { return broadcastIntent; } - @Override - protected void draw(final ViewHolder viewHolder, final long taskId, Collection actions) { - if(actions == null || viewHolder.task.getId() != taskId) - return; + //quickactionbar + //private QuickActionWidget mBar; - // hack because we know we have > 1 button - if(actions.size() == 0) - return; + @Override + public synchronized void addNew(long taskId, String addOn, final TaskAction item) { + // TODO Auto-generated method stub + addIfNotExists(taskId, addOn, item); + if(mBar != null) { + ListView listView = activity.getListView(); + ViewHolder myHolder = null; + // update view if it is visible + int length = listView.getChildCount(); + for(int i = 0; i < length; i++) { + ViewHolder viewHolder = (ViewHolder) listView.getChildAt(i).getTag(); + if(viewHolder == null || viewHolder.task.getId() != taskId) + continue; + myHolder = viewHolder; + break; + } - for(int i = viewHolder.actions.getChildCount(); i < actions.size() + 1; i++) { - Button editButton = new Button(activity); - editButton.setLayoutParams(params); - viewHolder.actions.addView(editButton); - } - for(int i = actions.size() + 1; i < viewHolder.actions.getChildCount(); i++) { - viewHolder.actions.getChildAt(i).setVisibility(View.GONE); + if(myHolder != null) { + final ViewHolder viewHolder = myHolder; + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + Drawable drawable = new BitmapDrawable(activity.getResources(), item.icon); + mBar.addQuickAction(new QuickAction(drawable, item.text)); + mBar.setOnQuickActionClickListener(new QuickActionListener(item, viewHolder)); + mBar.show(viewHolder.view); + } + }); + } } + } - int i = 0; - Button button = (Button) viewHolder.actions.getChildAt(i++); - - button.setText(R.string.TAd_actionEditTask); - button.setVisibility(View.VISIBLE); - button.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View arg0) { - Intent intent = new Intent(activity, TaskEditActivity.class); - intent.putExtra(TaskEditActivity.TOKEN_ID, taskId); - activity.startActivityForResult(intent, TaskListActivity.ACTIVITY_EDIT_TASK); - } - }); + @Override + public Collection get(long taskId) { + return super.get(taskId); + } + + @Override + protected void draw(final ViewHolder viewHolder, final long taskId, Collection actions) { + // do not draw! + } + + /* + //preparing quickActionBar + private void prepareQuickActionBar(ViewHolder viewHolder, Collection actions){ + mBar = new QuickActionBar(viewHolder.view.getContext()); + QuickAction editAction = new QuickAction(viewHolder.view.getContext(), R.drawable.tango_edit, " Edit "); + mBar.addQuickAction(editAction); for(TaskAction action : actions) { - button = (Button) viewHolder.actions.getChildAt(i++); - button.setText(action.text); - button.setVisibility(View.VISIBLE); - button.setOnClickListener(new ActionClickListener(action, viewHolder)); + + mBar.addQuickAction(new QuickAction(viewHolder.view.getContext(), R.drawable.tango_clock, action.text)); + mBar.setOnQuickActionClickListener(new quickActionListener(action, viewHolder)); } - reset(viewHolder, taskId); } + */ + /* + protected synchronized void showQuickActionBar(ViewHolder viewHolder, long taskId, Collection actions) { + if(mBar != null){ + mBar.dismiss(); + } + if(expanded != taskId) { + //viewHolder.actions.setVisibility(View.GONE); + return; + } + //display quickactionbar + else { + prepareQuickActionBar(viewHolder, actions); + mBar.show(viewHolder.view); + + } + //viewHolder.actions.setVisibility(View.VISIBLE); + } + */ @Override protected void reset(ViewHolder viewHolder, long taskId) { if(expanded != taskId) { - viewHolder.actions.setVisibility(View.GONE); + mBar.dismiss(); + //viewHolder.actions.setVisibility(View.GONE); return; } - viewHolder.actions.setVisibility(View.VISIBLE); + //display quickactionbar + /* + else{ + prepareQuickActionBar(viewHolder); + mBar.show(viewHolder.view); + } + */ + //viewHolder.actions.setVisibility(View.VISIBLE); } } @@ -794,6 +849,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable { public void notifyDataSetChanged() { super.notifyDataSetChanged(); fontSize = Preferences.getIntegerFromString(R.string.p_fontSize, 20); + } protected final View.OnClickListener completeBoxListener = new View.OnClickListener() { @@ -808,6 +864,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable { } }; +/* private final class ActionClickListener implements View.OnClickListener { private final TaskAction action; private final ViewHolder viewHolder; @@ -830,9 +887,66 @@ public class TaskAdapter extends CursorAdapter implements Filterable { taskActionManager.request(viewHolder); } }; +*/ + + private final class QuickActionListener implements OnQuickActionClickListener { + private final TaskAction action; + private final ViewHolder viewHolder; + + public QuickActionListener(TaskAction action, ViewHolder viewHolder) { + this.action = action; + this.viewHolder = viewHolder; + } + + public void onQuickActionClicked(QuickActionWidget widget, int position){ + mBar.dismiss(); + mBar = null; + + if(position == 0){ + + Intent intent = new Intent(activity, TaskEditActivity.class); + intent.putExtra(TaskEditActivity.TOKEN_ID, viewHolder.task.getId()); + activity.startActivityForResult(intent, TaskListActivity.ACTIVITY_EDIT_TASK); + } + else{ + flushSpecific(viewHolder.task.getId()); + try { + action.intent.send(); + } catch (Exception e) { + exceptionService.displayAndReportError(activity, + "Error launching action", e); //$NON-NLS-1$ + } + decorationManager.request(viewHolder); + extendedDetailManager.request(viewHolder); + taskActionManager.request(viewHolder); + } + clearSelection(); + notifyDataSetChanged(); + + } + } private class TaskRowListener implements OnCreateContextMenuListener, OnClickListener { + //prep quick action bar + private void prepareQuickActionBar(ViewHolder viewHolder, Collection collection){ + + mBar = new QuickActionBar(viewHolder.view.getContext()); + QuickAction editAction = new QuickAction(activity, R.drawable.tango_edit, " Edit "); + mBar.addQuickAction(editAction); + + + if(collection != null) { + for(TaskAction item : collection) { + Drawable drawable = new BitmapDrawable(activity.getResources(), item.icon); + mBar.addQuickAction(new QuickAction(drawable, item.text)); + mBar.setOnQuickActionClickListener(new QuickActionListener(item, viewHolder)); + } + } + + + } + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { // this is all a big sham. it's actually handled in Task List @@ -847,11 +961,16 @@ public class TaskAdapter extends CursorAdapter implements Filterable { return; long taskId = viewHolder.task.getId(); - if(expanded == taskId) { - expanded = -1; - } else { - expanded = taskId; - } + + Collection actions = taskActionManager.get(taskId); + prepareQuickActionBar(viewHolder, actions); + //mBarAnchor = v; + System.err.println("view is ID " + v.getId()); + if(actions != null) + mBar.show(v); + System.err.println("! Request for " + taskId); + taskActionManager.request(viewHolder); + notifyDataSetChanged(); } diff --git a/astrid/src/com/todoroo/astrid/helper/TaskAdapterAddOnManager.java b/astrid/src/com/todoroo/astrid/helper/TaskAdapterAddOnManager.java index 178aee80a..16b688cd5 100644 --- a/astrid/src/com/todoroo/astrid/helper/TaskAdapterAddOnManager.java +++ b/astrid/src/com/todoroo/astrid/helper/TaskAdapterAddOnManager.java @@ -134,6 +134,8 @@ abstract public class TaskAdapterAddOnManager { * @return */ protected Collection get(long taskId) { + if(cache.get(taskId) == null) + return null; return cache.get(taskId).values(); }