1c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project/* 2c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 3c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * 4c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * you may not use this file except in compliance with the License. 6c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * You may obtain a copy of the License at 7c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * 8c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * 10c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * See the License for the specific language governing permissions and 14c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * limitations under the License. 15c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 16c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 17c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectpackage android.appwidget; 18c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 19c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport android.content.ComponentName; 20c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport android.content.Context; 2181f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chungimport android.content.Intent; 22e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohenimport android.os.Bundle; 23c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport android.os.IBinder; 24c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport android.os.RemoteException; 25c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport android.os.ServiceManager; 268f25c426b118c35f558cbf27bd413e1eb6d59823Mitsuru Oshimaimport android.util.DisplayMetrics; 278f25c426b118c35f558cbf27bd413e1eb6d59823Mitsuru Oshimaimport android.util.TypedValue; 28c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport android.widget.RemoteViews; 29c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 30c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport com.android.internal.appwidget.IAppWidgetService; 31c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 32c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport java.lang.ref.WeakReference; 33c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport java.util.List; 34c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectimport java.util.WeakHashMap; 35c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 36c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project/** 37c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Updates AppWidget state; gets information about installed AppWidget providers and other 38c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * AppWidget related state. 393aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * 403aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <div class="special reference"> 413aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <h3>Developer Guides</h3> 423aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <p>For more information about creating app widgets, read the 433aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * <a href="{@docRoot}guide/topics/appwidgets/index.html">App Widgets</a> developer guide.</p> 443aef8e1d1b2f0b87d470bcccf37ba4ebb6560c45Joe Fernandez * </div> 45c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 46c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Projectpublic class AppWidgetManager { 47c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project static final String TAG = "AppWidgetManager"; 48c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 49c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project /** 50c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Send this from your {@link AppWidgetHost} activity when you want to pick an AppWidget to display. 51c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * The AppWidget picker activity will be launched. 52c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <p> 53c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * You must supply the following extras: 54c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <table> 55c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <tr> 56c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <td>{@link #EXTRA_APPWIDGET_ID}</td> 57c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <td>A newly allocated appWidgetId, which will be bound to the AppWidget provider 58c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * once the user has selected one.</td> 59c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * </tr> 60c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * </table> 61c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * 62c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <p> 63c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * The system will respond with an onActivityResult call with the following extras in 64c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * the intent: 65c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <table> 66c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <tr> 67c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <td>{@link #EXTRA_APPWIDGET_ID}</td> 68c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <td>The appWidgetId that you supplied in the original intent.</td> 69c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * </tr> 70c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * </table> 71c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <p> 72c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * When you receive the result from the AppWidget pick activity, if the resultCode is 73c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * {@link android.app.Activity#RESULT_OK}, an AppWidget has been selected. You should then 74c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * check the AppWidgetProviderInfo for the returned AppWidget, and if it has one, launch its configuration 75c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * activity. If {@link android.app.Activity#RESULT_CANCELED} is returned, you should delete 76c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * the appWidgetId. 77c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * 78c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * @see #ACTION_APPWIDGET_CONFIGURE 79c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 80c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project public static final String ACTION_APPWIDGET_PICK = "android.appwidget.action.APPWIDGET_PICK"; 81c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 82c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project /** 83fc753c0cf676000b1c2d3cb2728af85a9b49f795Michael Jurka * Similar to ACTION_APPWIDGET_PICK, but used from keyguard 84fc753c0cf676000b1c2d3cb2728af85a9b49f795Michael Jurka * @hide 85fc753c0cf676000b1c2d3cb2728af85a9b49f795Michael Jurka */ 86fc753c0cf676000b1c2d3cb2728af85a9b49f795Michael Jurka public static final String 87fc753c0cf676000b1c2d3cb2728af85a9b49f795Michael Jurka ACTION_KEYGUARD_APPWIDGET_PICK = "android.appwidget.action.KEYGUARD_APPWIDGET_PICK"; 88fc753c0cf676000b1c2d3cb2728af85a9b49f795Michael Jurka 89fc753c0cf676000b1c2d3cb2728af85a9b49f795Michael Jurka /** 9061a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * Send this from your {@link AppWidgetHost} activity when you want to bind an AppWidget to 9161a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * display and bindAppWidgetIdIfAllowed returns false. 9261a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * <p> 9361a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * You must supply the following extras: 9461a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * <table> 9561a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * <tr> 9661a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * <td>{@link #EXTRA_APPWIDGET_ID}</td> 9761a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * <td>A newly allocated appWidgetId, which will be bound to the AppWidget provider 9861a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * you provide.</td> 9961a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * </tr> 10061a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * <tr> 10161a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * <td>{@link #EXTRA_APPWIDGET_PROVIDER}</td> 10261a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * <td>The BroadcastReceiver that will be the AppWidget provider for this AppWidget. 10361a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * </td> 10461a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * </tr> 10561a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * </table> 10661a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * 10761a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * <p> 10861a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * The system will respond with an onActivityResult call with the following extras in 10961a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * the intent: 11061a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * <table> 11161a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * <tr> 11261a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * <td>{@link #EXTRA_APPWIDGET_ID}</td> 11361a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * <td>The appWidgetId that you supplied in the original intent.</td> 11461a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * </tr> 11561a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * </table> 11661a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * <p> 11761a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * When you receive the result from the AppWidget bind activity, if the resultCode is 11861a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * {@link android.app.Activity#RESULT_OK}, the AppWidget has been bound. You should then 11961a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * check the AppWidgetProviderInfo for the returned AppWidget, and if it has one, launch its 12061a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * configuration activity. If {@link android.app.Activity#RESULT_CANCELED} is returned, you 12161a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * should delete 12261a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * the appWidgetId. 12361a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * 12461a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * @see #ACTION_APPWIDGET_CONFIGURE 12561a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * 12661a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka */ 12761a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka public static final String ACTION_APPWIDGET_BIND = "android.appwidget.action.APPWIDGET_BIND"; 12861a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka 12961a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka /** 130c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Sent when it is time to configure your AppWidget while it is being added to a host. 131c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * This action is not sent as a broadcast to the AppWidget provider, but as a startActivity 132c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * to the activity specified in the {@link AppWidgetProviderInfo AppWidgetProviderInfo meta-data}. 133c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * 134c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <p> 135c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * The intent will contain the following extras: 136c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <table> 137c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <tr> 138c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <td>{@link #EXTRA_APPWIDGET_ID}</td> 139c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <td>The appWidgetId to configure.</td> 140c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * </tr> 141c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * </table> 142c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * 143c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <p>If you return {@link android.app.Activity#RESULT_OK} using 144c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * {@link android.app.Activity#setResult Activity.setResult()}, the AppWidget will be added, 145c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * and you will receive an {@link #ACTION_APPWIDGET_UPDATE} broadcast for this AppWidget. 146c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * If you return {@link android.app.Activity#RESULT_CANCELED}, the host will cancel the add 147c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * and not display this AppWidget, and you will receive a {@link #ACTION_APPWIDGET_DELETED} broadcast. 148c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 149c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project public static final String ACTION_APPWIDGET_CONFIGURE = "android.appwidget.action.APPWIDGET_CONFIGURE"; 150c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 151c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project /** 152c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * An intent extra that contains one appWidgetId. 153c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <p> 154c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * The value will be an int that can be retrieved like this: 155c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * {@sample frameworks/base/tests/appwidgets/AppWidgetHostTest/src/com/android/tests/appwidgethost/AppWidgetHostActivity.java getExtra_EXTRA_APPWIDGET_ID} 156c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 157c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project public static final String EXTRA_APPWIDGET_ID = "appWidgetId"; 158c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 159c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project /** 1600aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * A bundle extra that contains the lower bound on the current width, in dips, of a widget instance. 161e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen */ 162d2097ebacf3a3658624cad10669a4d98e8d7d846Adam Cohen public static final String OPTION_APPWIDGET_MIN_WIDTH = "appWidgetMinWidth"; 163e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen 164e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen /** 1650aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * A bundle extra that contains the lower bound on the current height, in dips, of a widget instance. 166e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen */ 167d2097ebacf3a3658624cad10669a4d98e8d7d846Adam Cohen public static final String OPTION_APPWIDGET_MIN_HEIGHT = "appWidgetMinHeight"; 168e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen 169e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen /** 1700aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * A bundle extra that contains the upper bound on the current width, in dips, of a widget instance. 171e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen */ 172d2097ebacf3a3658624cad10669a4d98e8d7d846Adam Cohen public static final String OPTION_APPWIDGET_MAX_WIDTH = "appWidgetMaxWidth"; 173e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen 174e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen /** 1750aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * A bundle extra that contains the upper bound on the current width, in dips, of a widget instance. 176e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen */ 177d2097ebacf3a3658624cad10669a4d98e8d7d846Adam Cohen public static final String OPTION_APPWIDGET_MAX_HEIGHT = "appWidgetMaxHeight"; 178e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen 179e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen /** 1800aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * A bundle extra that hints to the AppWidgetProvider the category of host that owns this 1810aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * this widget. Can have the value {@link 1820aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * AppWidgetProviderInfo#WIDGET_CATEGORY_HOME_SCREEN} or {@link 1830aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * AppWidgetProviderInfo#WIDGET_CATEGORY_KEYGUARD}. 1840aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen */ 1850aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen public static final String OPTION_APPWIDGET_HOST_CATEGORY = "appWidgetCategory"; 1860aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen 1870aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen /** 188e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen * An intent extra which points to a bundle of extra information for a particular widget id. 189e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen * In particular this bundle can contain EXTRA_APPWIDGET_WIDTH and EXTRA_APPWIDGET_HEIGHT. 190e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen */ 191d2097ebacf3a3658624cad10669a4d98e8d7d846Adam Cohen public static final String EXTRA_APPWIDGET_OPTIONS = "appWidgetOptions"; 192e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen 193e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen /** 194c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * An intent extra that contains multiple appWidgetIds. 195c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <p> 196c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * The value will be an int array that can be retrieved like this: 197c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * {@sample frameworks/base/tests/appwidgets/AppWidgetHostTest/src/com/android/tests/appwidgethost/TestAppWidgetProvider.java getExtra_EXTRA_APPWIDGET_IDS} 198c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 199c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project public static final String EXTRA_APPWIDGET_IDS = "appWidgetIds"; 200c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 201c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project /** 20261a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * An intent extra that contains the component name of a AppWidget provider. 20361a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * <p> 20461a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * The value will be an ComponentName. 20561a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka */ 20661a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka public static final String EXTRA_APPWIDGET_PROVIDER = "appWidgetProvider"; 20761a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka 20861a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka /** 209105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * An intent extra to pass to the AppWidget picker containing a {@link java.util.List} of 210105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@link AppWidgetProviderInfo} objects to mix in to the list of AppWidgets that are 211105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * installed. (This is how the launcher shows the search widget). 212105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 213105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public static final String EXTRA_CUSTOM_INFO = "customInfo"; 214105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 215105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /** 216105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * An intent extra to pass to the AppWidget picker containing a {@link java.util.List} of 217105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@link android.os.Bundle} objects to mix in to the list of AppWidgets that are 218105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * installed. It will be added to the extras object on the {@link android.content.Intent} 219105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * that is returned from the picker activity. 220105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * 221105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@more} 222105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 223105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public static final String EXTRA_CUSTOM_EXTRAS = "customExtras"; 224105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 225105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /** 2268c09f636ba704a41d45cf051383abc2320a5a2b8Adam Cohen * An intent extra to pass to the AppWidget picker which allows the picker to filter 2278c09f636ba704a41d45cf051383abc2320a5a2b8Adam Cohen * the list based on the {@link AppWidgetProviderInfo#widgetCategory}. 228f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller * 229f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller * @hide 2308c09f636ba704a41d45cf051383abc2320a5a2b8Adam Cohen */ 2318c09f636ba704a41d45cf051383abc2320a5a2b8Adam Cohen public static final String EXTRA_CATEGORY_FILTER = "categoryFilter"; 2328c09f636ba704a41d45cf051383abc2320a5a2b8Adam Cohen 2338c09f636ba704a41d45cf051383abc2320a5a2b8Adam Cohen /** 234f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller * An intent extra to pass to the AppWidget picker to specify whether or not to sort 235f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller * the list of caller-specified extra AppWidgets along with the rest of the AppWidgets 236f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller * @hide 237f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller */ 238f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller public static final String EXTRA_CUSTOM_SORT = "customSort"; 239f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller 240f229e4d3eb8f910c181f96416c6798f6f305a395Jim Miller /** 241c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * A sentiel value that the AppWidget manager will never return as a appWidgetId. 242c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 243c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project public static final int INVALID_APPWIDGET_ID = 0; 244c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 245c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project /** 246c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Sent when it is time to update your AppWidget. 247c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * 248c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <p>This may be sent in response to a new instance for this AppWidget provider having 249c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * been instantiated, the requested {@link AppWidgetProviderInfo#updatePeriodMillis update interval} 250c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * having lapsed, or the system booting. 251c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * 252c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <p> 253c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * The intent will contain the following extras: 254c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <table> 255c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <tr> 256c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <td>{@link #EXTRA_APPWIDGET_IDS}</td> 257c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <td>The appWidgetIds to update. This may be all of the AppWidgets created for this 258c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * provider, or just a subset. The system tries to send updates for as few AppWidget 259c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * instances as possible.</td> 260c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * </tr> 261c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * </table> 26210c543da2f407d7a4e2a6fa0375e39ec0d232233Christian Mehlmauer * 263c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * @see AppWidgetProvider#onUpdate AppWidgetProvider.onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 264c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 265c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project public static final String ACTION_APPWIDGET_UPDATE = "android.appwidget.action.APPWIDGET_UPDATE"; 266c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 267c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project /** 268e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen * Sent when the custom extras for an AppWidget change. 269e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen * 2700e9f34bffdfc476122337d077453f722fc22038fKatie McCormick * @see AppWidgetProvider#onAppWidgetOptionsChanged 2710e9f34bffdfc476122337d077453f722fc22038fKatie McCormick * AppWidgetProvider.onAppWidgetOptionsChanged(Context context, 2720e9f34bffdfc476122337d077453f722fc22038fKatie McCormick * AppWidgetManager appWidgetManager, int appWidgetId, Bundle newExtras) 273e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen */ 274d2097ebacf3a3658624cad10669a4d98e8d7d846Adam Cohen public static final String ACTION_APPWIDGET_OPTIONS_CHANGED = "android.appwidget.action.APPWIDGET_UPDATE_OPTIONS"; 275e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen 276e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen /** 277c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Sent when an instance of an AppWidget is deleted from its host. 278c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * 279c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * @see AppWidgetProvider#onDeleted AppWidgetProvider.onDeleted(Context context, int[] appWidgetIds) 280c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 281c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project public static final String ACTION_APPWIDGET_DELETED = "android.appwidget.action.APPWIDGET_DELETED"; 282c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 283c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project /** 284c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Sent when an instance of an AppWidget is removed from the last host. 28510c543da2f407d7a4e2a6fa0375e39ec0d232233Christian Mehlmauer * 286c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * @see AppWidgetProvider#onEnabled AppWidgetProvider.onEnabled(Context context) 287c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 288c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project public static final String ACTION_APPWIDGET_DISABLED = "android.appwidget.action.APPWIDGET_DISABLED"; 289c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 290c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project /** 291c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Sent when an instance of an AppWidget is added to a host for the first time. 292c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * This broadcast is sent at boot time if there is a AppWidgetHost installed with 293c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * an instance for this provider. 29410c543da2f407d7a4e2a6fa0375e39ec0d232233Christian Mehlmauer * 295c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * @see AppWidgetProvider#onEnabled AppWidgetProvider.onEnabled(Context context) 296c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 297c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project public static final String ACTION_APPWIDGET_ENABLED = "android.appwidget.action.APPWIDGET_ENABLED"; 298c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 299c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project /** 300c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Field for the manifest meta-data tag. 301c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * 302c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * @see AppWidgetProviderInfo 303c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 304c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project public static final String META_DATA_APPWIDGET_PROVIDER = "android.appwidget.provider"; 30510c543da2f407d7a4e2a6fa0375e39ec0d232233Christian Mehlmauer 30610c543da2f407d7a4e2a6fa0375e39ec0d232233Christian Mehlmauer static WeakHashMap<Context, WeakReference<AppWidgetManager>> sManagerCache = 30710c543da2f407d7a4e2a6fa0375e39ec0d232233Christian Mehlmauer new WeakHashMap<Context, WeakReference<AppWidgetManager>>(); 308c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project static IAppWidgetService sService; 30910c543da2f407d7a4e2a6fa0375e39ec0d232233Christian Mehlmauer 310c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project Context mContext; 311c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 3128f25c426b118c35f558cbf27bd413e1eb6d59823Mitsuru Oshima private DisplayMetrics mDisplayMetrics; 3138f25c426b118c35f558cbf27bd413e1eb6d59823Mitsuru Oshima 314c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project /** 315c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Get the AppWidgetManager instance to use for the supplied {@link android.content.Context 316c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Context} object. 317c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 318c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project public static AppWidgetManager getInstance(Context context) { 319c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project synchronized (sManagerCache) { 320c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project if (sService == null) { 321c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project IBinder b = ServiceManager.getService(Context.APPWIDGET_SERVICE); 322c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project sService = IAppWidgetService.Stub.asInterface(b); 323c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 324c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 325c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project WeakReference<AppWidgetManager> ref = sManagerCache.get(context); 326c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project AppWidgetManager result = null; 327c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project if (ref != null) { 328c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project result = ref.get(); 329c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 330c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project if (result == null) { 331c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project result = new AppWidgetManager(context); 33210c543da2f407d7a4e2a6fa0375e39ec0d232233Christian Mehlmauer sManagerCache.put(context, new WeakReference<AppWidgetManager>(result)); 333c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 334c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project return result; 335c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 336c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 337c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 338c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project private AppWidgetManager(Context context) { 339c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project mContext = context; 3408f25c426b118c35f558cbf27bd413e1eb6d59823Mitsuru Oshima mDisplayMetrics = context.getResources().getDisplayMetrics(); 341c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 342c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 343c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project /** 344c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Set the RemoteViews to use for the specified appWidgetIds. 345c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * 3462dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * Note that the RemoteViews parameter will be cached by the AppWidgetService, and hence should 3472dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * contain a complete representation of the widget. For performing partial widget updates, see 3482dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * {@link #partiallyUpdateAppWidget(int[], RemoteViews)}. 3492dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * 350c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <p> 351c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * It is okay to call this method both inside an {@link #ACTION_APPWIDGET_UPDATE} broadcast, 352c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * and outside of the handler. 353c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * This method will only work when called from the uid that owns the AppWidget provider. 354311c79c3e93589c6fc720fe6c58ed522af591376Adam Cohen * 355311c79c3e93589c6fc720fe6c58ed522af591376Adam Cohen * <p> 356311c79c3e93589c6fc720fe6c58ed522af591376Adam Cohen * The total Bitmap memory used by the RemoteViews object cannot exceed that required to 357f25ab44975bb0aaeaa88e8dc564f160bb640902eMichael Jurka * fill the screen 1.5 times, ie. (screen width x screen height x 4 x 1.5) bytes. 358c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * 359c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * @param appWidgetIds The AppWidget instances for which to set the RemoteViews. 360c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * @param views The RemoteViews object to show. 361c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 362c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project public void updateAppWidget(int[] appWidgetIds, RemoteViews views) { 363c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project try { 364c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project sService.updateAppWidgetIds(appWidgetIds, views); 365c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 366c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project catch (RemoteException e) { 367c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project throw new RuntimeException("system server dead?", e); 368c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 369c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 370c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 371c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project /** 372e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen * Update the extras for a given widget instance. 373e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen * 374e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen * The extras can be used to embed additional information about this widget to be accessed 375e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen * by the associated widget's AppWidgetProvider. 376e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen * 377d2097ebacf3a3658624cad10669a4d98e8d7d846Adam Cohen * @see #getAppWidgetOptions(int) 378e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen * 379e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen * @param appWidgetId The AppWidget instances for which to set the RemoteViews. 380d2097ebacf3a3658624cad10669a4d98e8d7d846Adam Cohen * @param options The options to associate with this widget 381e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen */ 382d2097ebacf3a3658624cad10669a4d98e8d7d846Adam Cohen public void updateAppWidgetOptions(int appWidgetId, Bundle options) { 383e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen try { 384d2097ebacf3a3658624cad10669a4d98e8d7d846Adam Cohen sService.updateAppWidgetOptions(appWidgetId, options); 385e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen } 386e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen catch (RemoteException e) { 387e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen throw new RuntimeException("system server dead?", e); 388e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen } 389e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen } 390e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen 391e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen /** 392e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen * Get the extras associated with a given widget instance. 393e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen * 394e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen * The extras can be used to embed additional information about this widget to be accessed 395e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen * by the associated widget's AppWidgetProvider. 396e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen * 397d2097ebacf3a3658624cad10669a4d98e8d7d846Adam Cohen * @see #updateAppWidgetOptions(int, Bundle) 398e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen * 399e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen * @param appWidgetId The AppWidget instances for which to set the RemoteViews. 400d2097ebacf3a3658624cad10669a4d98e8d7d846Adam Cohen * @return The options associated with the given widget instance. 401e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen */ 402d2097ebacf3a3658624cad10669a4d98e8d7d846Adam Cohen public Bundle getAppWidgetOptions(int appWidgetId) { 403e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen try { 404d2097ebacf3a3658624cad10669a4d98e8d7d846Adam Cohen return sService.getAppWidgetOptions(appWidgetId); 405e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen } 406e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen catch (RemoteException e) { 407e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen throw new RuntimeException("system server dead?", e); 408e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen } 409e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen } 410e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen 411e8724c82ab1479f13c85a2c6219841e1fd95f2d2Adam Cohen /** 412c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Set the RemoteViews to use for the specified appWidgetId. 413c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * 4142dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * Note that the RemoteViews parameter will be cached by the AppWidgetService, and hence should 4152dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * contain a complete representation of the widget. For performing partial widget updates, see 4162dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * {@link #partiallyUpdateAppWidget(int, RemoteViews)}. 4172dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * 418c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <p> 419c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * It is okay to call this method both inside an {@link #ACTION_APPWIDGET_UPDATE} broadcast, 420c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * and outside of the handler. 421c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * This method will only work when called from the uid that owns the AppWidget provider. 422c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * 423311c79c3e93589c6fc720fe6c58ed522af591376Adam Cohen * <p> 424311c79c3e93589c6fc720fe6c58ed522af591376Adam Cohen * The total Bitmap memory used by the RemoteViews object cannot exceed that required to 425f25ab44975bb0aaeaa88e8dc564f160bb640902eMichael Jurka * fill the screen 1.5 times, ie. (screen width x screen height x 4 x 1.5) bytes. 426311c79c3e93589c6fc720fe6c58ed522af591376Adam Cohen * 427c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * @param appWidgetId The AppWidget instance for which to set the RemoteViews. 428c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * @param views The RemoteViews object to show. 429c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 430c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project public void updateAppWidget(int appWidgetId, RemoteViews views) { 431c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project updateAppWidget(new int[] { appWidgetId }, views); 432c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 433c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 434c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project /** 4352dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * Perform an incremental update or command on the widget(s) specified by appWidgetIds. 4362dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * 4372dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * This update differs from {@link #updateAppWidget(int[], RemoteViews)} in that the 4382dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * RemoteViews object which is passed is understood to be an incomplete representation of the 439fbe44b7d5e2d9d06a238a54f8ed460fb8bc49585Adam Cohen * widget, and hence does not replace the cached representation of the widget. As of API 440fbe44b7d5e2d9d06a238a54f8ed460fb8bc49585Adam Cohen * level 17, the new properties set within the views objects will be appended to the cached 441fbe44b7d5e2d9d06a238a54f8ed460fb8bc49585Adam Cohen * representation of the widget, and hence will persist. 4422dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * 4432dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * Use with {@link RemoteViews#showNext(int)}, {@link RemoteViews#showPrevious(int)}, 4442dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * {@link RemoteViews#setScrollPosition(int, int)} and similar commands. 4452dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * 4462dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * <p> 4472dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * It is okay to call this method both inside an {@link #ACTION_APPWIDGET_UPDATE} broadcast, 4482dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * and outside of the handler. 4492dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * This method will only work when called from the uid that owns the AppWidget provider. 4502dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * 4516611988429d1d70ec429f87bbf2b093cf1e2e31fWinson Chung * <p> 4526611988429d1d70ec429f87bbf2b093cf1e2e31fWinson Chung * This method will be ignored if a widget has not received a full update via 4536611988429d1d70ec429f87bbf2b093cf1e2e31fWinson Chung * {@link #updateAppWidget(int[], RemoteViews)}. 4546611988429d1d70ec429f87bbf2b093cf1e2e31fWinson Chung * 4552dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * @param appWidgetIds The AppWidget instances for which to set the RemoteViews. 4562dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * @param views The RemoteViews object containing the incremental update / command. 4572dd2197805edb4d9547b143deef2226413218f4cAdam Cohen */ 4582dd2197805edb4d9547b143deef2226413218f4cAdam Cohen public void partiallyUpdateAppWidget(int[] appWidgetIds, RemoteViews views) { 4592dd2197805edb4d9547b143deef2226413218f4cAdam Cohen try { 4602dd2197805edb4d9547b143deef2226413218f4cAdam Cohen sService.partiallyUpdateAppWidgetIds(appWidgetIds, views); 4612dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } catch (RemoteException e) { 4622dd2197805edb4d9547b143deef2226413218f4cAdam Cohen throw new RuntimeException("system server dead?", e); 4632dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 4642dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 4652dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 4662dd2197805edb4d9547b143deef2226413218f4cAdam Cohen /** 4672dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * Perform an incremental update or command on the widget specified by appWidgetId. 4682dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * 4692dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * This update differs from {@link #updateAppWidget(int, RemoteViews)} in that the RemoteViews 4702dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * object which is passed is understood to be an incomplete representation of the widget, and 4712dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * hence is not cached by the AppWidgetService. Note that because these updates are not cached, 4722dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * any state that they modify that is not restored by restoreInstanceState will not persist in 4732dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * the case that the widgets are restored using the cached version in AppWidgetService. 4742dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * 4752dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * Use with {@link RemoteViews#showNext(int)}, {@link RemoteViews#showPrevious(int)}, 4762dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * {@link RemoteViews#setScrollPosition(int, int)} and similar commands. 4772dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * 4782dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * <p> 4792dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * It is okay to call this method both inside an {@link #ACTION_APPWIDGET_UPDATE} broadcast, 4802dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * and outside of the handler. 4812dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * This method will only work when called from the uid that owns the AppWidget provider. 4822dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * 4836611988429d1d70ec429f87bbf2b093cf1e2e31fWinson Chung * <p> 4846611988429d1d70ec429f87bbf2b093cf1e2e31fWinson Chung * This method will be ignored if a widget has not received a full update via 4856611988429d1d70ec429f87bbf2b093cf1e2e31fWinson Chung * {@link #updateAppWidget(int[], RemoteViews)}. 4866611988429d1d70ec429f87bbf2b093cf1e2e31fWinson Chung * 4872dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * @param appWidgetId The AppWidget instance for which to set the RemoteViews. 4882dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * @param views The RemoteViews object containing the incremental update / command. 4892dd2197805edb4d9547b143deef2226413218f4cAdam Cohen */ 4902dd2197805edb4d9547b143deef2226413218f4cAdam Cohen public void partiallyUpdateAppWidget(int appWidgetId, RemoteViews views) { 4912dd2197805edb4d9547b143deef2226413218f4cAdam Cohen partiallyUpdateAppWidget(new int[] { appWidgetId }, views); 4922dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 4932dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 4942dd2197805edb4d9547b143deef2226413218f4cAdam Cohen /** 495c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Set the RemoteViews to use for all AppWidget instances for the supplied AppWidget provider. 496c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * 497c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * <p> 498c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * It is okay to call this method both inside an {@link #ACTION_APPWIDGET_UPDATE} broadcast, 499c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * and outside of the handler. 500c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * This method will only work when called from the uid that owns the AppWidget provider. 501c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * 502c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * @param provider The {@link ComponentName} for the {@link 503c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * android.content.BroadcastReceiver BroadcastReceiver} provider 504c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * for your AppWidget. 505c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * @param views The RemoteViews object to show. 506c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 507c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project public void updateAppWidget(ComponentName provider, RemoteViews views) { 508c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project try { 509c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project sService.updateAppWidgetProvider(provider, views); 510c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 511c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project catch (RemoteException e) { 512c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project throw new RuntimeException("system server dead?", e); 513c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 514c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 515c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 516c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project /** 517499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * Notifies the specified collection view in all the specified AppWidget instances 518499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * to invalidate their currently data. 519499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * 520499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * @param appWidgetIds The AppWidget instances for which to notify of view data changes. 521499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * @param viewId The collection view id. 522499cb9f516062b654952d282f211bee44c31a3c2Winson Chung */ 5236394c0e52cf641d93f678fd052499aa952e3595dWinson Chung public void notifyAppWidgetViewDataChanged(int[] appWidgetIds, int viewId) { 524499cb9f516062b654952d282f211bee44c31a3c2Winson Chung try { 5256394c0e52cf641d93f678fd052499aa952e3595dWinson Chung sService.notifyAppWidgetViewDataChanged(appWidgetIds, viewId); 526499cb9f516062b654952d282f211bee44c31a3c2Winson Chung } 527499cb9f516062b654952d282f211bee44c31a3c2Winson Chung catch (RemoteException e) { 528499cb9f516062b654952d282f211bee44c31a3c2Winson Chung throw new RuntimeException("system server dead?", e); 529499cb9f516062b654952d282f211bee44c31a3c2Winson Chung } 530499cb9f516062b654952d282f211bee44c31a3c2Winson Chung } 531499cb9f516062b654952d282f211bee44c31a3c2Winson Chung 532499cb9f516062b654952d282f211bee44c31a3c2Winson Chung /** 533499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * Notifies the specified collection view in all the specified AppWidget instance 534499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * to invalidate it's currently data. 535499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * 536499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * @param appWidgetId The AppWidget instance for which to notify of view data changes. 537499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * @param viewId The collection view id. 538499cb9f516062b654952d282f211bee44c31a3c2Winson Chung */ 5396394c0e52cf641d93f678fd052499aa952e3595dWinson Chung public void notifyAppWidgetViewDataChanged(int appWidgetId, int viewId) { 5406394c0e52cf641d93f678fd052499aa952e3595dWinson Chung notifyAppWidgetViewDataChanged(new int[] { appWidgetId }, viewId); 541499cb9f516062b654952d282f211bee44c31a3c2Winson Chung } 542499cb9f516062b654952d282f211bee44c31a3c2Winson Chung 543499cb9f516062b654952d282f211bee44c31a3c2Winson Chung /** 544c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Return a list of the AppWidget providers that are currently installed. 545c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 546c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project public List<AppWidgetProviderInfo> getInstalledProviders() { 547c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project try { 5485d1409191ea8d76268ddc4cd14759ad0d6a3c180Patrick Dubroy List<AppWidgetProviderInfo> providers = sService.getInstalledProviders(); 5495d1409191ea8d76268ddc4cd14759ad0d6a3c180Patrick Dubroy for (AppWidgetProviderInfo info : providers) { 5505d1409191ea8d76268ddc4cd14759ad0d6a3c180Patrick Dubroy // Converting complex to dp. 5515d1409191ea8d76268ddc4cd14759ad0d6a3c180Patrick Dubroy info.minWidth = 5525d1409191ea8d76268ddc4cd14759ad0d6a3c180Patrick Dubroy TypedValue.complexToDimensionPixelSize(info.minWidth, mDisplayMetrics); 5535d1409191ea8d76268ddc4cd14759ad0d6a3c180Patrick Dubroy info.minHeight = 5545d1409191ea8d76268ddc4cd14759ad0d6a3c180Patrick Dubroy TypedValue.complexToDimensionPixelSize(info.minHeight, mDisplayMetrics); 555324afba161ae5b802e38f89c9015d8306ea3ddd1Adam Cohen info.minResizeWidth = 556324afba161ae5b802e38f89c9015d8306ea3ddd1Adam Cohen TypedValue.complexToDimensionPixelSize(info.minResizeWidth, mDisplayMetrics); 557324afba161ae5b802e38f89c9015d8306ea3ddd1Adam Cohen info.minResizeHeight = 558324afba161ae5b802e38f89c9015d8306ea3ddd1Adam Cohen TypedValue.complexToDimensionPixelSize(info.minResizeHeight, mDisplayMetrics); 5595d1409191ea8d76268ddc4cd14759ad0d6a3c180Patrick Dubroy } 5605d1409191ea8d76268ddc4cd14759ad0d6a3c180Patrick Dubroy return providers; 561c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 562c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project catch (RemoteException e) { 563c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project throw new RuntimeException("system server dead?", e); 564c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 565c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 566c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 567c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project /** 568c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Get the available info about the AppWidget. 569c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * 570c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * @return A appWidgetId. If the appWidgetId has not been bound to a provider yet, or 571c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * you don't have access to that appWidgetId, null is returned. 572c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 573c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project public AppWidgetProviderInfo getAppWidgetInfo(int appWidgetId) { 574c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project try { 5758f25c426b118c35f558cbf27bd413e1eb6d59823Mitsuru Oshima AppWidgetProviderInfo info = sService.getAppWidgetInfo(appWidgetId); 5768f25c426b118c35f558cbf27bd413e1eb6d59823Mitsuru Oshima if (info != null) { 5778f25c426b118c35f558cbf27bd413e1eb6d59823Mitsuru Oshima // Converting complex to dp. 57810c543da2f407d7a4e2a6fa0375e39ec0d232233Christian Mehlmauer info.minWidth = 5798f25c426b118c35f558cbf27bd413e1eb6d59823Mitsuru Oshima TypedValue.complexToDimensionPixelSize(info.minWidth, mDisplayMetrics); 5808f25c426b118c35f558cbf27bd413e1eb6d59823Mitsuru Oshima info.minHeight = 5818f25c426b118c35f558cbf27bd413e1eb6d59823Mitsuru Oshima TypedValue.complexToDimensionPixelSize(info.minHeight, mDisplayMetrics); 582324afba161ae5b802e38f89c9015d8306ea3ddd1Adam Cohen info.minResizeWidth = 583324afba161ae5b802e38f89c9015d8306ea3ddd1Adam Cohen TypedValue.complexToDimensionPixelSize(info.minResizeWidth, mDisplayMetrics); 584324afba161ae5b802e38f89c9015d8306ea3ddd1Adam Cohen info.minResizeHeight = 585324afba161ae5b802e38f89c9015d8306ea3ddd1Adam Cohen TypedValue.complexToDimensionPixelSize(info.minResizeHeight, mDisplayMetrics); 5868f25c426b118c35f558cbf27bd413e1eb6d59823Mitsuru Oshima } 5878f25c426b118c35f558cbf27bd413e1eb6d59823Mitsuru Oshima return info; 588c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 589c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project catch (RemoteException e) { 590c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project throw new RuntimeException("system server dead?", e); 591c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 592c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 593c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 594c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project /** 595c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Set the component for a given appWidgetId. 596c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * 59761a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * <p class="note">You need the BIND_APPWIDGET permission or the user must have enabled binding 59861a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * widgets always for your component. This method is used by the AppWidget picker and 59961a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * should not be used by other apps. 600c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * 601c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * @param appWidgetId The AppWidget instance for which to set the RemoteViews. 602c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * @param provider The {@link android.content.BroadcastReceiver} that will be the AppWidget 603c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * provider for this AppWidget. 60461a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * @hide 605c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 606c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project public void bindAppWidgetId(int appWidgetId, ComponentName provider) { 607c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project try { 6080aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen sService.bindAppWidgetId(appWidgetId, provider, null); 6090aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen } 6100aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen catch (RemoteException e) { 6110aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen throw new RuntimeException("system server dead?", e); 6120aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen } 6130aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen } 6140aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen 6150aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen /** 6160aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * Set the component for a given appWidgetId. 6170aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * 6180aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * <p class="note">You need the BIND_APPWIDGET permission or the user must have enabled binding 6190aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * widgets always for your component. This method is used by the AppWidget picker and 6200aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * should not be used by other apps. 6210aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * 6220aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * @param appWidgetId The AppWidget instance for which to set the RemoteViews. 6230aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * @param provider The {@link android.content.BroadcastReceiver} that will be the AppWidget 6240aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * provider for this AppWidget. 6250aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * @param options Bundle containing options for the AppWidget. See also 6260aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * {@link #updateAppWidgetOptions(int, Bundle)} 6270aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * 6280aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * @hide 6290aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen */ 6300aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen public void bindAppWidgetId(int appWidgetId, ComponentName provider, Bundle options) { 6310aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen try { 6320aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen sService.bindAppWidgetId(appWidgetId, provider, options); 633c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 634c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project catch (RemoteException e) { 635c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project throw new RuntimeException("system server dead?", e); 636c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 637c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 638c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 639c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project /** 64061a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * Set the component for a given appWidgetId. 64161a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * 64261a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * <p class="note">You need the BIND_APPWIDGET permission or the user must have enabled binding 64361a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * widgets always for your component. Should be used by apps that host widgets; if this 64461a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * method returns false, call {@link #ACTION_APPWIDGET_BIND} to request permission to 64561a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * bind 64661a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * 64761a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * @param appWidgetId The AppWidget instance for which to set the RemoteViews. 64861a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * @param provider The {@link android.content.BroadcastReceiver} that will be the AppWidget 64961a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * provider for this AppWidget. 65061a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * @return true if this component has permission to bind the AppWidget 65161a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka */ 65261a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka public boolean bindAppWidgetIdIfAllowed(int appWidgetId, ComponentName provider) { 65361a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka if (mContext == null) { 65461a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka return false; 65561a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka } 65661a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka try { 65761a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka return sService.bindAppWidgetIdIfAllowed( 6580aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen mContext.getPackageName(), appWidgetId, provider, null); 6590aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen } 6600aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen catch (RemoteException e) { 6610aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen throw new RuntimeException("system server dead?", e); 6620aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen } 6630aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen } 6640aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen 6650aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen /** 6660aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * Set the component for a given appWidgetId. 6670aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * 6680aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * <p class="note">You need the BIND_APPWIDGET permission or the user must have enabled binding 6690aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * widgets always for your component. Should be used by apps that host widgets; if this 6700aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * method returns false, call {@link #ACTION_APPWIDGET_BIND} to request permission to 6710aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * bind 6720aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * 6730aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * @param appWidgetId The AppWidget instance for which to set the RemoteViews. 6740aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * @param provider The {@link android.content.BroadcastReceiver} that will be the AppWidget 6750aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * provider for this AppWidget. 6760aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * @param options Bundle containing options for the AppWidget. See also 6770aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * {@link #updateAppWidgetOptions(int, Bundle)} 6780aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * 6790aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen * @return true if this component has permission to bind the AppWidget 6800aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen */ 6810aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen public boolean bindAppWidgetIdIfAllowed(int appWidgetId, ComponentName provider, 6820aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen Bundle options) { 6830aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen if (mContext == null) { 6840aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen return false; 6850aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen } 6860aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen try { 6870aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen return sService.bindAppWidgetIdIfAllowed( 6880aa2d42e87e4a1ed5b83f356690e465d6a3587ccAdam Cohen mContext.getPackageName(), appWidgetId, provider, options); 68961a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka } 69061a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka catch (RemoteException e) { 69161a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka throw new RuntimeException("system server dead?", e); 69261a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka } 69361a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka } 69461a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka 69561a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka /** 69661a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * Query if a given package was granted permission by the user to bind app widgets 69761a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * 69861a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * <p class="note">You need the MODIFY_APPWIDGET_BIND_PERMISSIONS permission 69961a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * 70061a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * @param packageName The package for which the permission is being queried 70161a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * @return true if the package was granted permission by the user to bind app widgets 70261a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * @hide 70361a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka */ 70461a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka public boolean hasBindAppWidgetPermission(String packageName) { 70561a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka try { 70661a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka return sService.hasBindAppWidgetPermission(packageName); 70761a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka } 70861a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka catch (RemoteException e) { 70961a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka throw new RuntimeException("system server dead?", e); 71061a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka } 71161a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka } 71261a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka 71361a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka /** 71461a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * Changes any user-granted permission for the given package to bind app widgets 71561a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * 71661a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * <p class="note">You need the MODIFY_APPWIDGET_BIND_PERMISSIONS permission 71761a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * 71861a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * @param provider The package whose permission is being changed 71961a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * @param permission Whether to give the package permission to bind widgets 72061a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka * @hide 72161a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka */ 72261a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka public void setBindAppWidgetPermission(String packageName, boolean permission) { 72361a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka try { 72461a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka sService.setBindAppWidgetPermission(packageName, permission); 72561a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka } 72661a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka catch (RemoteException e) { 72761a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka throw new RuntimeException("system server dead?", e); 72861a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka } 72961a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka } 73061a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka 73161a5b0160d9f2e53ef4d4b451212a63032dad32dMichael Jurka /** 73281f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * Binds the RemoteViewsService for a given appWidgetId and intent. 73381f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * 73481f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * The appWidgetId specified must already be bound to the calling AppWidgetHost via 73581f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * {@link android.appwidget.AppWidgetManager#bindAppWidgetId AppWidgetManager.bindAppWidgetId()}. 73681f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * 73781f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * @param appWidgetId The AppWidget instance for which to bind the RemoteViewsService. 73881f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * @param intent The intent of the service which will be providing the data to the 73981f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * RemoteViewsAdapter. 74081f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * @param connection The callback interface to be notified when a connection is made or lost. 74181f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * @hide 74281f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung */ 74381f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung public void bindRemoteViewsService(int appWidgetId, Intent intent, IBinder connection) { 74481f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung try { 74581f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung sService.bindRemoteViewsService(appWidgetId, intent, connection); 74681f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung } 74781f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung catch (RemoteException e) { 74881f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung throw new RuntimeException("system server dead?", e); 74981f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung } 75081f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung } 75181f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung 75281f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung /** 75381f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * Unbinds the RemoteViewsService for a given appWidgetId and intent. 75481f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * 75581f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * The appWidgetId specified muse already be bound to the calling AppWidgetHost via 75681f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * {@link android.appwidget.AppWidgetManager#bindAppWidgetId AppWidgetManager.bindAppWidgetId()}. 75781f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * 75881f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * @param appWidgetId The AppWidget instance for which to bind the RemoteViewsService. 75981f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * @param intent The intent of the service which will be providing the data to the 76081f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * RemoteViewsAdapter. 76181f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * @hide 76281f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung */ 76381f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung public void unbindRemoteViewsService(int appWidgetId, Intent intent) { 76481f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung try { 76581f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung sService.unbindRemoteViewsService(appWidgetId, intent); 76681f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung } 76781f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung catch (RemoteException e) { 76881f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung throw new RuntimeException("system server dead?", e); 76981f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung } 77081f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung } 77181f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung 77281f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung /** 773c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * Get the list of appWidgetIds that have been bound to the given AppWidget 774c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * provider. 77510c543da2f407d7a4e2a6fa0375e39ec0d232233Christian Mehlmauer * 776c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * @param provider The {@link android.content.BroadcastReceiver} that is the 777c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project * AppWidget provider to find appWidgetIds for. 778c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project */ 779c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project public int[] getAppWidgetIds(ComponentName provider) { 780c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project try { 781c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project return sService.getAppWidgetIds(provider); 782c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 783c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project catch (RemoteException e) { 784c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project throw new RuntimeException("system server dead?", e); 785c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 786c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project } 787c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project} 788c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project 789