FileDocCategorySizeDatePackage
AppWidgetPickActivity.javaAPI DocAndroid 1.5 API9018Wed May 06 22:42:48 BST 2009com.android.settings

AppWidgetPickActivity

public class AppWidgetPickActivity extends ActivityPicker
Displays a list of {@link AppWidgetProviderInfo} widgets, along with any injected special widgets specified through {@link AppWidgetManager#EXTRA_CUSTOM_INFO} and {@link AppWidgetManager#EXTRA_CUSTOM_EXTRAS}.

When an installed {@link AppWidgetProviderInfo} is selected, this activity will bind it to the given {@link AppWidgetManager#EXTRA_APPWIDGET_ID}, otherwise it will return the requested extras.

(Omit source code)

Fields Summary
private static final String
TAG
private static final boolean
LOGD
private android.content.pm.PackageManager
mPackageManager
private android.appwidget.AppWidgetManager
mAppWidgetManager
private int
mAppWidgetId
The allocated {@link AppWidgetManager#EXTRA_APPWIDGET_ID} that this activity is binding.
Constructors Summary
Methods Summary
protected java.util.ListgetItems()
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.

        List<PickAdapter.Item> items = new ArrayList<PickAdapter.Item>();
        
        putInstalledAppWidgets(items);
        putCustomAppWidgets(items);
        
        // Sort all items together by label
        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);
                }
            });

        return items;
    
public voidonClick(android.content.DialogInterface dialog, int which)
{@inheritDoc}

        Intent intent = getIntentForPosition(which);
        
        int result;
        if (intent.getExtras() != null) {
            // If there are any extras, it's because this entry is custom.
            // Don't try to bind it, just pass it back to the app.
            setResultData(RESULT_OK, intent);
        } else {
            try {
                mAppWidgetManager.bindAppWidgetId(mAppWidgetId, intent.getComponent());
                result = RESULT_OK;
            } catch (IllegalArgumentException e) {
                // This is thrown if they're already bound, or otherwise somehow
                // bogus.  Set the result to canceled, and exit.  The app *should*
                // clean up at this point.  We could pass the error along, but
                // it's not clear that that's useful -- the widget will simply not
                // appear.
                result = RESULT_CANCELED;
            }
            setResultData(result, null);
        }
        finish();
    
public voidonCreate(android.os.Bundle icicle)

    
    
        
        mPackageManager = getPackageManager();
        mAppWidgetManager = AppWidgetManager.getInstance(this);
        
        super.onCreate(icicle);
        
        // Set default return data
        setResultData(RESULT_CANCELED, null);
        
        // Read the appWidgetId passed our direction, otherwise bail if not found
        final Intent intent = getIntent();
        if (intent.hasExtra(AppWidgetManager.EXTRA_APPWIDGET_ID)) {
            mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
                    AppWidgetManager.INVALID_APPWIDGET_ID);
        } else {
            finish();
        }
    
voidputAppWidgetItems(java.util.List appWidgets, java.util.List customExtras, java.util.List items)
Create list entries for the given {@link AppWidgetProviderInfo} widgets, inserting extras if provided.

        final int size = appWidgets.size();
        for (int i = 0; i < size; i++) {
            AppWidgetProviderInfo info = appWidgets.get(i);
            
            CharSequence label = info.label;
            Drawable icon = null;

            if (info.icon != 0) {
                icon = mPackageManager.getDrawable(info.provider.getPackageName(), info.icon, null);
                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);
        }
    
voidputCustomAppWidgets(java.util.List items)
Create list entries for any custom widgets requested through {@link AppWidgetManager#EXTRA_CUSTOM_INFO}.

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


            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 (LOGD) Log.d(TAG, "Using " + customInfo.size() + " custom items");
        putAppWidgetItems(customInfo, customExtras, items);
    
voidputInstalledAppWidgets(java.util.List items)
Create list entries for installed {@link AppWidgetProviderInfo} widgets.

        List<AppWidgetProviderInfo> installed = mAppWidgetManager.getInstalledProviders();
        putAppWidgetItems(installed, null, items);
    
voidsetResultData(int code, android.content.Intent intent)
Convenience method for setting the result code and intent. This method correctly injects the {@link AppWidgetManager#EXTRA_APPWIDGET_ID} that most hosts expect returned.

        Intent result = intent != null ? intent : new Intent();
        result.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
        setResult(code, result);