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