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