diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml
index e5f971e0e..d561cefea 100644
--- a/astrid/AndroidManifest.xml
+++ b/astrid/AndroidManifest.xml
@@ -375,7 +375,21 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/astrid/astrid.launch b/astrid/astrid.launch
index 3083390d0..5266e7ffb 100644
--- a/astrid/astrid.launch
+++ b/astrid/astrid.launch
@@ -16,11 +16,9 @@
-
-
diff --git a/astrid/plugin-src/com/todoroo/astrid/core/PluginServices.java b/astrid/plugin-src/com/todoroo/astrid/core/PluginServices.java
index b120128e6..790f7ffed 100644
--- a/astrid/plugin-src/com/todoroo/astrid/core/PluginServices.java
+++ b/astrid/plugin-src/com/todoroo/astrid/core/PluginServices.java
@@ -1,10 +1,14 @@
package com.todoroo.astrid.core;
+import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.ExceptionService;
+import com.todoroo.andlib.sql.Query;
import com.todoroo.astrid.dao.Database;
+import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.StoreObjectDao;
+import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.service.AddOnService;
import com.todoroo.astrid.service.AstridDependencyInjector;
import com.todoroo.astrid.service.MetadataService;
@@ -73,4 +77,23 @@ public final class PluginServices {
public static StoreObjectDao getStoreObjectDao() {
return getInstance().storeObjectDao;
}
+
+ // -- helpers
+
+ /**
+ * Find the corresponding metadata for this task
+ */
+ public static Metadata getMetadataByTaskAndWithKey(long taskId, String metadataKey) {
+ TodorooCursor cursor = PluginServices.getMetadataService().query(Query.select(
+ Metadata.PROPERTIES).where(MetadataCriteria.byTaskAndwithKey(taskId, metadataKey)));
+ try {
+ if(cursor.getCount() > 0)
+ return new Metadata(cursor);
+ else
+ return null;
+ } finally {
+ cursor.close();
+ }
+
+ }
}
diff --git a/astrid/plugin-src/com/todoroo/astrid/sharing/SharingActionExposer.java b/astrid/plugin-src/com/todoroo/astrid/sharing/SharingActionExposer.java
new file mode 100644
index 000000000..982d77167
--- /dev/null
+++ b/astrid/plugin-src/com/todoroo/astrid/sharing/SharingActionExposer.java
@@ -0,0 +1,68 @@
+/**
+ * See the file "LICENSE" for the full license governing this code.
+ */
+package com.todoroo.astrid.sharing;
+
+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 android.text.TextUtils;
+
+import com.timsu.astrid.R;
+import com.todoroo.andlib.service.ContextManager;
+import com.todoroo.astrid.api.AstridApiConstants;
+import com.todoroo.astrid.api.TaskAction;
+import com.todoroo.astrid.api.TaskDecoration;
+import com.todoroo.astrid.core.PluginServices;
+import com.todoroo.astrid.data.Task;
+
+/**
+ * Exposes {@link TaskDecoration} for timers
+ *
+ * @author Tim Su
+ *
+ */
+public class SharingActionExposer extends BroadcastReceiver {
+
+ static final String EXTRA_TASK = "task"; //$NON-NLS-1$
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ ContextManager.setContext(context);
+ long taskId = intent.getLongExtra(AstridApiConstants.EXTRAS_TASK_ID, -1);
+ if(taskId == -1)
+ return;
+
+ Task task = PluginServices.getTaskService().fetchById(taskId, Task.ID, Task.TITLE, Task.NOTES);
+ if(!task.containsNonNullValue(Task.NOTES) || TextUtils.isEmpty(task.getValue(Task.NOTES)))
+ return;
+
+ if(AstridApiConstants.BROADCAST_REQUEST_ACTIONS.equals(intent.getAction())) {
+ sendAction(context, taskId);
+ } else {
+ //
+ }
+ }
+
+ private void sendAction(Context context, long taskId) {
+ final String label = context.getString(R.string.sharing_action);
+ final Drawable drawable = context.getResources().getDrawable(R.drawable.tango_share);
+
+ Bitmap icon = ((BitmapDrawable)drawable).getBitmap();
+ Intent newIntent = new Intent(context, getClass());
+ newIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, taskId);
+ TaskAction action = new TaskAction(label,
+ PendingIntent.getBroadcast(context, (int)taskId, newIntent, 0), icon);
+
+ // transmit
+ Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_ACTIONS);
+ broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, action);
+ broadcastIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, taskId);
+ context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
+ }
+
+}
diff --git a/astrid/plugin-src/com/todoroo/astrid/sharing/SharingDetailExposer.java b/astrid/plugin-src/com/todoroo/astrid/sharing/SharingDetailExposer.java
new file mode 100644
index 000000000..be4f6fb7c
--- /dev/null
+++ b/astrid/plugin-src/com/todoroo/astrid/sharing/SharingDetailExposer.java
@@ -0,0 +1,53 @@
+/**
+ * See the file "LICENSE" for the full license governing this code.
+ */
+package com.todoroo.astrid.sharing;
+
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+import com.todoroo.astrid.api.AstridApiConstants;
+import com.todoroo.astrid.core.PluginServices;
+import com.todoroo.astrid.data.Metadata;
+
+/**
+ * Exposes Task Detail for notes
+ *
+ * @author Tim Su
+ *
+ */
+public class SharingDetailExposer extends BroadcastReceiver {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ long taskId = intent.getLongExtra(AstridApiConstants.EXTRAS_TASK_ID, -1);
+ if(taskId == -1)
+ return;
+
+ boolean extended = intent.getBooleanExtra(AstridApiConstants.EXTRAS_EXTENDED, false);
+ String taskDetail = getTaskDetails(taskId, extended);
+ if(taskDetail == null)
+ return;
+
+ // transmit
+ Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_SEND_DETAILS);
+ broadcastIntent.putExtra(AstridApiConstants.EXTRAS_RESPONSE, taskDetail);
+ broadcastIntent.putExtra(AstridApiConstants.EXTRAS_EXTENDED, extended);
+ broadcastIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, taskId);
+ context.sendBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
+ }
+
+ public String getTaskDetails(long id, boolean extended) {
+ Metadata metadata = PluginServices.getMetadataByTaskAndWithKey(id, SharingFields.METADATA_KEY);
+ if(metadata == null || extended)
+ return null;
+
+ if(metadata.getValue(SharingFields.PRIVACY) == SharingFields.PRIVACY_PUBLIC)
+ return "
Public"; //$NON-NLS-1$
+
+ return null;
+ }
+
+}
diff --git a/astrid/plugin-src/com/todoroo/astrid/sharing/SharingFields.java b/astrid/plugin-src/com/todoroo/astrid/sharing/SharingFields.java
new file mode 100644
index 000000000..4b7d0972d
--- /dev/null
+++ b/astrid/plugin-src/com/todoroo/astrid/sharing/SharingFields.java
@@ -0,0 +1,39 @@
+package com.todoroo.astrid.sharing;
+
+import com.todoroo.andlib.data.Property.IntegerProperty;
+import com.todoroo.andlib.data.Property.StringProperty;
+import com.todoroo.astrid.data.Metadata;
+
+/**
+ * Metadata entry for a task alarm
+ *
+ * @author Tim Su
+ *
+ */
+public class SharingFields {
+
+ /** metadata key */
+ public static final String METADATA_KEY = "sharing"; //$NON-NLS-1$
+
+ /** online url */
+ public static final StringProperty URL = Metadata.VALUE1;
+
+ /** sharing privacy */
+ public static final IntegerProperty PRIVACY = new IntegerProperty(Metadata.TABLE,
+ Metadata.VALUE2.name);
+
+ // --- constants
+
+ /** this task is shared publicly */
+ public static final int PRIVACY_PUBLIC = 2;
+
+ /** this task is shared with a limited group */
+ public static final int PRIVACY_LIMITED = 2;
+
+ /** this task is private */
+ public static final int PRIVACY_PRIVATE = 1;
+
+ /** this alarm repeats itself until turned off */
+ public static final int TYPE_REPEATING = 2;
+
+}
diff --git a/astrid/res/drawable/silk_world.png b/astrid/res/drawable/silk_world.png
new file mode 100644
index 000000000..68f21d301
Binary files /dev/null and b/astrid/res/drawable/silk_world.png differ
diff --git a/astrid/res/drawable/tango_share.png b/astrid/res/drawable/tango_share.png
new file mode 100644
index 000000000..c55434e97
Binary files /dev/null and b/astrid/res/drawable/tango_share.png differ
diff --git a/astrid/res/values/strings-sharing.xml b/astrid/res/values/strings-sharing.xml
new file mode 100644
index 000000000..690c48725
--- /dev/null
+++ b/astrid/res/values/strings-sharing.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+ Share
+
+
+