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