summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/AppWidgetPickActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/settings/AppWidgetPickActivity.java')
-rw-r--r--src/com/android/settings/AppWidgetPickActivity.java249
1 files changed, 61 insertions, 188 deletions
diff --git a/src/com/android/settings/AppWidgetPickActivity.java b/src/com/android/settings/AppWidgetPickActivity.java
index 953d10c..2bd62c0 100644
--- a/src/com/android/settings/AppWidgetPickActivity.java
+++ b/src/com/android/settings/AppWidgetPickActivity.java
@@ -18,6 +18,7 @@ package com.android.settings;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProviderInfo;
+import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
@@ -25,15 +26,11 @@ import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
-import android.os.Parcelable;
-import android.os.SystemProperties;
import android.util.DisplayMetrics;
import android.util.Log;
-import java.text.Collator;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
+import com.android.settings.ActivityPicker.PickAdapter;
+
import java.util.List;
/**
@@ -46,12 +43,11 @@ import java.util.List;
* will bind it to the given {@link AppWidgetManager#EXTRA_APPWIDGET_ID},
* otherwise it will return the requested extras.
*/
-public class AppWidgetPickActivity extends ActivityPicker {
+public class AppWidgetPickActivity extends ActivityPicker
+ implements AppWidgetLoader.ItemConstructor<PickAdapter.Item>{
private static final String TAG = "AppWidgetPickActivity";
- private static final boolean LOGD = false;
+ static final boolean LOGD = false;
- private PackageManager mPackageManager;
- private AppWidgetManager mAppWidgetManager;
List<PickAdapter.Item> mItems;
/**
@@ -59,15 +55,16 @@ public class AppWidgetPickActivity extends ActivityPicker {
* activity is binding.
*/
private int mAppWidgetId;
-
- // Enable testing launcher widgets in keyguard. For testing purposes only.
- private final boolean mIgnoreFilter = false || SystemProperties.getBoolean(
- "ro.keyguard_ignore_filter", false);
+ private AppWidgetLoader<PickAdapter.Item> mAppWidgetLoader;
+ private AppWidgetManager mAppWidgetManager;
+ private PackageManager mPackageManager;
@Override
public void onCreate(Bundle icicle) {
mPackageManager = getPackageManager();
mAppWidgetManager = AppWidgetManager.getInstance(this);
+ mAppWidgetLoader = new AppWidgetLoader<PickAdapter.Item>
+ (this, mAppWidgetManager, this);
super.onCreate(icicle);
@@ -85,69 +82,69 @@ public class AppWidgetPickActivity extends ActivityPicker {
}
/**
- * Create list entries for any custom widgets requested through
- * {@link AppWidgetManager#EXTRA_CUSTOM_INFO}.
+ * Build and return list of items to be shown in dialog. This will mix both
+ * installed {@link AppWidgetProviderInfo} and those provided through
+ * {@link AppWidgetManager#EXTRA_CUSTOM_INFO}, sorting them alphabetically.
*/
- void putCustomAppWidgets(List<PickAdapter.Item> items) {
- final Bundle extras = getIntent().getExtras();
-
- // get and validate the extras they gave us
- ArrayList<AppWidgetProviderInfo> customInfo = null;
- ArrayList<Bundle> customExtras = null;
- try_custom_items: {
- customInfo = extras.getParcelableArrayList(AppWidgetManager.EXTRA_CUSTOM_INFO);
- if (customInfo == null || customInfo.size() == 0) {
- Log.i(TAG, "EXTRA_CUSTOM_INFO not present.");
- break try_custom_items;
- }
-
- int customInfoSize = customInfo.size();
- for (int i=0; i<customInfoSize; i++) {
- Parcelable p = customInfo.get(i);
- if (p == null || !(p instanceof AppWidgetProviderInfo)) {
- customInfo = null;
- Log.e(TAG, "error using EXTRA_CUSTOM_INFO index=" + i);
- break try_custom_items;
- }
- }
-
- customExtras = extras.getParcelableArrayList(AppWidgetManager.EXTRA_CUSTOM_EXTRAS);
- if (customExtras == null) {
- customInfo = null;
- Log.e(TAG, "EXTRA_CUSTOM_INFO without EXTRA_CUSTOM_EXTRAS");
- break try_custom_items;
- }
-
- int customExtrasSize = customExtras.size();
- if (customInfoSize != customExtrasSize) {
- Log.e(TAG, "list size mismatch: EXTRA_CUSTOM_INFO: " + customInfoSize
- + " EXTRA_CUSTOM_EXTRAS: " + customExtrasSize);
- break try_custom_items;
- }
+ @Override
+ protected List<PickAdapter.Item> getItems() {
+ mItems = mAppWidgetLoader.getItems(getIntent());
+ return mItems;
+ }
+ @Override
+ public PickAdapter.Item createItem(Context context, AppWidgetProviderInfo info, Bundle extras) {
+ CharSequence label = info.label;
+ Drawable icon = null;
- for (int i=0; i<customExtrasSize; i++) {
- Parcelable p = customExtras.get(i);
- if (p == null || !(p instanceof Bundle)) {
- customInfo = null;
- customExtras = null;
- Log.e(TAG, "error using EXTRA_CUSTOM_EXTRAS index=" + i);
- break try_custom_items;
+ if (info.icon != 0) {
+ try {
+ final Resources res = context.getResources();
+ final int density = res.getDisplayMetrics().densityDpi;
+ int iconDensity;
+ switch (density) {
+ case DisplayMetrics.DENSITY_MEDIUM:
+ iconDensity = DisplayMetrics.DENSITY_LOW;
+ case DisplayMetrics.DENSITY_TV:
+ iconDensity = DisplayMetrics.DENSITY_MEDIUM;
+ case DisplayMetrics.DENSITY_HIGH:
+ iconDensity = DisplayMetrics.DENSITY_MEDIUM;
+ case DisplayMetrics.DENSITY_XHIGH:
+ iconDensity = DisplayMetrics.DENSITY_HIGH;
+ case DisplayMetrics.DENSITY_XXHIGH:
+ iconDensity = DisplayMetrics.DENSITY_XHIGH;
+ default:
+ // The density is some abnormal value. Return some other
+ // abnormal value that is a reasonable scaling of it.
+ iconDensity = (int)((density*0.75f)+.5f);
}
+ Resources packageResources = mPackageManager.
+ getResourcesForApplication(info.provider.getPackageName());
+ icon = packageResources.getDrawableForDensity(info.icon, iconDensity);
+ } catch (NameNotFoundException e) {
+ Log.w(TAG, "Can't load icon drawable 0x" + Integer.toHexString(info.icon)
+ + " for provider: " + info.provider);
+ }
+ if (icon == null) {
+ Log.w(TAG, "Can't load icon drawable 0x" + Integer.toHexString(info.icon)
+ + " for provider: " + info.provider);
}
}
- if (LOGD) Log.d(TAG, "Using " + customInfo.size() + " custom items");
- putAppWidgetItems(customInfo, customExtras, items, 0, 0, true);
+ PickAdapter.Item item = new PickAdapter.Item(context, label, icon);
+ item.packageName = info.provider.getPackageName();
+ item.className = info.provider.getClassName();
+ item.extras = extras;
+ return item;
}
-
+
/**
* {@inheritDoc}
*/
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = getIntentForPosition(which);
- PickAdapter.Item item = (PickAdapter.Item) mItems.get(which);
+ PickAdapter.Item item = mItems.get(which);
int result;
if (item.extras != null) {
@@ -173,134 +170,10 @@ public class AppWidgetPickActivity extends ActivityPicker {
}
setResultData(result, null);
}
- finish();
- }
-
- /**
- * Create list entries for the given {@link AppWidgetProviderInfo} widgets,
- * inserting extras if provided.
- */
- void putAppWidgetItems(List<AppWidgetProviderInfo> appWidgets,
- List<Bundle> customExtras, List<PickAdapter.Item> items, int categoryFilter,
- int featuresFilter, boolean ignoreFilters) {
- if (appWidgets == null) return;
- final int size = appWidgets.size();
- for (int i = 0; i < size; i++) {
- AppWidgetProviderInfo info = appWidgets.get(i);
-
- // We remove any widgets whose category isn't included in the filter
- if (!ignoreFilters && (info.widgetCategory & categoryFilter) == 0) {
- continue;
- }
-
- // We remove any widgets who don't have all the features in the features filter
- if (!ignoreFilters && (info.widgetFeatures & featuresFilter) != featuresFilter) {
- continue;
- }
-
- CharSequence label = info.label;
- Drawable icon = null;
-
- if (info.icon != 0) {
- try {
- final Resources res = getResources();
- final int density = res.getDisplayMetrics().densityDpi;
- int iconDensity;
- switch (density) {
- case DisplayMetrics.DENSITY_MEDIUM:
- iconDensity = DisplayMetrics.DENSITY_LOW;
- case DisplayMetrics.DENSITY_TV:
- iconDensity = DisplayMetrics.DENSITY_MEDIUM;
- case DisplayMetrics.DENSITY_HIGH:
- iconDensity = DisplayMetrics.DENSITY_MEDIUM;
- case DisplayMetrics.DENSITY_XHIGH:
- iconDensity = DisplayMetrics.DENSITY_HIGH;
- case DisplayMetrics.DENSITY_XXHIGH:
- iconDensity = DisplayMetrics.DENSITY_XHIGH;
- default:
- // The density is some abnormal value. Return some other
- // abnormal value that is a reasonable scaling of it.
- iconDensity = (int)((density*0.75f)+.5f);
- }
- Resources packageResources = mPackageManager.
- getResourcesForApplication(info.provider.getPackageName());
- icon = packageResources.getDrawableForDensity(info.icon, iconDensity);
- } catch (NameNotFoundException e) {
- Log.w(TAG, "Can't load icon drawable 0x" + Integer.toHexString(info.icon)
- + " for provider: " + info.provider);
- }
- if (icon == null) {
- Log.w(TAG, "Can't load icon drawable 0x" + Integer.toHexString(info.icon)
- + " for provider: " + info.provider);
- }
- }
-
- PickAdapter.Item item = new PickAdapter.Item(this, label, icon);
-
- item.packageName = info.provider.getPackageName();
- item.className = info.provider.getClassName();
-
- if (customExtras != null) {
- item.extras = customExtras.get(i);
- }
-
- items.add(item);
- }
- }
-
- /**
- * Build and return list of items to be shown in dialog. This will mix both
- * installed {@link AppWidgetProviderInfo} and those provided through
- * {@link AppWidgetManager#EXTRA_CUSTOM_INFO}, sorting them alphabetically.
- */
- @Override
- protected List<PickAdapter.Item> getItems() {
- final Intent intent = getIntent();
- boolean sortCustomAppWidgets =
- intent.getBooleanExtra(AppWidgetManager.EXTRA_CUSTOM_SORT, true);
-
- List<PickAdapter.Item> items = new ArrayList<PickAdapter.Item>();
-
- int categoryFilter = AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN;
- if (intent.getExtras().containsKey(AppWidgetManager.EXTRA_CATEGORY_FILTER)) {
- categoryFilter = intent.getExtras().getInt(AppWidgetManager.EXTRA_CATEGORY_FILTER);
- }
-
- // If not specified, we don't filter on any specific
- int featuresFilter = AppWidgetProviderInfo.WIDGET_FEATURES_NONE;
- if (intent.getExtras().containsKey(AppWidgetManager.EXTRA_FEATURES_FILTER)) {
- featuresFilter = intent.getExtras().getInt(AppWidgetManager.EXTRA_FEATURES_FILTER);
- }
-
- putInstalledAppWidgets(items, categoryFilter, featuresFilter);
- // Sort all items together by label
- if (sortCustomAppWidgets) {
- putCustomAppWidgets(items);
- }
- Collections.sort(items, new Comparator<PickAdapter.Item>() {
- Collator mCollator = Collator.getInstance();
-
- public int compare(PickAdapter.Item lhs, PickAdapter.Item rhs) {
- return mCollator.compare(lhs.label, rhs.label);
- }
- });
- if (!sortCustomAppWidgets) {
- List<PickAdapter.Item> customItems = new ArrayList<PickAdapter.Item>();
- putCustomAppWidgets(customItems);
- items.addAll(customItems);
- }
- mItems = items;
- return items;
+ finish();
}
- /**
- * Create list entries for installed {@link AppWidgetProviderInfo} widgets.
- */
- void putInstalledAppWidgets(List<PickAdapter.Item> items, int categoryFilter, int featuresFilter) {
- List<AppWidgetProviderInfo> installed = mAppWidgetManager.getInstalledProviders();
- putAppWidgetItems(installed, null, items, categoryFilter, featuresFilter, mIgnoreFilter );
- }
/**
* Convenience method for setting the result code and intent. This method