/**
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.activity;
import java.util.Map.Entry;
import java.util.Set;
import android.app.Activity;
import android.content.ComponentName;
import android.content.ContentValues;
import android.content.Intent;
import android.os.Bundle;
import com.timsu.astrid.R;
import com.todoroo.andlib.service.ContextManager;
import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterWithCustomIntent;
import com.todoroo.astrid.api.FilterWithUpdate;
import com.todoroo.astrid.data.Task;
/**
* This activity is launched when a user opens up a notification from the
* tray. It launches the appropriate activity based on the passed in parameters.
*
* @author timsu
*
*/
public class ShortcutActivity extends Activity {
// --- constants
/** token for passing a task id through extras for viewing a single task */
public static final String TOKEN_SINGLE_TASK = "id"; //$NON-NLS-1$
/** token for passing a {@link Filter}'s title through extras */
public static final String TOKEN_FILTER_TITLE = "title"; //$NON-NLS-1$
/** token for passing a {@link Filter}'s sql through extras */
public static final String TOKEN_FILTER_SQL = "sql"; //$NON-NLS-1$
/** token for passing a {@link Filter}'s values for new tasks through extras as string */
@Deprecated
public static final String TOKEN_FILTER_VALUES = "v4nt"; //$NON-NLS-1$
/** token for passing a {@link Filter}'s values for new tasks through extras as exploded ContentValues */
public static final String TOKEN_FILTER_VALUES_ITEM = "v4ntp_"; //$NON-NLS-1$
/** token for passing a ComponentNameto launch */
public static final String TOKEN_CUSTOM_CLASS = "class"; //$NON-NLS-1$
/** token for passing a image url*/
public static final String TOKEN_IMAGE_URL = "imageUrl"; //$NON-NLS-1$
/** List of the above constants for searching */
private static final String[] CUSTOM_EXTRAS = {
TOKEN_SINGLE_TASK,
TOKEN_FILTER_TITLE,
TOKEN_FILTER_SQL,
TOKEN_FILTER_VALUES,
TOKEN_FILTER_VALUES_ITEM,
TOKEN_CUSTOM_CLASS,
TOKEN_IMAGE_URL
};
// --- implementation
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ContextManager.setContext(this);
launchTaskList(getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
launchTaskList(intent);
}
private void launchTaskList(Intent intent) {
Bundle extras = intent.getExtras();
Intent taskListIntent = new Intent(this, TaskListActivity.class);
if(extras != null && extras.containsKey(TaskListActivity.TOKEN_SOURCE))
taskListIntent.putExtra(TaskListActivity.TOKEN_SOURCE, extras.getInt(TaskListActivity.TOKEN_SOURCE));
if(extras != null && extras.containsKey(TOKEN_CUSTOM_CLASS)) {
taskListIntent.putExtras(intent.getExtras());
}
if(extras != null && extras.containsKey(TOKEN_FILTER_SQL)) {
// launched from desktop shortcut, must create a fake filter
String title = extras.getString(TOKEN_FILTER_TITLE);
String sql = extras.getString(TOKEN_FILTER_SQL);
ContentValues values = null;
if(extras.containsKey(TOKEN_FILTER_VALUES))
values = AndroidUtilities.contentValuesFromString(extras.getString(TOKEN_FILTER_VALUES));
else {
values = new ContentValues();
for(String key : extras.keySet()) {
if(!key.startsWith(TOKEN_FILTER_VALUES_ITEM))
continue;
Object value = extras.get(key);
key = key.substring(TOKEN_FILTER_VALUES_ITEM.length());
// assume one of the big 4...
if(value instanceof String)
values.put(key, (String) value);
else if(value instanceof Integer)
values.put(key, (Integer) value);
else if(value instanceof Double)
values.put(key, (Double) value);
else if(value instanceof Long)
values.put(key, (Long) value);
else
throw new IllegalStateException("Unsupported bundle type " + value.getClass()); //$NON-NLS-1$
}
}
Filter filter;
if (extras.containsKey(TOKEN_CUSTOM_CLASS)) {
if (extras.containsKey(TOKEN_IMAGE_URL)) {
filter = new FilterWithUpdate(title, title, sql, values);
((FilterWithUpdate) filter).imageUrl = extras.getString(TOKEN_IMAGE_URL);
}
else
filter = new FilterWithCustomIntent(title, title, sql, values);
Bundle customExtras = new Bundle();
Set<String> keys = extras.keySet();
for (String key : keys) {
if (AndroidUtilities.indexOf(CUSTOM_EXTRAS, key) < 0)
AndroidUtilities.putInto(customExtras, key, extras.get(key), false);
}
((FilterWithCustomIntent) filter).customExtras = customExtras; // Something
ComponentName customTaskList = ComponentName.unflattenFromString(extras.getString(TOKEN_CUSTOM_CLASS));
((FilterWithCustomIntent) filter).customTaskList = customTaskList;
} else {
filter = new Filter(title, title, sql, values);
}
taskListIntent.putExtra(TaskListFragment.TOKEN_FILTER, filter);
} else if(extras != null && extras.containsKey(TOKEN_SINGLE_TASK)) {
Filter filter = new Filter(getString(R.string.TLA_custom), getString(R.string.TLA_custom),
new QueryTemplate().where(Task.ID.eq(extras.getLong(TOKEN_SINGLE_TASK, -1))), null);
taskListIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
taskListIntent.putExtra(TaskListFragment.TOKEN_FILTER, filter);
startActivity(taskListIntent);
}
startActivity(taskListIntent);
finish();
}
public static Intent createIntent(Filter filter) {
Intent shortcutIntent = new Intent(ContextManager.getContext(),
ShortcutActivity.class);
if(filter instanceof FilterWithCustomIntent) {
FilterWithCustomIntent customFilter = ((FilterWithCustomIntent)filter);
if(customFilter.customExtras != null)
shortcutIntent.putExtras(customFilter.customExtras);
shortcutIntent.putExtra(TOKEN_CUSTOM_CLASS, customFilter.customTaskList.flattenToString());
if (filter instanceof FilterWithUpdate) {
FilterWithUpdate filterWithUpdate = (FilterWithUpdate) filter;
if (filterWithUpdate.imageUrl != null)
shortcutIntent.putExtra(TOKEN_IMAGE_URL, filterWithUpdate.imageUrl);
}
}
shortcutIntent.setAction(Intent.ACTION_VIEW);
shortcutIntent.putExtra(ShortcutActivity.TOKEN_FILTER_TITLE,
filter.title);
shortcutIntent.putExtra(ShortcutActivity.TOKEN_FILTER_SQL,
filter.getSqlQuery());
if (filter.valuesForNewTasks != null) {
for (Entry<String, Object> item : filter.valuesForNewTasks.valueSet()) {
String key = TOKEN_FILTER_VALUES_ITEM + item.getKey();
Object value = item.getValue();
putExtra(shortcutIntent, key, value);
}
}
return shortcutIntent;
}
private static void putExtra(Intent intent, String key, Object value) {
// assume one of the big 4...
if (value instanceof String)
intent.putExtra(key, (String) value);
else if (value instanceof Integer)
intent.putExtra(key, (Integer) value);
else if (value instanceof Double)
intent.putExtra(key, (Double) value);
else if (value instanceof Long)
intent.putExtra(key, (Long) value);
else
throw new IllegalStateException(
"Unsupported bundle type " + value.getClass()); //$NON-NLS-1$
}
}