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; + } + } + +}