diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml
index 5be80b939..a54e0e0c1 100644
--- a/astrid/AndroidManifest.xml
+++ b/astrid/AndroidManifest.xml
@@ -127,6 +127,11 @@
+
+
+
+
+
@@ -149,6 +154,16 @@
android:resource="@xml/power_widget_44_provider_info" />
+
+
+
+
+
+
+
@@ -159,6 +174,7 @@
+
diff --git a/astrid/res/layout-land/widget_power_42.xml b/astrid/res/layout-land/widget_power_42.xml
index 1168b0cab..85eae4cdd 100644
--- a/astrid/res/layout-land/widget_power_42.xml
+++ b/astrid/res/layout-land/widget_power_42.xml
@@ -45,15 +45,28 @@
android:layout_height="36dp"
android:paddingTop="0dp"
android:paddingBottom="0dp"
- android:paddingLeft="7dp"
- android:paddingRight="0dp"
android:orientation="horizontal"
android:layout_alignParentTop="true">
+
+
+
+
-
-
-
+
+
+
+
@@ -83,20 +97,176 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/header"
+ android:layout_alignParentBottom="true">
+
+
-
-
-
+ android:layout_toLeftOf="@+id/footer"
+ android:paddingTop="4dip"
+ android:paddingBottom="3dip"
+ android:gravity="fill_vertical">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
-
-
-
-
-
+
-
-
-
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
+ android:paddingRight="20dp"
+ android:paddingLeft="12dp"
+ android:background="@drawable/speech_bubble"
+ android:gravity="fill_horizontal" >
+
+
+
+
+
+
\ No newline at end of file
diff --git a/astrid/res/layout/widget_power_42.xml b/astrid/res/layout/widget_power_42.xml
index 74d2a663e..571193b53 100644
--- a/astrid/res/layout/widget_power_42.xml
+++ b/astrid/res/layout/widget_power_42.xml
@@ -45,15 +45,21 @@
android:layout_height="36dp"
android:paddingTop="0dp"
android:paddingBottom="0dp"
- android:paddingLeft="7dp"
- android:paddingRight="0dp"
android:orientation="horizontal"
android:layout_alignParentTop="true">
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true">
+
+
+ android:orientation="horizontal"
+ android:gravity="center_horizontal">
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/astrid/res/layout/widget_power_44.xml b/astrid/res/layout/widget_power_44.xml
index 1f3e3a7fc..8943bd1df 100644
--- a/astrid/res/layout/widget_power_44.xml
+++ b/astrid/res/layout/widget_power_44.xml
@@ -400,7 +400,6 @@
android:id="@+id/footer"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
- android:layout_above="@id/encouragement"
android:layout_alignParentBottom="true">
diff --git a/astrid/res/xml/power_widget_42_provider_info.xml b/astrid/res/xml/power_widget_42_provider_info.xml
index 33202fa70..033e8cc6c 100644
--- a/astrid/res/xml/power_widget_42_provider_info.xml
+++ b/astrid/res/xml/power_widget_42_provider_info.xml
@@ -1,7 +1,7 @@
{
Astrid2TaskProvider.notifyDatabaseModification();
TasksWidget.updateWidgets(ContextManager.getContext());
PowerWidget.updateWidgets(ContextManager.getContext());
+ PowerWidget42.updateWidgets(ContextManager.getContext());
}
/**
diff --git a/astrid/src/com/todoroo/astrid/widget/ConfigurePowerWidget42Activity.java b/astrid/src/com/todoroo/astrid/widget/ConfigurePowerWidget42Activity.java
new file mode 100644
index 000000000..b9a35333b
--- /dev/null
+++ b/astrid/src/com/todoroo/astrid/widget/ConfigurePowerWidget42Activity.java
@@ -0,0 +1,200 @@
+package com.todoroo.astrid.widget;
+
+import android.app.ExpandableListActivity;
+import android.appwidget.AppWidgetManager;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.DisplayMetrics;
+import android.view.View;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.ExpandableListView;
+import android.widget.Spinner;
+
+import com.flurry.android.FlurryAgent;
+import com.timsu.astrid.R;
+import com.todoroo.andlib.utility.AndroidUtilities;
+import com.todoroo.astrid.adapter.FilterAdapter;
+import com.todoroo.astrid.api.Filter;
+import com.todoroo.astrid.api.FilterCategory;
+import com.todoroo.astrid.api.FilterListItem;
+import com.todoroo.astrid.utility.Constants;
+import com.todoroo.astrid.utility.Preferences;
+
+/**
+ * Configure options for the Power Pack widget. Select a color, filter to use, enable/disable encouragements.
+ *
+ * @author jwong
+ *
+ */
+public class ConfigurePowerWidget42Activity extends ExpandableListActivity {
+
+
+ int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
+
+ FilterAdapter adapter = null;
+
+ String[] colors = new String[]{
+ "Black",
+ "Blue",
+ "Red",
+ "White"
+ };
+
+ public ConfigurePowerWidget42Activity() {
+ super();
+ }
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ // Set the result to CANCELED. This will cause the widget host to cancel
+ // out of the widget placement if they press the back button.
+ setResult(RESULT_CANCELED);
+
+ // Set the view layout resource to use.
+ setContentView(R.layout.power_widget_configure);
+
+ setTitle(R.string.PPW_configure_title);
+
+ // Find the widget id from the intent.
+ Intent intent = getIntent();
+ Bundle extras = intent.getExtras();
+ if (extras != null) {
+ mAppWidgetId = extras.getInt(
+ AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
+ }
+
+ // If they gave us an intent without the widget id, just bail.
+ if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
+ finish();
+ }
+
+ ArrayAdapter colorAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, colors);
+ colorAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+
+ Spinner colorSpinner = (Spinner) findViewById(R.id.PPW_color);
+ colorSpinner.setAdapter(colorAdapter);
+
+ // set up ui
+ adapter = new FilterAdapter(this, getExpandableListView(),
+ R.layout.filter_adapter_row, true);
+ setListAdapter(adapter);
+
+ Button button = (Button)findViewById(R.id.ok);
+ button.setOnClickListener(mOnClickListener);
+
+ FlurryAgent.onEvent("power-widget-config"); //$NON-NLS-1$
+ }
+
+ View.OnClickListener mOnClickListener = new View.OnClickListener() {
+ public void onClick(View v) {
+ final Context context = ConfigurePowerWidget42Activity.this;
+
+
+ Spinner colorSpinner = (Spinner) findViewById(R.id.PPW_color);
+ int colorPos = colorSpinner.getSelectedItemPosition();
+ String color = colors[colorPos];
+
+ // removed calendar option
+// CheckBox chk_enableCalendar = (CheckBox) findViewById(R.id.PPW_enable_calendar);
+// boolean enableCalendar = chk_enableCalendar.isChecked();
+ boolean enableCalendar = false;
+
+ CheckBox chk_disableEncouragements = (CheckBox) findViewById(R.id.PPW_disable_encouragements);
+ boolean disableEncouragements = chk_disableEncouragements.isChecked();
+
+ // Save configuration options
+ saveConfiguration(adapter.getSelection(), color, enableCalendar, !disableEncouragements);
+
+ // Push widget update to surface with newly set prefix
+ PowerWidget42.updateAppWidget(context, mAppWidgetId);
+
+ // Make sure we pass back the original appWidgetId
+ Intent resultValue = new Intent();
+ resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
+ setResult(RESULT_OK, resultValue);
+ finish();
+ }
+ };
+
+ @Override
+ public boolean onChildClick(ExpandableListView parent, View v,
+ int groupPosition, int childPosition, long id) {
+ FilterListItem item = (FilterListItem) adapter.getChild(groupPosition,
+ childPosition);
+ if(item instanceof Filter) {
+ adapter.setSelection(item);
+ }
+ return true;
+ }
+
+ @Override
+ public void onGroupExpand(int groupPosition) {
+ FilterListItem item = (FilterListItem) adapter.getGroup(groupPosition);
+ if(item instanceof Filter)
+ adapter.setSelection(item);
+ else if(item instanceof FilterCategory)
+ adapter.saveExpansionSetting((FilterCategory) item, true);
+ }
+
+ @Override
+ public void onGroupCollapse(int groupPosition) {
+ FilterListItem item = (FilterListItem) adapter.getGroup(groupPosition);
+ if(item instanceof Filter)
+ adapter.setSelection(item);
+ else if(item instanceof FilterCategory)
+ adapter.saveExpansionSetting((FilterCategory) item, false);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ adapter.registerRecevier();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ adapter.unregisterRecevier();
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ FlurryAgent.onStartSession(this, Constants.FLURRY_KEY);
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ FlurryAgent.onEndSession(this);
+ }
+
+ private void saveConfiguration(FilterListItem filterListItem, String color, boolean enableCalendar, boolean enableEncouragements){
+ DisplayMetrics metrics = new DisplayMetrics();
+ getWindowManager().getDefaultDisplay().getMetrics(metrics);
+
+ String sql = null, contentValuesString = null, title = null;
+
+ if(filterListItem != null && filterListItem instanceof Filter) {
+ sql = ((Filter)filterListItem).sqlQuery;
+ ContentValues values = ((Filter)filterListItem).valuesForNewTasks;
+ if(values != null)
+ contentValuesString = AndroidUtilities.contentValuesToSerializedString(values);
+ title = ((Filter)filterListItem).title;
+ }
+
+ Preferences.setString(PowerWidget.PREF_TITLE + mAppWidgetId, title);
+ Preferences.setString(PowerWidget.PREF_SQL + mAppWidgetId, sql);
+ Preferences.setString(PowerWidget.PREF_VALUES + mAppWidgetId, contentValuesString);
+
+ Preferences.setString(PowerWidget.PREF_COLOR + mAppWidgetId, color);
+ Preferences.setBoolean(PowerWidget.PREF_ENABLE_CALENDAR + mAppWidgetId, enableCalendar);
+ Preferences.setBoolean(PowerWidget.PREF_ENCOURAGEMENTS + mAppWidgetId, enableEncouragements);
+ }
+}
diff --git a/astrid/src/com/todoroo/astrid/widget/PowerWidget.java b/astrid/src/com/todoroo/astrid/widget/PowerWidget.java
index f7ecc39d6..c3e6969eb 100644
--- a/astrid/src/com/todoroo/astrid/widget/PowerWidget.java
+++ b/astrid/src/com/todoroo/astrid/widget/PowerWidget.java
@@ -47,8 +47,10 @@ import com.todoroo.astrid.utility.Preferences;
public class PowerWidget extends AppWidgetProvider {
static final String LOG_TAG = "PowerWidget";
+ static Class updateService;
static {
AstridDependencyInjector.initialize();
+ updateService = PowerWidget.UpdateService.class;
}
@@ -99,7 +101,7 @@ public class PowerWidget extends AppWidgetProvider {
R.id.checkbox7, R.id.checkbox8, R.id.checkbox9, R.id.checkbox10 };
// # of rows defined in the xml file
- private static final int ROW_LIMIT = 10;
+ static int ROW_LIMIT = 10;
public static int[] IMPORTANCE_DRAWABLES = new int[] {
R.drawable.importance_1, R.drawable.importance_2, R.drawable.importance_3,
@@ -117,7 +119,7 @@ public class PowerWidget extends AppWidgetProvider {
super.onUpdate(context, appWidgetManager, appWidgetIds);
// Start in service to prevent Application Not Responding timeout
- Intent updateIntent = new Intent(context, UpdateService.class);
+ Intent updateIntent = new Intent(context, updateService);
updateIntent.putExtra(APP_WIDGET_IDS, appWidgetIds);
context.startService(updateIntent);
} catch (SecurityException e) {
@@ -156,7 +158,7 @@ public class PowerWidget extends AppWidgetProvider {
if (intent != null && (ACTION_SCROLL_UP.equals(intent.getAction()) ||
ACTION_SCROLL_DOWN.equals(intent.getAction()) ||
ACTION_MARK_COMPLETE.equals(intent.getAction()))) {
- Intent updateIntent = new Intent(context, UpdateService.class);
+ Intent updateIntent = new Intent(context, updateService);
updateIntent.setAction(intent.getAction());
updateIntent.putExtras(intent.getExtras());
context.startService(updateIntent);
@@ -173,7 +175,7 @@ public class PowerWidget extends AppWidgetProvider {
*/
public static void updateWidgets(Context context) {
context.startService(new Intent(ContextManager.getContext(),
- UpdateService.class));
+ updateService));
}
/**
@@ -181,12 +183,19 @@ public class PowerWidget extends AppWidgetProvider {
* @param id
*/
public static void updateAppWidget(Context context, int appWidgetId){
- Intent updateIntent = new Intent(context, UpdateService.class);
+ Intent updateIntent = new Intent(context, updateService);
updateIntent.putExtra(APP_WIDGET_IDS, new int[]{ appWidgetId });
context.startService(updateIntent);
}
public static class UpdateService extends Service {
+ static Class widgetClass;
+ static int widgetLayout;
+
+ static {
+ widgetClass = PowerWidget.class;
+ widgetLayout = R.layout.widget_power_44;
+ }
private static final int SCROLL_OFFSET_UNSET = -1;
@@ -223,7 +232,7 @@ public class PowerWidget extends AppWidgetProvider {
manager.updateAppWidget(appWidgetId, views);
} else {
if (appWidgetIds == null){
- appWidgetIds = manager.getAppWidgetIds(new ComponentName(this, PowerWidget.class));
+ appWidgetIds = manager.getAppWidgetIds(new ComponentName(this, widgetClass));
}
for (int id : appWidgetIds) {
RemoteViews views = buildUpdate(this, id, scrollOffset);
@@ -241,7 +250,7 @@ public class PowerWidget extends AppWidgetProvider {
DependencyInjectionService.getInstance().inject(this);
RemoteViews views = new RemoteViews(context.getPackageName(),
- R.layout.widget_power_44);
+ widgetLayout);
String color = Preferences.getStringValue(PowerWidget.PREF_COLOR + appWidgetId);
@@ -377,7 +386,7 @@ public class PowerWidget extends AppWidgetProvider {
IMPORTANCE_DRAWABLES[task.getValue(Task.IMPORTANCE)]);
// check box
- Intent markCompleteIntent = new Intent(context, PowerWidget.class);
+ Intent markCompleteIntent = new Intent(context, widgetClass);
markCompleteIntent.setAction(ACTION_MARK_COMPLETE);
markCompleteIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
markCompleteIntent.putExtra(COMPLETED_TASK_ID, taskId);
@@ -440,7 +449,7 @@ public class PowerWidget extends AppWidgetProvider {
}
// create intent to scroll up
- Intent scrollUpIntent = new Intent(context, PowerWidget.class);
+ Intent scrollUpIntent = new Intent(context, widgetClass);
scrollUpIntent.setAction(ACTION_SCROLL_UP);
scrollUpIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
scrollUpIntent.setType(AppWidgetManager.EXTRA_APPWIDGET_ID + appWidgetId);
@@ -458,7 +467,7 @@ public class PowerWidget extends AppWidgetProvider {
views.setOnClickPendingIntent(R.id.scroll_up_alt, pScrollUpIntent);
// create intent to scroll down
- Intent scrollDownIntent = new Intent(context, PowerWidget.class);
+ Intent scrollDownIntent = new Intent(context, widgetClass);
scrollDownIntent.setAction(ACTION_SCROLL_DOWN);
scrollDownIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
scrollDownIntent.setType(AppWidgetManager.EXTRA_APPWIDGET_ID + appWidgetId);
diff --git a/astrid/src/com/todoroo/astrid/widget/PowerWidget42.java b/astrid/src/com/todoroo/astrid/widget/PowerWidget42.java
new file mode 100644
index 000000000..9cdba9a0f
--- /dev/null
+++ b/astrid/src/com/todoroo/astrid/widget/PowerWidget42.java
@@ -0,0 +1,42 @@
+package com.todoroo.astrid.widget;
+
+import com.timsu.astrid.R;
+
+/**
+ * Power Pack widget. Supports 4x2 size. Configured via
+ * ConfigurePowerWidget42Activity when widget is added to homescreen.
+ *
+ * This class extends PowerWidget but sets references to itself for use in Intents.
+ *
+ * @author jwong (jwong@dayspring-tech.com)
+ *
+ */
+@SuppressWarnings("nls")
+public class PowerWidget42 extends PowerWidget {
+ static final String LOG_TAG = "PowerWidget42";
+
+
+ static {
+ // set reference to my UpdateService for calls to launch the service
+ updateService = PowerWidget42.UpdateService.class;
+
+ ROW_LIMIT = 5;
+ }
+
+ /**
+ * Extend PowerWidget's UpdateService so that the widget provider class
+ * can be specified. We can't just used PowerWidget's UpdateService
+ * since it's a static class and uses PowerWidget's variables, not this
+ * class' variables.
+ *
+ * @author jwong (jwong@dayspring-tech.com)
+ *
+ */
+ public static class UpdateService extends PowerWidget.UpdateService {
+ static {
+ widgetClass = PowerWidget42.class;
+ widgetLayout = R.layout.widget_power_42;
+ }
+ }
+
+}