155cef262f97749300c2f6e764da0b00cbcb78879Winson Chung/* 255cef262f97749300c2f6e764da0b00cbcb78879Winson Chung * Copyright (C) 2010 The Android Open Source Project 355cef262f97749300c2f6e764da0b00cbcb78879Winson Chung * 455cef262f97749300c2f6e764da0b00cbcb78879Winson Chung * Licensed under the Apache License, Version 2.0 (the "License"); 555cef262f97749300c2f6e764da0b00cbcb78879Winson Chung * you may not use this file except in compliance with the License. 655cef262f97749300c2f6e764da0b00cbcb78879Winson Chung * You may obtain a copy of the License at 755cef262f97749300c2f6e764da0b00cbcb78879Winson Chung * 855cef262f97749300c2f6e764da0b00cbcb78879Winson Chung * http://www.apache.org/licenses/LICENSE-2.0 955cef262f97749300c2f6e764da0b00cbcb78879Winson Chung * 1055cef262f97749300c2f6e764da0b00cbcb78879Winson Chung * Unless required by applicable law or agreed to in writing, software 1155cef262f97749300c2f6e764da0b00cbcb78879Winson Chung * distributed under the License is distributed on an "AS IS" BASIS, 1255cef262f97749300c2f6e764da0b00cbcb78879Winson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1355cef262f97749300c2f6e764da0b00cbcb78879Winson Chung * See the License for the specific language governing permissions and 1455cef262f97749300c2f6e764da0b00cbcb78879Winson Chung * limitations under the License. 1555cef262f97749300c2f6e764da0b00cbcb78879Winson Chung */ 1655cef262f97749300c2f6e764da0b00cbcb78879Winson Chung 1755cef262f97749300c2f6e764da0b00cbcb78879Winson Chungpackage com.android.launcher2; 1855cef262f97749300c2f6e764da0b00cbcb78879Winson Chung 1968846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chungimport java.util.List; 2068846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 2168846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chungimport android.appwidget.AppWidgetProviderInfo; 2268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chungimport android.content.ClipData; 2368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chungimport android.content.Context; 2468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chungimport android.content.DialogInterface; 2568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chungimport android.content.pm.PackageManager; 2668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chungimport android.content.pm.ResolveInfo; 2768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chungimport android.database.DataSetObserver; 2868846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chungimport android.graphics.drawable.Drawable; 2968846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chungimport android.view.LayoutInflater; 3068846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chungimport android.view.View; 3168846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chungimport android.view.ViewGroup; 3268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chungimport android.widget.ImageView; 3368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chungimport android.widget.ListAdapter; 3468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chungimport android.widget.TextView; 3568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 3668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chungimport com.android.launcher.R; 3768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 3855cef262f97749300c2f6e764da0b00cbcb78879Winson Chung 3955cef262f97749300c2f6e764da0b00cbcb78879Winson Chung/** 4055cef262f97749300c2f6e764da0b00cbcb78879Winson Chung * We will likely flesh this out later, to handle allow external apps to place widgets, but for now, 4155cef262f97749300c2f6e764da0b00cbcb78879Winson Chung * we just want to expose the action around for checking elsewhere. 4255cef262f97749300c2f6e764da0b00cbcb78879Winson Chung */ 4355cef262f97749300c2f6e764da0b00cbcb78879Winson Chungpublic class InstallWidgetReceiver { 4455cef262f97749300c2f6e764da0b00cbcb78879Winson Chung public static final String ACTION_INSTALL_WIDGET = 4555cef262f97749300c2f6e764da0b00cbcb78879Winson Chung "com.android.launcher.action.INSTALL_WIDGET"; 4668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung public static final String ACTION_SUPPORTS_CLIPDATA_MIMETYPE = 4768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung "com.android.launcher.action.SUPPORTS_CLIPDATA_MIMETYPE"; 4855cef262f97749300c2f6e764da0b00cbcb78879Winson Chung 4955cef262f97749300c2f6e764da0b00cbcb78879Winson Chung // Currently not exposed. Put into Intent when we want to make it public. 5055cef262f97749300c2f6e764da0b00cbcb78879Winson Chung // TEMP: Should we call this "EXTRA_APPWIDGET_PROVIDER"? 5155cef262f97749300c2f6e764da0b00cbcb78879Winson Chung public static final String EXTRA_APPWIDGET_COMPONENT = 5255cef262f97749300c2f6e764da0b00cbcb78879Winson Chung "com.android.launcher.extra.widget.COMPONENT"; 5368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung public static final String EXTRA_APPWIDGET_CONFIGURATION_DATA_MIME_TYPE = 5468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung "com.android.launcher.extra.widget.CONFIGURATION_DATA_MIME_TYPE"; 5555cef262f97749300c2f6e764da0b00cbcb78879Winson Chung public static final String EXTRA_APPWIDGET_CONFIGURATION_DATA = 5655cef262f97749300c2f6e764da0b00cbcb78879Winson Chung "com.android.launcher.extra.widget.CONFIGURATION_DATA"; 5768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 5868846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung /** 5968846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung * A simple data class that contains per-item information that the adapter below can reference. 6068846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung */ 6168846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung public static class WidgetMimeTypeHandlerData { 6268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung public ResolveInfo resolveInfo; 6368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung public AppWidgetProviderInfo widgetInfo; 6468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 6568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung public WidgetMimeTypeHandlerData(ResolveInfo rInfo, AppWidgetProviderInfo wInfo) { 6668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung resolveInfo = rInfo; 6768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung widgetInfo = wInfo; 6868846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 6968846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 7068846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 7168846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung /** 7268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung * The ListAdapter which presents all the valid widgets that can be created for a given drop. 7368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung */ 7468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung public static class WidgetListAdapter implements ListAdapter, DialogInterface.OnClickListener { 7568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung private LayoutInflater mInflater; 7668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung private Launcher mLauncher; 7768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung private String mMimeType; 7868846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung private ClipData mClipData; 7968846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung private List<WidgetMimeTypeHandlerData> mActivities; 8068846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung private CellLayout mTargetLayout; 8168846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung private int mTargetLayoutScreen; 8268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung private int[] mTargetLayoutPos; 8368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 8468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung public WidgetListAdapter(Launcher l, String mimeType, ClipData data, 8568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung List<WidgetMimeTypeHandlerData> list, CellLayout target, 8668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung int targetScreen, int[] targetPos) { 8768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung mLauncher = l; 8868846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung mMimeType = mimeType; 8968846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung mClipData = data; 9068846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung mActivities = list; 9168846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung mTargetLayout = target; 9268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung mTargetLayoutScreen = targetScreen; 9368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung mTargetLayoutPos = targetPos; 9468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 9568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 9668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung @Override 9768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung public void registerDataSetObserver(DataSetObserver observer) { 9868846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 9968846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 10068846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung @Override 10168846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung public void unregisterDataSetObserver(DataSetObserver observer) { 10268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 10368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 10468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung @Override 10568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung public int getCount() { 10668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung return mActivities.size(); 10768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 10868846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 10968846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung @Override 11068846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung public Object getItem(int position) { 11168846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung return null; 11268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 11368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 11468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung @Override 11568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung public long getItemId(int position) { 11668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung return position; 11768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 11868846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 11968846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung @Override 12068846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung public boolean hasStableIds() { 12168846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung return true; 12268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 12368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 12468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung @Override 12568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung public View getView(int position, View convertView, ViewGroup parent) { 12668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung final Context context = parent.getContext(); 12768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung final PackageManager packageManager = context.getPackageManager(); 12868846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 12968846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung // Lazy-create inflater 13068846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung if (mInflater == null) { 13168846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung mInflater = LayoutInflater.from(context); 13268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 13368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 13468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung // Use the convert-view where possible 13568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung if (convertView == null) { 13668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung convertView = mInflater.inflate(R.layout.external_widget_drop_list_item, parent, 13768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung false); 13868846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 13968846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 14068846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung final WidgetMimeTypeHandlerData data = mActivities.get(position); 14168846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung final ResolveInfo resolveInfo = data.resolveInfo; 14268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung final AppWidgetProviderInfo widgetInfo = data.widgetInfo; 14368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 14468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung // Set the icon 14568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung Drawable d = resolveInfo.loadIcon(packageManager); 14668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung ImageView i = (ImageView) convertView.findViewById(R.id.provider_icon); 14768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung i.setImageDrawable(d); 14868846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 14968846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung // Set the text 15068846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung final CharSequence component = resolveInfo.loadLabel(packageManager); 15168846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung final int[] widgetSpan = new int[2]; 15268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung mTargetLayout.rectToCell(widgetInfo.minWidth, widgetInfo.minHeight, widgetSpan); 15368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung TextView t = (TextView) convertView.findViewById(R.id.provider); 15468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung t.setText(context.getString(R.string.external_drop_widget_pick_format, 15568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung component, widgetSpan[0], widgetSpan[1])); 15668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 15768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung return convertView; 15868846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 15968846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 16068846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung @Override 16168846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung public int getItemViewType(int position) { 16268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung return 0; 16368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 16468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 16568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung @Override 16668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung public int getViewTypeCount() { 16768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung return 1; 16868846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 16968846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 17068846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung @Override 17168846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung public boolean isEmpty() { 17268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung return mActivities.isEmpty(); 17368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 17468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 17568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung @Override 17668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung public boolean areAllItemsEnabled() { 17768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung return false; 17868846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 17968846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 18068846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung @Override 18168846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung public boolean isEnabled(int position) { 18268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung return true; 18368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 18468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 18568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung @Override 18668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung public void onClick(DialogInterface dialog, int which) { 18768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung final AppWidgetProviderInfo widgetInfo = mActivities.get(which).widgetInfo; 18868846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 18968846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung final PendingAddWidgetInfo createInfo = new PendingAddWidgetInfo(widgetInfo, mMimeType, 190c9d95c5897fc5ebbf53903d4ab18ad13d196f643Michael Jurka mClipData); 1913d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung mLauncher.addAppWidgetFromDrop(createInfo, LauncherSettings.Favorites.CONTAINER_DESKTOP, 192d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen mTargetLayoutScreen, null, null, mTargetLayoutPos); 19368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 19468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 19555cef262f97749300c2f6e764da0b00cbcb78879Winson Chung} 196