diff options
author | Winson Chung <winsonc@google.com> | 2010-10-29 11:00:27 -0700 |
---|---|---|
committer | Winson Chung <winsonc@google.com> | 2010-11-03 19:48:17 -0700 |
commit | 68846fdce6c01bbe474bd0c8307e1ccaac161cbc (patch) | |
tree | 958e803c05cab4a48bac5fa1c726db75621324cf /src/com/android/launcher2/InstallWidgetReceiver.java | |
parent | f24312876b097e25cec922edbb58334ed234dcd7 (diff) | |
download | android_packages_apps_Trebuchet-68846fdce6c01bbe474bd0c8307e1ccaac161cbc.tar.gz android_packages_apps_Trebuchet-68846fdce6c01bbe474bd0c8307e1ccaac161cbc.tar.bz2 android_packages_apps_Trebuchet-68846fdce6c01bbe474bd0c8307e1ccaac161cbc.zip |
Initial changes to allow resolution of arbitrary clip data to widgets that support them.
Change-Id: Id5dfa8436a5bf6eb7bd300ec603911a9d3698de3
Diffstat (limited to 'src/com/android/launcher2/InstallWidgetReceiver.java')
-rw-r--r-- | src/com/android/launcher2/InstallWidgetReceiver.java | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/src/com/android/launcher2/InstallWidgetReceiver.java b/src/com/android/launcher2/InstallWidgetReceiver.java index e6a9a696c..970c6a5be 100644 --- a/src/com/android/launcher2/InstallWidgetReceiver.java +++ b/src/com/android/launcher2/InstallWidgetReceiver.java @@ -16,6 +16,25 @@ package com.android.launcher2; +import java.util.List; + +import android.appwidget.AppWidgetProviderInfo; +import android.content.ClipData; +import android.content.Context; +import android.content.DialogInterface; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.database.DataSetObserver; +import android.graphics.drawable.Drawable; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.ListAdapter; +import android.widget.TextView; + +import com.android.launcher.R; + /** * We will likely flesh this out later, to handle allow external apps to place widgets, but for now, @@ -24,11 +43,153 @@ package com.android.launcher2; public class InstallWidgetReceiver { public static final String ACTION_INSTALL_WIDGET = "com.android.launcher.action.INSTALL_WIDGET"; + public static final String ACTION_SUPPORTS_CLIPDATA_MIMETYPE = + "com.android.launcher.action.SUPPORTS_CLIPDATA_MIMETYPE"; // Currently not exposed. Put into Intent when we want to make it public. // TEMP: Should we call this "EXTRA_APPWIDGET_PROVIDER"? public static final String EXTRA_APPWIDGET_COMPONENT = "com.android.launcher.extra.widget.COMPONENT"; + public static final String EXTRA_APPWIDGET_CONFIGURATION_DATA_MIME_TYPE = + "com.android.launcher.extra.widget.CONFIGURATION_DATA_MIME_TYPE"; public static final String EXTRA_APPWIDGET_CONFIGURATION_DATA = "com.android.launcher.extra.widget.CONFIGURATION_DATA"; + + /** + * A simple data class that contains per-item information that the adapter below can reference. + */ + public static class WidgetMimeTypeHandlerData { + public ResolveInfo resolveInfo; + public AppWidgetProviderInfo widgetInfo; + + public WidgetMimeTypeHandlerData(ResolveInfo rInfo, AppWidgetProviderInfo wInfo) { + resolveInfo = rInfo; + widgetInfo = wInfo; + } + } + + /** + * The ListAdapter which presents all the valid widgets that can be created for a given drop. + */ + public static class WidgetListAdapter implements ListAdapter, DialogInterface.OnClickListener { + private LayoutInflater mInflater; + private Launcher mLauncher; + private String mMimeType; + private ClipData mClipData; + private List<WidgetMimeTypeHandlerData> mActivities; + private CellLayout mTargetLayout; + private int mTargetLayoutScreen; + private int[] mTargetLayoutPos; + + public WidgetListAdapter(Launcher l, String mimeType, ClipData data, + List<WidgetMimeTypeHandlerData> list, CellLayout target, + int targetScreen, int[] targetPos) { + mLauncher = l; + mMimeType = mimeType; + mClipData = data; + mActivities = list; + mTargetLayout = target; + mTargetLayoutScreen = targetScreen; + mTargetLayoutPos = targetPos; + } + + @Override + public void registerDataSetObserver(DataSetObserver observer) { + } + + @Override + public void unregisterDataSetObserver(DataSetObserver observer) { + } + + @Override + public int getCount() { + return mActivities.size(); + } + + @Override + public Object getItem(int position) { + return null; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public boolean hasStableIds() { + return true; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + final Context context = parent.getContext(); + final PackageManager packageManager = context.getPackageManager(); + + // Lazy-create inflater + if (mInflater == null) { + mInflater = LayoutInflater.from(context); + } + + // Use the convert-view where possible + if (convertView == null) { + convertView = mInflater.inflate(R.layout.external_widget_drop_list_item, parent, + false); + } + + final WidgetMimeTypeHandlerData data = mActivities.get(position); + final ResolveInfo resolveInfo = data.resolveInfo; + final AppWidgetProviderInfo widgetInfo = data.widgetInfo; + + // Set the icon + Drawable d = resolveInfo.loadIcon(packageManager); + ImageView i = (ImageView) convertView.findViewById(R.id.provider_icon); + i.setImageDrawable(d); + + // Set the text + final CharSequence component = resolveInfo.loadLabel(packageManager); + final int[] widgetSpan = new int[2]; + mTargetLayout.rectToCell(widgetInfo.minWidth, widgetInfo.minHeight, widgetSpan); + TextView t = (TextView) convertView.findViewById(R.id.provider); + t.setText(context.getString(R.string.external_drop_widget_pick_format, + component, widgetSpan[0], widgetSpan[1])); + + return convertView; + } + + @Override + public int getItemViewType(int position) { + return 0; + } + + @Override + public int getViewTypeCount() { + return 1; + } + + @Override + public boolean isEmpty() { + return mActivities.isEmpty(); + } + + @Override + public boolean areAllItemsEnabled() { + return false; + } + + @Override + public boolean isEnabled(int position) { + return true; + } + + @Override + public void onClick(DialogInterface dialog, int which) { + final LauncherModel model = mLauncher.getModel(); + final AppWidgetProviderInfo widgetInfo = mActivities.get(which).widgetInfo; + + final PendingAddWidgetInfo createInfo = new PendingAddWidgetInfo(widgetInfo, mMimeType, + mClipData); + mLauncher.addAppWidgetFromDrop(createInfo, mTargetLayoutScreen, mTargetLayoutPos); + } + } } |