131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/*
231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Copyright (C) 2009 The Android Open Source Project
331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * you may not use this file except in compliance with the License.
631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * You may obtain a copy of the License at
731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
1031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * See the License for the specific language governing permissions and
1431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * limitations under the License.
1531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */
1631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
17325dc23624160689e59fbac708cf6f222b20d025Daniel Sandlerpackage com.android.launcher3;
1831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
197376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Projectimport android.appwidget.AppWidgetHost;
207376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Projectimport android.appwidget.AppWidgetHostView;
217376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Projectimport android.appwidget.AppWidgetProviderInfo;
2231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.Context;
23084c31873e5d5015dac9eaac722a6d8387b6dd8dAdam Cohenimport android.os.TransactionTooLargeException;
2431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
250fc1be164e982433e619bcbb16aa67e28ff681efSunny Goyalimport java.util.ArrayList;
260fc1be164e982433e619bcbb16aa67e28ff681efSunny Goyal
2731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/**
287376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project * Specific {@link AppWidgetHost} that creates our {@link LauncherAppWidgetHostView}
2931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * which correctly captures all long-press events. This ensures that users can
307376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project * always pick up and move widgets.
3131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */
327376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Projectpublic class LauncherAppWidgetHost extends AppWidgetHost {
33a3f78e39298669c723b4c3388dd2505f422c859cWinson Chung
340fc1be164e982433e619bcbb16aa67e28ff681efSunny Goyal    private final ArrayList<Runnable> mProviderChangeListeners = new ArrayList<Runnable>();
350fc1be164e982433e619bcbb16aa67e28ff681efSunny Goyal
36a3f78e39298669c723b4c3388dd2505f422c859cWinson Chung    Launcher mLauncher;
37a3f78e39298669c723b4c3388dd2505f422c859cWinson Chung
38a3f78e39298669c723b4c3388dd2505f422c859cWinson Chung    public LauncherAppWidgetHost(Launcher launcher, int hostId) {
39a3f78e39298669c723b4c3388dd2505f422c859cWinson Chung        super(launcher, hostId);
40a3f78e39298669c723b4c3388dd2505f422c859cWinson Chung        mLauncher = launcher;
4131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
429415d87eda0cf28b8df1eccde39b0ca1646be3b9Adam Cohen
437376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project    @Override
447376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project    protected AppWidgetHostView onCreateView(Context context, int appWidgetId,
457376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project            AppWidgetProviderInfo appWidget) {
4616fed41e5e680c547b23e108788eb85f1b04d36dMichael Jurka        return new LauncherAppWidgetHostView(context);
4731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
482313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy
492313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy    @Override
50084c31873e5d5015dac9eaac722a6d8387b6dd8dAdam Cohen    public void startListening() {
51084c31873e5d5015dac9eaac722a6d8387b6dd8dAdam Cohen        try {
52084c31873e5d5015dac9eaac722a6d8387b6dd8dAdam Cohen            super.startListening();
53084c31873e5d5015dac9eaac722a6d8387b6dd8dAdam Cohen        } catch (Exception e) {
54084c31873e5d5015dac9eaac722a6d8387b6dd8dAdam Cohen            if (e.getCause() instanceof TransactionTooLargeException) {
55084c31873e5d5015dac9eaac722a6d8387b6dd8dAdam Cohen                // We're willing to let this slide. The exception is being caused by the list of
56084c31873e5d5015dac9eaac722a6d8387b6dd8dAdam Cohen                // RemoteViews which is being passed back. The startListening relationship will
57084c31873e5d5015dac9eaac722a6d8387b6dd8dAdam Cohen                // have been established by this point, and we will end up populating the
58084c31873e5d5015dac9eaac722a6d8387b6dd8dAdam Cohen                // widgets upon bind anyway. See issue 14255011 for more context.
59084c31873e5d5015dac9eaac722a6d8387b6dd8dAdam Cohen            } else {
60084c31873e5d5015dac9eaac722a6d8387b6dd8dAdam Cohen                throw new RuntimeException(e);
61084c31873e5d5015dac9eaac722a6d8387b6dd8dAdam Cohen            }
62084c31873e5d5015dac9eaac722a6d8387b6dd8dAdam Cohen        }
63084c31873e5d5015dac9eaac722a6d8387b6dd8dAdam Cohen    }
64084c31873e5d5015dac9eaac722a6d8387b6dd8dAdam Cohen
65084c31873e5d5015dac9eaac722a6d8387b6dd8dAdam Cohen    @Override
662313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy    public void stopListening() {
672313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy        super.stopListening();
682313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy        clearViews();
692313eff05b8f52e72ebe06c589c419941fa019d6Patrick Dubroy    }
70a3f78e39298669c723b4c3388dd2505f422c859cWinson Chung
710fc1be164e982433e619bcbb16aa67e28ff681efSunny Goyal    public void addProviderChangeListener(Runnable callback) {
720fc1be164e982433e619bcbb16aa67e28ff681efSunny Goyal        mProviderChangeListeners.add(callback);
730fc1be164e982433e619bcbb16aa67e28ff681efSunny Goyal    }
740fc1be164e982433e619bcbb16aa67e28ff681efSunny Goyal
750fc1be164e982433e619bcbb16aa67e28ff681efSunny Goyal    public void removeProviderChangeListener(Runnable callback) {
760fc1be164e982433e619bcbb16aa67e28ff681efSunny Goyal        mProviderChangeListeners.remove(callback);
770fc1be164e982433e619bcbb16aa67e28ff681efSunny Goyal    }
780fc1be164e982433e619bcbb16aa67e28ff681efSunny Goyal
79a3f78e39298669c723b4c3388dd2505f422c859cWinson Chung    protected void onProvidersChanged() {
80a3f78e39298669c723b4c3388dd2505f422c859cWinson Chung        // Once we get the message that widget packages are updated, we need to rebind items
81a3f78e39298669c723b4c3388dd2505f422c859cWinson Chung        // in AppsCustomize accordingly.
82c402cd9992d431b6beacdf3c75e31cf103e230cbMichael Jurka        mLauncher.bindPackagesUpdated(LauncherModel.getSortedWidgetsAndShortcuts(mLauncher));
830fc1be164e982433e619bcbb16aa67e28ff681efSunny Goyal
840fc1be164e982433e619bcbb16aa67e28ff681efSunny Goyal        for (Runnable callback : mProviderChangeListeners) {
850fc1be164e982433e619bcbb16aa67e28ff681efSunny Goyal            callback.run();
860fc1be164e982433e619bcbb16aa67e28ff681efSunny Goyal        }
87a3f78e39298669c723b4c3388dd2505f422c859cWinson Chung    }
8831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project}
89