RemoteViews.java revision 5d20064651b9947a4573c9a0eefec90f66eb1b59
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.widget; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chungimport android.app.ActivityOptions; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.PendingIntent; 211480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohenimport android.appwidget.AppWidgetHostView; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 23fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackbornimport android.content.Intent; 24fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackbornimport android.content.IntentSender; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException; 265d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohenimport android.content.res.Configuration; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PorterDuff; 297597065d6b0877ffc460b443fdb1595965ccd7b2Joe Onoratoimport android.graphics.Rect; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 32d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringertimport android.os.Bundle; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater; 38dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chungimport android.view.LayoutInflater.Filter; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.RemotableViewMethod; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View.OnClickListener; 42dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chungimport android.view.ViewGroup; 43a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohenimport android.widget.AdapterView.OnItemClickListener; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 45dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chungimport java.lang.annotation.ElementType; 46dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chungimport java.lang.annotation.Retention; 47dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chungimport java.lang.annotation.RetentionPolicy; 48dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chungimport java.lang.annotation.Target; 49dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chungimport java.lang.reflect.Method; 50dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chungimport java.util.ArrayList; 51dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A class that describes a view hierarchy that can be displayed in 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * another process. The hierarchy is inflated from a layout resource 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * file, and this class provides some basic operations for modifying 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the content of the inflated hierarchy. 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class RemoteViews implements Parcelable, Filter { 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String LOG_TAG = "RemoteViews"; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6481f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * The intent extra that contains the appWidgetId. 6581f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * @hide 6681f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung */ 6781f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung static final String EXTRA_REMOTEADAPTER_APPWIDGET_ID = "remoteAdapterAppWidgetId"; 6881f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung 6981f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung /** 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The package name of the package containing the layout 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resource. (Added to the parcel) 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 733030193dc179b3010f2dd3bffe9c1dec54da38fcGilles Debunne private final String mPackage; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The resource ID of the layout file. (Added to the parcel) 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 783030193dc179b3010f2dd3bffe9c1dec54da38fcGilles Debunne private final int mLayoutId; 79a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An array of actions to perform on the view tree once it has been 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inflated 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ArrayList<Action> mActions; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 863ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung /** 873ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung * A class to keep track of memory usage by this RemoteViews 883ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung */ 893ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung private MemoryUsageCounter mMemoryUsageCounter; 903ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 915d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen /** 925d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * Maps bitmaps to unique indicies to avoid Bitmap duplication. 935d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen */ 945d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private BitmapCache mBitmapCache; 955d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 965d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen /** 975d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * Indicates whether or not this RemoteViews object is contained as a child of any other 985d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * RemoteViews. 995d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen */ 1005d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private boolean mIsRoot = true; 1015d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 1025d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen /** 1035d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * Constants to whether or not this RemoteViews is composed of a landscape and portrait 1045d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * RemoteViews. 1055d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen */ 1065d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private static final int MODE_NORMAL = 0; 1075d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private static final int MODE_HAS_LANDSCAPE_AND_PORTRAIT = 1; 1085d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 1095d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen /** 1105d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * Used in conjunction with the special constructor 1115d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * {@link #RemoteViews(RemoteViews, RemoteViews)} to keep track of the landscape and portrait 1125d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * RemoteViews. 1135d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen */ 1145d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private RemoteViews mLandscape = null; 1155d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private RemoteViews mPortrait = null; 1165d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 118ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * This flag indicates whether this RemoteViews object is being created from a 119ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * RemoteViewsService for use as a child of a widget collection. This flag is used 120ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * to determine whether or not certain features are available, in particular, 121ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * setting on click extras and setting on click pending intents. The former is enabled, 122ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * and the latter disabled when this flag is true. 123ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen */ 124ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen private boolean mIsWidgetCollectionChild = false; 125ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 126ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen /** 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This annotation indicates that a subclass of View is alllowed to be used 128a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy * with the {@link RemoteViews} mechanism. 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Target({ ElementType.TYPE }) 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Retention(RetentionPolicy.RUNTIME) 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public @interface RemoteView { 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Exception to send when something goes wrong executing an action 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class ActionException extends RuntimeException { 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ActionException(Exception ex) { 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(ex); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ActionException(String message) { 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(message); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 147a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class for all actions that can be performed on an 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inflated view. 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15218e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato * SUBCLASSES MUST BE IMMUTABLE SO CLONE WORKS!!!!! 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private abstract static class Action implements Parcelable { 155037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public abstract void apply(View root, ViewGroup rootParent) throws ActionException; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1603ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 1613ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung /** 1623ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung * Overridden by each class to report on it's own memory usage 1633ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung */ 1643ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung public void updateMemoryUsageEstimate(MemoryUsageCounter counter) { 1653ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // We currently only calculate Bitmap memory usage, so by default, don't do anything 1663ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // here 1673ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung return; 1683ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 169ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung 170dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung protected boolean startIntentSafely(View view, PendingIntent pendingIntent, 171ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung Intent fillInIntent) { 172ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung try { 173ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung // TODO: Unregister this handler if PendingIntent.FLAG_ONE_SHOT? 174dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung Context context = view.getContext(); 175dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung ActivityOptions opts = ActivityOptions.makeScaleUpAnimation(view, 176dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung 0, 0, 177dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung view.getMeasuredWidth(), view.getMeasuredHeight()); 178ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung context.startIntentSender( 179ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung pendingIntent.getIntentSender(), fillInIntent, 180ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung Intent.FLAG_ACTIVITY_NEW_TASK, 181dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung Intent.FLAG_ACTIVITY_NEW_TASK, 0, opts.toBundle()); 182ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung } catch (IntentSender.SendIntentException e) { 183ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung android.util.Log.e(LOG_TAG, "Cannot send pending intent: ", e); 184ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung return false; 185ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung } catch (Exception e) { 186ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung android.util.Log.e(LOG_TAG, "Cannot send pending intent due to " + 187ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung "unknown exception: ", e); 188ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung return false; 189ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung } 190ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung return true; 191ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung } 1925d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 1935d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public void setBitmapCache(BitmapCache bitmapCache) { 1945d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // Do nothing 1955d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 196a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy } 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1981480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen private class SetEmptyView extends Action { 1991480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen int viewId; 2001480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen int emptyViewId; 2011480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 2021480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen public final static int TAG = 6; 2031480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 2041480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen SetEmptyView(int viewId, int emptyViewId) { 2051480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen this.viewId = viewId; 2061480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen this.emptyViewId = emptyViewId; 2071480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 2081480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 2091480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen SetEmptyView(Parcel in) { 2101480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen this.viewId = in.readInt(); 2111480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen this.emptyViewId = in.readInt(); 2121480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 2131480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 2141480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen public void writeToParcel(Parcel out, int flags) { 2151480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen out.writeInt(TAG); 2161480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen out.writeInt(this.viewId); 2171480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen out.writeInt(this.emptyViewId); 2181480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 2191480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 2201480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen @Override 221037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public void apply(View root, ViewGroup rootParent) { 2221480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen final View view = root.findViewById(viewId); 2231480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen if (!(view instanceof AdapterView<?>)) return; 2241480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 2251480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen AdapterView<?> adapterView = (AdapterView<?>) view; 2261480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 2271480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen final View emptyView = root.findViewById(emptyViewId); 2281480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen if (emptyView == null) return; 2291480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 2301480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen adapterView.setEmptyView(emptyView); 2311480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 2321480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 2331480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 23435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen private class SetOnClickFillInIntent extends Action { 23535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen public SetOnClickFillInIntent(int id, Intent fillInIntent) { 23635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen this.viewId = id; 23735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen this.fillInIntent = fillInIntent; 23835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 23935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 24035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen public SetOnClickFillInIntent(Parcel parcel) { 24135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen viewId = parcel.readInt(); 24235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen fillInIntent = Intent.CREATOR.createFromParcel(parcel); 24335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 24435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 24535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen public void writeToParcel(Parcel dest, int flags) { 24635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen dest.writeInt(TAG); 24735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen dest.writeInt(viewId); 24835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen fillInIntent.writeToParcel(dest, 0 /* no flags */); 24935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 25035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 25135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen @Override 252037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public void apply(View root, ViewGroup rootParent) { 25335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen final View target = root.findViewById(viewId); 2542b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (target == null) return; 25535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 25635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen if (!mIsWidgetCollectionChild) { 25735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen Log.e("RemoteViews", "The method setOnClickFillInIntent is available " + 25835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen "only from RemoteViewsFactory (ie. on collection items)."); 25935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen return; 26035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 261a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen if (target == root) { 262a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen target.setTagInternal(com.android.internal.R.id.fillInIntent, fillInIntent); 263a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen } else if (target != null && fillInIntent != null) { 26435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen OnClickListener listener = new OnClickListener() { 26535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen public void onClick(View v) { 26635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen // Insure that this view is a child of an AdapterView 26735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen View parent = (View) v.getParent(); 26835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen while (!(parent instanceof AdapterView<?>) 26935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen && !(parent instanceof AppWidgetHostView)) { 27035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen parent = (View) parent.getParent(); 27135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 27235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 27335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen if (parent instanceof AppWidgetHostView) { 27435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen // Somehow they've managed to get this far without having 27535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen // and AdapterView as a parent. 27635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen Log.e("RemoteViews", "Collection item doesn't have AdapterView parent"); 27735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen return; 27835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 27935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 28035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen // Insure that a template pending intent has been set on an ancestor 28135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen if (!(parent.getTag() instanceof PendingIntent)) { 28235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen Log.e("RemoteViews", "Attempting setOnClickFillInIntent without" + 283a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen " calling setPendingIntentTemplate on parent."); 28435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen return; 28535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 28635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 28735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen PendingIntent pendingIntent = (PendingIntent) parent.getTag(); 28835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 28935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen final float appScale = v.getContext().getResources() 290a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen .getCompatibilityInfo().applicationScale; 29135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen final int[] pos = new int[2]; 29235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen v.getLocationOnScreen(pos); 29335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 29435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen final Rect rect = new Rect(); 29535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen rect.left = (int) (pos[0] * appScale + 0.5f); 29635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen rect.top = (int) (pos[1] * appScale + 0.5f); 29735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen rect.right = (int) ((pos[0] + v.getWidth()) * appScale + 0.5f); 29835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen rect.bottom = (int) ((pos[1] + v.getHeight()) * appScale + 0.5f); 29935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 30035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen fillInIntent.setSourceBounds(rect); 301dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung startIntentSafely(v, pendingIntent, fillInIntent); 30235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 30335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 30435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen }; 30535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen target.setOnClickListener(listener); 30635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 30735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 30835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 30935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen int viewId; 31035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen Intent fillInIntent; 31135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 31235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen public final static int TAG = 9; 31335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 31435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 315ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen private class SetPendingIntentTemplate extends Action { 316ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen public SetPendingIntentTemplate(int id, PendingIntent pendingIntentTemplate) { 317ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen this.viewId = id; 318ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen this.pendingIntentTemplate = pendingIntentTemplate; 319ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 320ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 321ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen public SetPendingIntentTemplate(Parcel parcel) { 322ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen viewId = parcel.readInt(); 323ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen pendingIntentTemplate = PendingIntent.readPendingIntentOrNullFromParcel(parcel); 324ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 325ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 326ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen public void writeToParcel(Parcel dest, int flags) { 327ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen dest.writeInt(TAG); 328ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen dest.writeInt(viewId); 329ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen pendingIntentTemplate.writeToParcel(dest, 0 /* no flags */); 330ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 331ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 332ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen @Override 333037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public void apply(View root, ViewGroup rootParent) { 334ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen final View target = root.findViewById(viewId); 3352b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (target == null) return; 336ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 337ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen // If the view isn't an AdapterView, setting a PendingIntent template doesn't make sense 338ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen if (target instanceof AdapterView<?>) { 339a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen AdapterView<?> av = (AdapterView<?>) target; 340ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen // The PendingIntent template is stored in the view's tag. 341a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen OnItemClickListener listener = new OnItemClickListener() { 342a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen public void onItemClick(AdapterView<?> parent, View view, 343a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen int position, long id) { 344a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen // The view should be a frame layout 345a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen if (view instanceof ViewGroup) { 346a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen ViewGroup vg = (ViewGroup) view; 347a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen 348a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen // AdapterViews contain their children in a frame 349a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen // so we need to go one layer deeper here. 350a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen if (parent instanceof AdapterViewAnimator) { 351a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen vg = (ViewGroup) vg.getChildAt(0); 352a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen } 353a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen if (vg == null) return; 354a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen 355a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen Intent fillInIntent = null; 356a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen int childCount = vg.getChildCount(); 357a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen for (int i = 0; i < childCount; i++) { 358a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen Object tag = vg.getChildAt(i).getTag(com.android.internal.R.id.fillInIntent); 359a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen if (tag instanceof Intent) { 360a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen fillInIntent = (Intent) tag; 361a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen break; 362a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen } 363a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen } 364a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen if (fillInIntent == null) return; 365a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen 366a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen final float appScale = view.getContext().getResources() 367a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen .getCompatibilityInfo().applicationScale; 368a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen final int[] pos = new int[2]; 369a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen view.getLocationOnScreen(pos); 370a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen 371a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen final Rect rect = new Rect(); 372a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen rect.left = (int) (pos[0] * appScale + 0.5f); 373a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen rect.top = (int) (pos[1] * appScale + 0.5f); 374a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen rect.right = (int) ((pos[0] + view.getWidth()) * appScale + 0.5f); 375a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen rect.bottom = (int) ((pos[1] + view.getHeight()) * appScale + 0.5f); 376a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen 377a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen final Intent intent = new Intent(); 378a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen intent.setSourceBounds(rect); 379dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung startIntentSafely(view, pendingIntentTemplate, fillInIntent); 380a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen } 381a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen } 382a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen }; 383a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen av.setOnItemClickListener(listener); 384a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen av.setTag(pendingIntentTemplate); 385ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } else { 386ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen Log.e("RemoteViews", "Cannot setPendingIntentTemplate on a view which is not" + 38735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen "an AdapterView (id: " + viewId + ")"); 388ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen return; 389ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 390ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 391ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 392ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen int viewId; 393ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen PendingIntent pendingIntentTemplate; 394ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 395ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen public final static int TAG = 8; 396ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 397ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 398037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung private class SetRemoteViewsAdapterIntent extends Action { 399037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public SetRemoteViewsAdapterIntent(int id, Intent intent) { 400037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung this.viewId = id; 401037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung this.intent = intent; 402037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 403037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 404037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public SetRemoteViewsAdapterIntent(Parcel parcel) { 405037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung viewId = parcel.readInt(); 406037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung intent = Intent.CREATOR.createFromParcel(parcel); 407037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 408037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 409037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public void writeToParcel(Parcel dest, int flags) { 410037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung dest.writeInt(TAG); 411037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung dest.writeInt(viewId); 412037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung intent.writeToParcel(dest, flags); 413037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 414037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 415037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung @Override 416037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public void apply(View root, ViewGroup rootParent) { 417037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung final View target = root.findViewById(viewId); 418037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung if (target == null) return; 419037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 420037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung // Ensure that we are applying to an AppWidget root 421037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung if (!(rootParent instanceof AppWidgetHostView)) { 422037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung Log.e("RemoteViews", "SetRemoteViewsAdapterIntent action can only be used for " + 423037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung "AppWidgets (root id: " + viewId + ")"); 424037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung return; 425037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 426037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung // Ensure that we are calling setRemoteAdapter on an AdapterView that supports it 427037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung if (!(target instanceof AbsListView) && !(target instanceof AdapterViewAnimator)) { 428037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung Log.e("RemoteViews", "Cannot setRemoteViewsAdapter on a view which is not " + 429037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung "an AbsListView or AdapterViewAnimator (id: " + viewId + ")"); 430037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung return; 431037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 432037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 433037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung // Embed the AppWidget Id for use in RemoteViewsAdapter when connecting to the intent 434037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung // RemoteViewsService 435037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung AppWidgetHostView host = (AppWidgetHostView) rootParent; 436037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung intent.putExtra(EXTRA_REMOTEADAPTER_APPWIDGET_ID, host.getAppWidgetId()); 437037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung if (target instanceof AbsListView) { 438037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung AbsListView v = (AbsListView) target; 439037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung v.setRemoteViewsAdapter(intent); 440037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } else if (target instanceof AdapterViewAnimator) { 441037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung AdapterViewAnimator v = (AdapterViewAnimator) target; 442037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung v.setRemoteViewsAdapter(intent); 443037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 444037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 445037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 446037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung int viewId; 447037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung Intent intent; 448037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 449037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public final static int TAG = 10; 450037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 451037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.View#setOnClickListener(android.view.View.OnClickListener)} 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to launch the provided {@link PendingIntent}. 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class SetOnClickPendingIntent extends Action { 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SetOnClickPendingIntent(int id, PendingIntent pendingIntent) { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.viewId = id; 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.pendingIntent = pendingIntent; 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 462ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SetOnClickPendingIntent(Parcel parcel) { 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project viewId = parcel.readInt(); 465c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen 466c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // We check a flag to determine if the parcel contains a PendingIntent. 467c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (parcel.readInt() != 0) { 468c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen pendingIntent = PendingIntent.readPendingIntentOrNullFromParcel(parcel); 469c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 471ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(TAG); 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(viewId); 475c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen 476c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // We use a flag to indicate whether the parcel contains a valid object. 477c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen dest.writeInt(pendingIntent != null ? 1 : 0); 478c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (pendingIntent != null) { 479c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen pendingIntent.writeToParcel(dest, 0 /* no flags */); 480c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 482ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 484037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public void apply(View root, ViewGroup rootParent) { 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View target = root.findViewById(viewId); 4862b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (target == null) return; 487ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 488ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen // If the view is an AdapterView, setting a PendingIntent on click doesn't make much 489ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen // sense, do they mean to set a PendingIntent template for the AdapterView's children? 490ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen if (mIsWidgetCollectionChild) { 49135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen Log.e("RemoteViews", "Cannot setOnClickPendingIntent for collection item " + 492c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen "(id: " + viewId + ")"); 493ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen // TODO: return; We'll let this slide until apps are up to date. 494ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 495ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 496c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (target != null) { 497c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // If the pendingIntent is null, we clear the onClickListener 498c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen OnClickListener listener = null; 499c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (pendingIntent != null) { 500c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen listener = new OnClickListener() { 501c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen public void onClick(View v) { 502c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // Find target view location in screen coordinates and 503c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // fill into PendingIntent before sending. 504c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen final float appScale = v.getContext().getResources() 505c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen .getCompatibilityInfo().applicationScale; 506c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen final int[] pos = new int[2]; 507c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen v.getLocationOnScreen(pos); 508c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen 509c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen final Rect rect = new Rect(); 510c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen rect.left = (int) (pos[0] * appScale + 0.5f); 511c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen rect.top = (int) (pos[1] * appScale + 0.5f); 512c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen rect.right = (int) ((pos[0] + v.getWidth()) * appScale + 0.5f); 513c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen rect.bottom = (int) ((pos[1] + v.getHeight()) * appScale + 0.5f); 514c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen 515c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen final Intent intent = new Intent(); 516c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen intent.setSourceBounds(rect); 517dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung startIntentSafely(v, pendingIntent, intent); 518c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 519c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen }; 520c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project target.setOnClickListener(listener); 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 524c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int viewId; 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PendingIntent pendingIntent; 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static int TAG = 1; 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling a combination of {@link Drawable#setAlpha(int)}, 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Drawable#setColorFilter(int, android.graphics.PorterDuff.Mode)}, 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and/or {@link Drawable#setLevel(int)} on the {@link Drawable} of a given view. 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These operations will be performed on the {@link Drawable} returned by the 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * target {@link View#getBackground()} by default. If targetBackground is false, 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * we assume the target is an {@link ImageView} and try applying the operations 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to {@link ImageView#getDrawable()}. 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You can omit specific calls by marking their values with null or -1. 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class SetDrawableParameters extends Action { 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SetDrawableParameters(int id, boolean targetBackground, int alpha, 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int colorFilter, PorterDuff.Mode mode, int level) { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.viewId = id; 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.targetBackground = targetBackground; 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.alpha = alpha; 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.colorFilter = colorFilter; 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.filterMode = mode; 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.level = level; 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SetDrawableParameters(Parcel parcel) { 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project viewId = parcel.readInt(); 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetBackground = parcel.readInt() != 0; 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project alpha = parcel.readInt(); 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project colorFilter = parcel.readInt(); 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasMode = parcel.readInt() != 0; 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasMode) { 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filterMode = PorterDuff.Mode.valueOf(parcel.readString()); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filterMode = null; 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project level = parcel.readInt(); 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(TAG); 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(viewId); 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(targetBackground ? 1 : 0); 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(alpha); 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(colorFilter); 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (filterMode != null) { 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(1); 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(filterMode.toString()); 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(0); 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(level); 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 584037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public void apply(View root, ViewGroup rootParent) { 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View target = root.findViewById(viewId); 5862b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (target == null) return; 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Pick the correct drawable to modify for this view 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable targetDrawable = null; 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (targetBackground) { 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetDrawable = target.getBackground(); 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (target instanceof ImageView) { 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ImageView imageView = (ImageView) target; 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetDrawable = imageView.getDrawable(); 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 597a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy if (targetDrawable != null) { 598a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy // Perform modifications only if values are set correctly 599a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy if (alpha != -1) { 600a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy targetDrawable.setAlpha(alpha); 601a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy } 602a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy if (colorFilter != -1 && filterMode != null) { 603a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy targetDrawable.setColorFilter(colorFilter, filterMode); 604a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy } 605a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy if (level != -1) { 606a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy targetDrawable.setLevel(level); 607a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy } 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6103ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int viewId; 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean targetBackground; 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int alpha; 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int colorFilter; 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PorterDuff.Mode filterMode; 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int level; 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static int TAG = 3; 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6212dd2197805edb4d9547b143deef2226413218f4cAdam Cohen private class ReflectionActionWithoutParams extends Action { 6222dd2197805edb4d9547b143deef2226413218f4cAdam Cohen int viewId; 6232dd2197805edb4d9547b143deef2226413218f4cAdam Cohen String methodName; 6242dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 6252dd2197805edb4d9547b143deef2226413218f4cAdam Cohen public final static int TAG = 5; 6262dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 6272dd2197805edb4d9547b143deef2226413218f4cAdam Cohen ReflectionActionWithoutParams(int viewId, String methodName) { 6282dd2197805edb4d9547b143deef2226413218f4cAdam Cohen this.viewId = viewId; 6292dd2197805edb4d9547b143deef2226413218f4cAdam Cohen this.methodName = methodName; 6302dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6312dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 6322dd2197805edb4d9547b143deef2226413218f4cAdam Cohen ReflectionActionWithoutParams(Parcel in) { 6332dd2197805edb4d9547b143deef2226413218f4cAdam Cohen this.viewId = in.readInt(); 6342dd2197805edb4d9547b143deef2226413218f4cAdam Cohen this.methodName = in.readString(); 6352dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6362dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 6372dd2197805edb4d9547b143deef2226413218f4cAdam Cohen public void writeToParcel(Parcel out, int flags) { 6382dd2197805edb4d9547b143deef2226413218f4cAdam Cohen out.writeInt(TAG); 6392dd2197805edb4d9547b143deef2226413218f4cAdam Cohen out.writeInt(this.viewId); 6402dd2197805edb4d9547b143deef2226413218f4cAdam Cohen out.writeString(this.methodName); 6412dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6422dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 6432dd2197805edb4d9547b143deef2226413218f4cAdam Cohen @Override 644037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public void apply(View root, ViewGroup rootParent) { 6452dd2197805edb4d9547b143deef2226413218f4cAdam Cohen final View view = root.findViewById(viewId); 6462b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (view == null) return; 6472dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 6482dd2197805edb4d9547b143deef2226413218f4cAdam Cohen Class klass = view.getClass(); 6492dd2197805edb4d9547b143deef2226413218f4cAdam Cohen Method method; 6502dd2197805edb4d9547b143deef2226413218f4cAdam Cohen try { 6512dd2197805edb4d9547b143deef2226413218f4cAdam Cohen method = klass.getMethod(this.methodName); 6522dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } catch (NoSuchMethodException ex) { 6532dd2197805edb4d9547b143deef2226413218f4cAdam Cohen throw new ActionException("view: " + klass.getName() + " doesn't have method: " 6542dd2197805edb4d9547b143deef2226413218f4cAdam Cohen + this.methodName + "()"); 6552dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6562dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 6572dd2197805edb4d9547b143deef2226413218f4cAdam Cohen if (!method.isAnnotationPresent(RemotableViewMethod.class)) { 6582dd2197805edb4d9547b143deef2226413218f4cAdam Cohen throw new ActionException("view: " + klass.getName() 6592dd2197805edb4d9547b143deef2226413218f4cAdam Cohen + " can't use method with RemoteViews: " 6602dd2197805edb4d9547b143deef2226413218f4cAdam Cohen + this.methodName + "()"); 6612dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6622dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 6632dd2197805edb4d9547b143deef2226413218f4cAdam Cohen try { 6642dd2197805edb4d9547b143deef2226413218f4cAdam Cohen //noinspection ConstantIfStatement 6652dd2197805edb4d9547b143deef2226413218f4cAdam Cohen if (false) { 6662dd2197805edb4d9547b143deef2226413218f4cAdam Cohen Log.d("RemoteViews", "view: " + klass.getName() + " calling method: " 6672dd2197805edb4d9547b143deef2226413218f4cAdam Cohen + this.methodName + "()"); 6682dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6692dd2197805edb4d9547b143deef2226413218f4cAdam Cohen method.invoke(view); 6702dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } catch (Exception ex) { 6712dd2197805edb4d9547b143deef2226413218f4cAdam Cohen throw new ActionException(ex); 6722dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6732dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6742dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6752dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 6765d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private static class BitmapCache { 6775d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen ArrayList<Bitmap> mBitmaps; 6785d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 6795d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public BitmapCache() { 6805d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmaps = new ArrayList<Bitmap>(); 6815d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 6825d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 6835d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public BitmapCache(Parcel source) { 6845d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen int count = source.readInt(); 6855d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmaps = new ArrayList<Bitmap>(); 6865d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen for (int i = 0; i < count; i++) { 6875d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen Bitmap b = Bitmap.CREATOR.createFromParcel(source); 6885d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmaps.add(b); 6895d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 6905d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 6915d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 6925d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public int getBitmapId(Bitmap b) { 6935d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (b == null) { 6945d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen return -1; 6955d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } else { 6965d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (mBitmaps.contains(b)) { 6975d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen return mBitmaps.indexOf(b); 6985d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } else { 6995d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmaps.add(b); 7005d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen return (mBitmaps.size() - 1); 7015d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7025d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7035d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7045d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 7055d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public Bitmap getBitmapForId(int id) { 7065d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (id == -1 || id >= mBitmaps.size()) { 7075d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen return null; 7085d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } else { 7095d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen return mBitmaps.get(id); 7105d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7115d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7125d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 7135d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public void writeBitmapsToParcel(Parcel dest, int flags) { 7145d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen int count = mBitmaps.size(); 7155d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeInt(count); 7165d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen for (int i = 0; i < count; i++) { 7175d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmaps.get(i).writeToParcel(dest, flags); 7185d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7195d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7205d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 7215d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public void assimilate(BitmapCache bitmapCache) { 7225d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen ArrayList<Bitmap> bitmapsToBeAdded = bitmapCache.mBitmaps; 7235d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen int count = bitmapsToBeAdded.size(); 7245d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen for (int i = 0; i < count; i++) { 7255d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen Bitmap b = bitmapsToBeAdded.get(i); 7265d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (!mBitmaps.contains(b)) { 7275d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmaps.add(b); 7285d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7295d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7305d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7315d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 7325d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public void addBitmapMemory(MemoryUsageCounter memoryCounter) { 7335d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen for (int i = 0; i < mBitmaps.size(); i++) { 7345d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen memoryCounter.addBitmapMemory(mBitmaps.get(i)); 7355d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7365d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7375d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7385d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 7395d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private class BitmapReflectionAction extends Action { 7405d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen int bitmapId; 7415d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen int viewId; 7425d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen Bitmap bitmap; 7435d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen String methodName; 7445d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 7455d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen BitmapReflectionAction(int viewId, String methodName, Bitmap bitmap) { 7465d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen this.bitmap = bitmap; 7475d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen this.viewId = viewId; 7485d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen this.methodName = methodName; 7495d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen bitmapId = mBitmapCache.getBitmapId(bitmap); 7505d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7515d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 7525d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen BitmapReflectionAction(Parcel in) { 7535d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen viewId = in.readInt(); 7545d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen methodName = in.readString(); 7555d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen bitmapId = in.readInt(); 7565d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen bitmap = mBitmapCache.getBitmapForId(bitmapId); 7575d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7585d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 7595d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen @Override 7605d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public void writeToParcel(Parcel dest, int flags) { 7615d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeInt(TAG); 7625d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeInt(viewId); 7635d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeString(methodName); 7645d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeInt(bitmapId); 7655d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7665d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 7675d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen @Override 7685d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public void apply(View root, ViewGroup rootParent) throws ActionException { 7695d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen ReflectionAction ra = new ReflectionAction(viewId, methodName, ReflectionAction.BITMAP, 7705d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen bitmap); 7715d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen ra.apply(root, rootParent); 7725d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7735d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 7745d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen @Override 7755d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public void setBitmapCache(BitmapCache bitmapCache) { 7765d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen bitmapId = bitmapCache.getBitmapId(bitmap); 7775d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7785d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 7795d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public final static int TAG = 12; 7805d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7815d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class for the reflection actions. 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class ReflectionAction extends Action { 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int TAG = 2; 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int BOOLEAN = 1; 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int BYTE = 2; 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int SHORT = 3; 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int INT = 4; 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int LONG = 5; 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int FLOAT = 6; 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int DOUBLE = 7; 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int CHAR = 8; 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int STRING = 9; 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int CHAR_SEQUENCE = 10; 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int URI = 11; 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int BITMAP = 12; 800d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert static final int BUNDLE = 13; 801499cb9f516062b654952d282f211bee44c31a3c2Winson Chung static final int INTENT = 14; 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int viewId; 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String methodName; 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object value; 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ReflectionAction(int viewId, String methodName, int type, Object value) { 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.viewId = viewId; 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.methodName = methodName; 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.type = type; 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = value; 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ReflectionAction(Parcel in) { 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.viewId = in.readInt(); 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.methodName = in.readString(); 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.type = in.readInt(); 819a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy //noinspection ConstantIfStatement 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d("RemoteViews", "read viewId=0x" + Integer.toHexString(this.viewId) 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " methodName=" + this.methodName + " type=" + this.type); 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 824c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen 825c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // For some values that may have been null, we first check a flag to see if they were 826c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // written to the parcel. 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (this.type) { 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BOOLEAN: 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readInt() != 0; 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BYTE: 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readByte(); 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SHORT: 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = (short)in.readInt(); 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INT: 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readInt(); 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LONG: 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readLong(); 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FLOAT: 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readFloat(); 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DOUBLE: 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readDouble(); 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR: 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = (char)in.readInt(); 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STRING: 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readString(); 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR_SEQUENCE: 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case URI: 859c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (in.readInt() != 0) { 860c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen this.value = Uri.CREATOR.createFromParcel(in); 861c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BITMAP: 864c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (in.readInt() != 0) { 865c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen this.value = Bitmap.CREATOR.createFromParcel(in); 866c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 868d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert case BUNDLE: 869d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert this.value = in.readBundle(); 870d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert break; 871499cb9f516062b654952d282f211bee44c31a3c2Winson Chung case INTENT: 872c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (in.readInt() != 0) { 873c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen this.value = Intent.CREATOR.createFromParcel(in); 874c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 875499cb9f516062b654952d282f211bee44c31a3c2Winson Chung break; 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, int flags) { 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(TAG); 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(this.viewId); 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(this.methodName); 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(this.type); 886a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy //noinspection ConstantIfStatement 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d("RemoteViews", "write viewId=0x" + Integer.toHexString(this.viewId) 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " methodName=" + this.methodName + " type=" + this.type); 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 891c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen 892c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // For some values which are null, we record an integer flag to indicate whether 893c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // we have written a valid value to the parcel. 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (this.type) { 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BOOLEAN: 896a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeInt((Boolean) this.value ? 1 : 0); 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BYTE: 899a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeByte((Byte) this.value); 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SHORT: 902a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeInt((Short) this.value); 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INT: 905a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeInt((Integer) this.value); 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LONG: 908a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeLong((Long) this.value); 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FLOAT: 911a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeFloat((Float) this.value); 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DOUBLE: 914a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeDouble((Double) this.value); 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR: 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt((int)((Character)this.value).charValue()); 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STRING: 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString((String)this.value); 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR_SEQUENCE: 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextUtils.writeToParcel((CharSequence)this.value, out, flags); 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case URI: 926c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen out.writeInt(this.value != null ? 1 : 0); 927c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (this.value != null) { 928c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen ((Uri)this.value).writeToParcel(out, flags); 929c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BITMAP: 932c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen out.writeInt(this.value != null ? 1 : 0); 933c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (this.value != null) { 934c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen ((Bitmap)this.value).writeToParcel(out, flags); 935c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 937d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert case BUNDLE: 938d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert out.writeBundle((Bundle) this.value); 939d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert break; 940499cb9f516062b654952d282f211bee44c31a3c2Winson Chung case INTENT: 941c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen out.writeInt(this.value != null ? 1 : 0); 942c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (this.value != null) { 943c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen ((Intent)this.value).writeToParcel(out, flags); 944c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 945499cb9f516062b654952d282f211bee44c31a3c2Winson Chung break; 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Class getParameterType() { 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (this.type) { 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BOOLEAN: 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return boolean.class; 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BYTE: 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return byte.class; 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SHORT: 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return short.class; 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INT: 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return int.class; 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LONG: 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return long.class; 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FLOAT: 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return float.class; 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DOUBLE: 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return double.class; 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR: 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return char.class; 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STRING: 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return String.class; 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR_SEQUENCE: 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return CharSequence.class; 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case URI: 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Uri.class; 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BITMAP: 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Bitmap.class; 977d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert case BUNDLE: 978d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert return Bundle.class; 979499cb9f516062b654952d282f211bee44c31a3c2Winson Chung case INTENT: 980499cb9f516062b654952d282f211bee44c31a3c2Winson Chung return Intent.class; 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 987037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public void apply(View root, ViewGroup rootParent) { 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View view = root.findViewById(viewId); 9892b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (view == null) return; 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Class param = getParameterType(); 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (param == null) { 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ActionException("bad type: " + this.type); 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Class klass = view.getClass(); 997a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy Method method; 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method = klass.getMethod(this.methodName, getParameterType()); 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (NoSuchMethodException ex) { 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ActionException("view: " + klass.getName() + " doesn't have method: " 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + this.methodName + "(" + param.getName() + ")"); 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!method.isAnnotationPresent(RemotableViewMethod.class)) { 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ActionException("view: " + klass.getName() 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " can't use method with RemoteViews: " 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + this.methodName + "(" + param.getName() + ")"); 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1013a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy //noinspection ConstantIfStatement 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d("RemoteViews", "view: " + klass.getName() + " calling method: " 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + this.methodName + "(" + param.getName() + ") with " 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (this.value == null ? "null" : this.value.getClass().getName())); 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method.invoke(view, this.value); 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (Exception ex) { 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ActionException(ex); 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10253ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 10263ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung @Override 10273ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung public void updateMemoryUsageEstimate(MemoryUsageCounter counter) { 10283ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // We currently only calculate Bitmap memory usage 10293ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung switch (this.type) { 10303ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung case BITMAP: 10313ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung if (this.value != null) { 10323ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung final Bitmap b = (Bitmap) this.value; 10335d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen counter.addBitmapMemory(b); 10343ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 10353ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung break; 10363ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung default: 10373ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung break; 10383ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 10393ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10425d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private void configureRemoteViewsAsChild(RemoteViews rv) { 10435d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmapCache.assimilate(rv.mBitmapCache); 10445d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen rv.setBitmapCache(mBitmapCache); 10455d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen rv.setNotRoot(); 10465d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 10475d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 10485d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen void setNotRoot() { 10495d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mIsRoot = false; 10505d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 10515d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 10521162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey /** 10531162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * Equivalent to calling {@link ViewGroup#addView(View)} after inflating the 10541162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * given {@link RemoteViews}, or calling {@link ViewGroup#removeAllViews()} 10551162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * when null. This allows users to build "nested" {@link RemoteViews}. 10561162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey */ 10571162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey private class ViewGroupAction extends Action { 10581162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public ViewGroupAction(int viewId, RemoteViews nestedViews) { 10591162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey this.viewId = viewId; 10601162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey this.nestedViews = nestedViews; 10615d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen configureRemoteViewsAsChild(nestedViews); 10621162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 10631162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 10645d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public ViewGroupAction(Parcel parcel, BitmapCache bitmapCache) { 10651162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey viewId = parcel.readInt(); 10665d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen boolean nestedViewsNull = parcel.readInt() == 0; 10675d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (!nestedViewsNull) { 10685d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen nestedViews = new RemoteViews(parcel, bitmapCache); 10695d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } else { 10705d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen nestedViews = null; 10715d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 10721162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 10731162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 10741162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public void writeToParcel(Parcel dest, int flags) { 10751162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey dest.writeInt(TAG); 10761162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey dest.writeInt(viewId); 10775d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (nestedViews != null) { 10785d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeInt(1); 10795d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen nestedViews.writeToParcel(dest, flags); 10805d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } else { 10815d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // signifies null 10825d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeInt(0); 10835d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 10841162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 10851162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 10861162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey @Override 1087037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public void apply(View root, ViewGroup rootParent) { 10881162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey final Context context = root.getContext(); 10891162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey final ViewGroup target = (ViewGroup) root.findViewById(viewId); 10902b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (target == null) return; 10911162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey if (nestedViews != null) { 10921162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey // Inflate nested views and add as children 10931162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey target.addView(nestedViews.apply(context, target)); 10942b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato } else { 10951162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey // Clear all children when nested views omitted 10961162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey target.removeAllViews(); 10971162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 10981162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 10991162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 11003ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung @Override 11013ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung public void updateMemoryUsageEstimate(MemoryUsageCounter counter) { 11023ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung if (nestedViews != null) { 11035d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen counter.increment(nestedViews.estimateMemoryUsage()); 11045d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 11055d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 11065d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 11075d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen @Override 11085d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public void setBitmapCache(BitmapCache bitmapCache) { 11095d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (nestedViews != null) { 11105d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen nestedViews.setBitmapCache(bitmapCache); 11113ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 11123ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 11133ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 11141162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey int viewId; 11151162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey RemoteViews nestedViews; 11161162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 11171162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public final static int TAG = 4; 11181162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1121820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * Helper action to set compound drawables on a TextView. Supports relative 1122820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * (s/t/e/b) or cardinal (l/t/r/b) arrangement. 1123820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler */ 1124820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler private class TextViewDrawableAction extends Action { 1125820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler public TextViewDrawableAction(int viewId, boolean isRelative, int d1, int d2, int d3, int d4) { 1126820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler this.viewId = viewId; 1127820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler this.isRelative = isRelative; 1128820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler this.d1 = d1; 1129820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler this.d2 = d2; 1130820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler this.d3 = d3; 1131820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler this.d4 = d4; 1132820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } 1133820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler 1134820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler public TextViewDrawableAction(Parcel parcel) { 1135820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler viewId = parcel.readInt(); 1136820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler isRelative = (parcel.readInt() != 0); 1137820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler d1 = parcel.readInt(); 1138820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler d2 = parcel.readInt(); 1139820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler d3 = parcel.readInt(); 1140820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler d4 = parcel.readInt(); 1141820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } 1142820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler 1143820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler public void writeToParcel(Parcel dest, int flags) { 1144820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler dest.writeInt(TAG); 1145820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler dest.writeInt(viewId); 1146820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler dest.writeInt(isRelative ? 1 : 0); 1147820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler dest.writeInt(d1); 1148820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler dest.writeInt(d2); 1149820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler dest.writeInt(d3); 1150820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler dest.writeInt(d4); 1151820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } 1152820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler 1153820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler @Override 1154820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler public void apply(View root, ViewGroup rootParent) { 1155820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler final Context context = root.getContext(); 1156820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler final TextView target = (TextView) root.findViewById(viewId); 1157820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler if (target == null) return; 1158820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler if (isRelative) { 1159820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler target.setCompoundDrawablesRelativeWithIntrinsicBounds(d1, d2, d3, d4); 1160820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } else { 1161820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler target.setCompoundDrawablesWithIntrinsicBounds(d1, d2, d3, d4); 1162820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } 1163820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } 1164820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler 1165820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler int viewId; 1166820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler boolean isRelative = false; 1167820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler int d1, d2, d3, d4; 1168820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler 1169820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler public final static int TAG = 11; 1170820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } 1171820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler 1172820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler /** 11733ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung * Simple class used to keep track of memory usage in a RemoteViews. 11743ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung * 11753ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung */ 11763ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung private class MemoryUsageCounter { 11773ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung public void clear() { 11785d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mMemoryUsage = 0; 11793ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 11803ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 11815d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public void increment(int numBytes) { 11825d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mMemoryUsage += numBytes; 11833ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 11843ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 11855d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public int getMemoryUsage() { 11865d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen return mMemoryUsage; 11873ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 11883ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 11895d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public void addBitmapMemory(Bitmap b) { 11905d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen final Bitmap.Config c = b.getConfig(); 11915d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // If we don't know, be pessimistic and assume 4 11925d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen int bpp = 4; 11935d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (c != null) { 11945d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen switch (c) { 11955d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case ALPHA_8: 11965d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen bpp = 1; 11975d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 11985d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case RGB_565: 11995d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case ARGB_4444: 12005d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen bpp = 2; 12015d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 12025d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case ARGB_8888: 12035d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen bpp = 4; 12045d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 12055d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 12065d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 12075d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen increment(b.getWidth() * b.getHeight() * bpp); 12085d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 12095d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 12105d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen int mMemoryUsage; 12113ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 12123ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 12133ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung /** 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new RemoteViews object that will display the views contained 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the specified layout file. 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param packageName Name of the package that contains the layout resource 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param layoutId The id of the layout resource 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RemoteViews(String packageName, int layoutId) { 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackage = packageName; 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutId = layoutId; 12235d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmapCache = new BitmapCache(); 12243ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 12253ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // setup the memory usage statistics 12263ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung mMemoryUsageCounter = new MemoryUsageCounter(); 12273ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung recalculateMemoryUsage(); 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12305d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private boolean hasLandscapeAndPortraitLayouts() { 12315d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen return (mLandscape != null) && (mPortrait != null); 12325d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 12335d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 12345d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen /** 12355d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * Create a new RemoteViews object that will inflate as the specified 12365d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * landspace or portrait RemoteViews, depending on the current configuration. 12375d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * 12385d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * @param landscape The RemoteViews to inflate in landscape configuration 12395d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * @param portrait The RemoteViews to inflate in portrait configuration 12405d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen */ 12415d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public RemoteViews(RemoteViews landscape, RemoteViews portrait) { 12425d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (landscape == null || portrait == null) { 12435d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen throw new RuntimeException("Both RemoteViews must be non-null"); 12445d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 12455d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (landscape.getPackage().compareTo(portrait.getPackage()) != 0) { 12465d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen throw new RuntimeException("Both RemoteViews must share the same package"); 12475d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 12485d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mPackage = portrait.getPackage(); 12495d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mLayoutId = portrait.getLayoutId(); 12505d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 12515d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mLandscape = landscape; 12525d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mPortrait = portrait; 12535d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 12545d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // setup the memory usage statistics 12555d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mMemoryUsageCounter = new MemoryUsageCounter(); 12565d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 12575d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmapCache = new BitmapCache(); 12585d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen configureRemoteViewsAsChild(landscape); 12595d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen configureRemoteViewsAsChild(portrait); 12605d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 12615d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen recalculateMemoryUsage(); 12625d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 12635d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reads a RemoteViews object from a parcel. 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parcel 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RemoteViews(Parcel parcel) { 12705d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen this(parcel, null); 12715d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 1272ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 12735d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private RemoteViews(Parcel parcel, BitmapCache bitmapCache) { 12745d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen int mode = parcel.readInt(); 12755d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 12765d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // We only store a bitmap cache in the root of the RemoteViews. 12775d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (bitmapCache == null) { 12785d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmapCache = new BitmapCache(parcel); 12795d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } else { 12805d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen setBitmapCache(bitmapCache); 12815d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen setNotRoot(); 12825d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 12835d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 12845d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (mode == MODE_NORMAL) { 12855d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mPackage = parcel.readString(); 12865d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mLayoutId = parcel.readInt(); 12875d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mIsWidgetCollectionChild = parcel.readInt() == 1 ? true : false; 12885d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 12895d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen int count = parcel.readInt(); 12905d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (count > 0) { 12915d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions = new ArrayList<Action>(count); 12925d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen for (int i=0; i<count; i++) { 12935d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen int tag = parcel.readInt(); 12945d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen switch (tag) { 12955d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case SetOnClickPendingIntent.TAG: 12965d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.add(new SetOnClickPendingIntent(parcel)); 12975d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 12985d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case SetDrawableParameters.TAG: 12995d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.add(new SetDrawableParameters(parcel)); 13005d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 13015d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case ReflectionAction.TAG: 13025d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.add(new ReflectionAction(parcel)); 13035d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 13045d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case ViewGroupAction.TAG: 13055d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.add(new ViewGroupAction(parcel, mBitmapCache)); 13065d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 13075d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case ReflectionActionWithoutParams.TAG: 13085d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.add(new ReflectionActionWithoutParams(parcel)); 13095d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 13105d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case SetEmptyView.TAG: 13115d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.add(new SetEmptyView(parcel)); 13125d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 13135d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case SetPendingIntentTemplate.TAG: 13145d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.add(new SetPendingIntentTemplate(parcel)); 13155d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 13165d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case SetOnClickFillInIntent.TAG: 13175d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.add(new SetOnClickFillInIntent(parcel)); 13185d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 13195d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case SetRemoteViewsAdapterIntent.TAG: 13205d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.add(new SetRemoteViewsAdapterIntent(parcel)); 13215d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 13225d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case TextViewDrawableAction.TAG: 13235d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.add(new TextViewDrawableAction(parcel)); 13245d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 13255d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case BitmapReflectionAction.TAG: 13265d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.add(new BitmapReflectionAction(parcel)); 13275d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 13285d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen default: 13295d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen throw new ActionException("Tag " + tag + " not found"); 13305d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13335d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } else { 13345d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // MODE_HAS_LANDSCAPE_AND_PORTRAIT 13355d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mLandscape = new RemoteViews(parcel, mBitmapCache); 13365d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mPortrait = new RemoteViews(parcel, mBitmapCache); 13375d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mPackage = mPortrait.getPackage(); 13385d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mLayoutId = mPortrait.getLayoutId(); 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13403ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 13413ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // setup the memory usage statistics 13423ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung mMemoryUsageCounter = new MemoryUsageCounter(); 13433ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung recalculateMemoryUsage(); 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13463030193dc179b3010f2dd3bffe9c1dec54da38fcGilles Debunne @Override 134718e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato public RemoteViews clone() { 13485d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen RemoteViews that; 13495d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (!hasLandscapeAndPortraitLayouts()) { 13505d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen that = new RemoteViews(mPackage, mLayoutId); 13513ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 13525d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (mActions != null) { 13535d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen that.mActions = (ArrayList<Action>)mActions.clone(); 13545d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 13555d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } else { 13565d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen RemoteViews land = mLandscape.clone(); 13575d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen RemoteViews port = mPortrait.clone(); 13585d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen that = new RemoteViews(land, port); 13595d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 13603ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // update the memory usage stats of the cloned RemoteViews 13613ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung that.recalculateMemoryUsage(); 136218e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato return that; 136318e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato } 136418e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPackage() { 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackage; 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13695d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen /** 13705d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * Reutrns the layout id of the root layout associated with this RemoteViews. In the case 13715d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * that the RemoteViews has both a landscape and portrait root, this will return the layout 13725d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * id associated with the portrait layout. 13735d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * 13745d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * @return the layout id. 13755d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen */ 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getLayoutId() { 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLayoutId; 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13803ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung /* 1381ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * This flag indicates whether this RemoteViews object is being created from a 1382ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * RemoteViewsService for use as a child of a widget collection. This flag is used 1383ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * to determine whether or not certain features are available, in particular, 1384ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * setting on click extras and setting on click pending intents. The former is enabled, 1385ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * and the latter disabled when this flag is true. 1386ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen */ 1387ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen void setIsWidgetCollectionChild(boolean isWidgetCollectionChild) { 1388ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen mIsWidgetCollectionChild = isWidgetCollectionChild; 1389ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 1390ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 1391ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen /** 13923ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung * Updates the memory usage statistics. 13933ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung */ 13943ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung private void recalculateMemoryUsage() { 13953ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung mMemoryUsageCounter.clear(); 13963ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 13975d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (!hasLandscapeAndPortraitLayouts()) { 13985d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // Accumulate the memory usage for each action 13995d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (mActions != null) { 14005d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen final int count = mActions.size(); 14015d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen for (int i= 0; i < count; ++i) { 14025d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.get(i).updateMemoryUsageEstimate(mMemoryUsageCounter); 14035d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 14045d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 14055d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (mIsRoot) { 14065d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmapCache.addBitmapMemory(mMemoryUsageCounter); 14073ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 14085d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } else { 14095d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mMemoryUsageCounter.increment(mLandscape.estimateMemoryUsage()); 14105d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mMemoryUsageCounter.increment(mPortrait.estimateMemoryUsage()); 14115d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmapCache.addBitmapMemory(mMemoryUsageCounter); 14125d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 14135d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 14145d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 14155d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen /** 14165d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * Recursively sets BitmapCache in the hierarchy and update the bitmap ids. 14175d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen */ 14185d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private void setBitmapCache(BitmapCache bitmapCache) { 14195d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmapCache = bitmapCache; 14205d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (!hasLandscapeAndPortraitLayouts()) { 14215d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (mActions != null) { 14225d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen final int count = mActions.size(); 14235d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen for (int i= 0; i < count; ++i) { 14245d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.get(i).setBitmapCache(bitmapCache); 14255d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 14265d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 14275d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } else { 14285d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mLandscape.setBitmapCache(bitmapCache); 14295d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mPortrait.setBitmapCache(bitmapCache); 14303ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 14313ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 14323ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 14333ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung /** 14343ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung * Returns an estimate of the bitmap heap memory usage for this RemoteViews. 14353ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung */ 14365d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen int estimateMemoryUsage() { 14375d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen return mMemoryUsageCounter.getMemoryUsage(); 14383ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 14393ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 14403ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung /** 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add an action to be executed on the remote side when apply is called. 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param a The action to add 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void addAction(Action a) { 14465d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (hasLandscapeAndPortraitLayouts()) { 14475d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen throw new RuntimeException("RemoteViews specifying separate landscape and portrait" + 14485d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen " layouts cannot be modified. Instead, fully configure the landscape and" + 14495d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen " portrait layouts individually before constructing the combined layout."); 14505d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActions == null) { 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActions = new ArrayList<Action>(); 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActions.add(a); 14553ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 14563ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // update the memory usage stats 14573ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung a.updateMemoryUsageEstimate(mMemoryUsageCounter); 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14591162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 14601162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey /** 14611162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * Equivalent to calling {@link ViewGroup#addView(View)} after inflating the 14621162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * given {@link RemoteViews}. This allows users to build "nested" 14631162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * {@link RemoteViews}. In cases where consumers of {@link RemoteViews} may 14641162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * recycle layouts, use {@link #removeAllViews(int)} to clear any existing 14651162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * children. 14661162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * 14671162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * @param viewId The id of the parent {@link ViewGroup} to add child into. 14681162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * @param nestedView {@link RemoteViews} that describes the child. 14691162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey */ 14701162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public void addView(int viewId, RemoteViews nestedView) { 14711162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey addAction(new ViewGroupAction(viewId, nestedView)); 14721162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 14731162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 14741162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey /** 14751162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * Equivalent to calling {@link ViewGroup#removeAllViews()}. 14761162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * 14771162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * @param viewId The id of the parent {@link ViewGroup} to remove all 14781162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * children from. 14791162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey */ 14801162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public void removeAllViews(int viewId) { 14811162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey addAction(new ViewGroupAction(viewId, null)); 14821162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 14831162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14850b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * Equivalent to calling {@link AdapterViewAnimator#showNext()} 14862dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * 14870b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * @param viewId The id of the view on which to call {@link AdapterViewAnimator#showNext()} 14882dd2197805edb4d9547b143deef2226413218f4cAdam Cohen */ 14892dd2197805edb4d9547b143deef2226413218f4cAdam Cohen public void showNext(int viewId) { 14902dd2197805edb4d9547b143deef2226413218f4cAdam Cohen addAction(new ReflectionActionWithoutParams(viewId, "showNext")); 14912dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 14922dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 14932dd2197805edb4d9547b143deef2226413218f4cAdam Cohen /** 14940b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * Equivalent to calling {@link AdapterViewAnimator#showPrevious()} 14952dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * 14960b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * @param viewId The id of the view on which to call {@link AdapterViewAnimator#showPrevious()} 14972dd2197805edb4d9547b143deef2226413218f4cAdam Cohen */ 14982dd2197805edb4d9547b143deef2226413218f4cAdam Cohen public void showPrevious(int viewId) { 14992dd2197805edb4d9547b143deef2226413218f4cAdam Cohen addAction(new ReflectionActionWithoutParams(viewId, "showPrevious")); 15002dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 15012dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 15022dd2197805edb4d9547b143deef2226413218f4cAdam Cohen /** 15030b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * Equivalent to calling {@link AdapterViewAnimator#setDisplayedChild(int)} 15040b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * 15050b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * @param viewId The id of the view on which to call 15060b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * {@link AdapterViewAnimator#setDisplayedChild(int)} 15070b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen */ 15080b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen public void setDisplayedChild(int viewId, int childIndex) { 15090b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen setInt(viewId, "setDisplayedChild", childIndex); 15100b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen } 15110b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen 15120b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen /** 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling View.setVisibility 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose visibility should change 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param visibility The new visibility for the view 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setViewVisibility(int viewId, int visibility) { 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInt(viewId, "setVisibility", visibility); 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1521ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling TextView.setText 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose text should change 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param text The new text for the view 15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTextViewText(int viewId, CharSequence text) { 15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setCharSequence(viewId, "setText", text); 15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1533820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * Equivalent to calling 1534820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * {@link TextView#setCompoundDrawablesWithIntrinsicBounds(int, int, int, int)}. 1535820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * 1536820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param viewId The id of the view whose text should change 1537820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param left The id of a drawable to place to the left of the text, or 0 1538820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param top The id of a drawable to place above the text, or 0 1539820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param right The id of a drawable to place to the right of the text, or 0 1540820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param bottom The id of a drawable to place below the text, or 0 1541820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler */ 1542820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler public void setTextViewCompoundDrawables(int viewId, int left, int top, int right, int bottom) { 1543820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler addAction(new TextViewDrawableAction(viewId, false, left, top, right, bottom)); 1544820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } 1545820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler 1546820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler /** 1547820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * Equivalent to calling {@link 1548820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * TextView#setCompoundDrawablesRelativeWithIntrinsicBounds(int, int, int, int)}. 1549820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * 1550820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param viewId The id of the view whose text should change 1551820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param start The id of a drawable to place before the text (relative to the 1552820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * layout direction), or 0 1553820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param top The id of a drawable to place above the text, or 0 1554820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param end The id of a drawable to place after the text, or 0 1555820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param bottom The id of a drawable to place below the text, or 0 1556820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler */ 1557820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler public void setTextViewCompoundDrawablesRelative(int viewId, int start, int top, int end, int bottom) { 1558820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler addAction(new TextViewDrawableAction(viewId, true, start, top, end, bottom)); 1559820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } 1560820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler 1561820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler /** 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling ImageView.setImageResource 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose drawable should change 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param srcId The new resource id for the drawable 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setImageViewResource(int viewId, int srcId) { 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInt(viewId, "setImageResource", srcId); 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling ImageView.setImageURI 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose drawable should change 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param uri The Uri for the image 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setImageViewUri(int viewId, Uri uri) { 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setUri(viewId, "setImageURI", uri); 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling ImageView.setImageBitmap 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 158493dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view whose bitmap should change 15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bitmap The new Bitmap for the drawable 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setImageViewBitmap(int viewId, Bitmap bitmap) { 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBitmap(viewId, "setImageBitmap", bitmap); 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15921480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen * Equivalent to calling AdapterView.setEmptyView 15931480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen * 15941480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen * @param viewId The id of the view on which to set the empty view 15951480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen * @param emptyViewId The view id of the empty view 15961480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen */ 15971480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen public void setEmptyView(int viewId, int emptyViewId) { 15981480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen addAction(new SetEmptyView(viewId, emptyViewId)); 15991480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 16001480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 16011480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen /** 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling {@link Chronometer#setBase Chronometer.setBase}, 16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Chronometer#setFormat Chronometer.setFormat}, 16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and {@link Chronometer#start Chronometer.start()} or 16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Chronometer#stop Chronometer.stop()}. 16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 160793dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the {@link Chronometer} to change 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param base The time at which the timer would have read 0:00. This 16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * time should be based off of 16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.os.SystemClock#elapsedRealtime SystemClock.elapsedRealtime()}. 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param format The Chronometer format string, or null to 16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * simply display the timer value. 16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param started True if you want the clock to be started, false if not. 16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setChronometer(int viewId, long base, String format, boolean started) { 16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setLong(viewId, "setBase", base); 16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setString(viewId, "setFormat", format); 16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBoolean(viewId, "setStarted", started); 16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling {@link ProgressBar#setMax ProgressBar.setMax}, 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ProgressBar#setProgress ProgressBar.setProgress}, and 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ProgressBar#setIndeterminate ProgressBar.setIndeterminate} 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If indeterminate is true, then the values for max and progress are ignored. 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 162893dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the {@link ProgressBar} to change 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param max The 100% value for the progress bar 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param progress The current value of the progress bar. 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param indeterminate True if the progress bar is indeterminate, 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * false if not. 16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setProgressBar(int viewId, int max, int progress, 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean indeterminate) { 16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBoolean(viewId, "setIndeterminate", indeterminate); 16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!indeterminate) { 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInt(viewId, "setMax", max); 16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInt(viewId, "setProgress", progress); 16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling 16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.View#setOnClickListener(android.view.View.OnClickListener)} 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to launch the provided {@link PendingIntent}. 16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 164835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * When setting the on-click action of items within collections (eg. {@link ListView}, 164935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * {@link StackView} etc.), this method will not work. Instead, use {@link 165035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * RemoteViews#setPendingIntentTemplate(int, PendingIntent) in conjunction with 165135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * RemoteViews#setOnClickFillInIntent(int, Intent). 165235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * 16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view that will trigger the {@link PendingIntent} when clicked 16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pendingIntent The {@link PendingIntent} to send when user clicks 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnClickPendingIntent(int viewId, PendingIntent pendingIntent) { 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new SetOnClickPendingIntent(viewId, pendingIntent)); 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 166135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * When using collections (eg. {@link ListView}, {@link StackView} etc.) in widgets, it is very 166235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * costly to set PendingIntents on the individual items, and is hence not permitted. Instead 166335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * this method should be used to set a single PendingIntent template on the collection, and 166435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * individual items can differentiate their on-click behavior using 166535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * {@link RemoteViews#setOnClickFillInIntent(int, Intent)}. 1666ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * 1667ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * @param viewId The id of the collection who's children will use this PendingIntent template 1668ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * when clicked 1669ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * @param pendingIntentTemplate The {@link PendingIntent} to be combined with extras specified 1670ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * by a child of viewId and executed when that child is clicked 1671ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen */ 1672ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen public void setPendingIntentTemplate(int viewId, PendingIntent pendingIntentTemplate) { 1673ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen addAction(new SetPendingIntentTemplate(viewId, pendingIntentTemplate)); 1674ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 1675ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 1676ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen /** 167735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * When using collections (eg. {@link ListView}, {@link StackView} etc.) in widgets, it is very 167835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * costly to set PendingIntents on the individual items, and is hence not permitted. Instead 167935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * a single PendingIntent template can be set on the collection, see {@link 168035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * RemoteViews#setPendingIntentTemplate(int, PendingIntent)}, and the individual on-click 168135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * action of a given item can be distinguished by setting a fillInIntent on that item. The 168235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * fillInIntent is then combined with the PendingIntent template in order to determine the final 168335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * intent which will be executed when the item is clicked. This works as follows: any fields 168435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * which are left blank in the PendingIntent template, but are provided by the fillInIntent 168535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * will be overwritten, and the resulting PendingIntent will be used. 168635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * 168735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * 168835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * of the PendingIntent template will then be filled in with the associated fields that are 168935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * set in fillInIntent. See {@link Intent#fillIn(Intent, int)} for more details. 169035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * 169135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * @param viewId The id of the view on which to set the fillInIntent 169235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * @param fillInIntent The intent which will be combined with the parent's PendingIntent 169335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * in order to determine the on-click behavior of the view specified by viewId 169435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen */ 169535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen public void setOnClickFillInIntent(int viewId, Intent fillInIntent) { 169635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen addAction(new SetOnClickFillInIntent(viewId, fillInIntent)); 169735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 169835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 169935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen /** 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling a combination of {@link Drawable#setAlpha(int)}, 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Drawable#setColorFilter(int, android.graphics.PorterDuff.Mode)}, 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and/or {@link Drawable#setLevel(int)} on the {@link Drawable} of a given 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * view. 17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You can omit specific calls by marking their values with null or -1. 17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view that contains the target 17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Drawable} 17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param targetBackground If true, apply these parameters to the 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Drawable} returned by 17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.View#getBackground()}. Otherwise, assume 17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the target view is an {@link ImageView} and apply them to 17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ImageView#getDrawable()}. 17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param alpha Specify an alpha value for the drawable, or -1 to leave 17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unchanged. 17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param colorFilter Specify a color for a 17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.graphics.ColorFilter} for this drawable, or -1 17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to leave unchanged. 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param mode Specify a PorterDuff mode for this drawable, or null to leave 17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unchanged. 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param level Specify the level for the drawable, or -1 to leave 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unchanged. 17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDrawableParameters(int viewId, boolean targetBackground, int alpha, 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int colorFilter, PorterDuff.Mode mode, int level) { 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new SetDrawableParameters(viewId, targetBackground, alpha, 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project colorFilter, mode, level)); 17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling {@link android.widget.TextView#setTextColor(int)}. 17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 173493dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view whose text color should change 17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param color Sets the text color for all the states (normal, selected, 17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * focused) to be this color. 17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTextColor(int viewId, int color) { 17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInt(viewId, "setTextColor", color); 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1742592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1743499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * Equivalent to calling {@link android.widget.AbsListView#setRemoteViewsAdapter(Intent)}. 1744499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * 1745037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * @param appWidgetId The id of the app widget which contains the specified view. (This 1746037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * parameter is ignored in this deprecated method) 174793dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the {@link AbsListView} 174881f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * @param intent The intent of the service which will be 174981f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * providing data to the RemoteViewsAdapter 1750037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * @deprecated This method has been deprecated. See 1751037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * {@link android.widget.RemoteViews#setRemoteAdapter(int, Intent)} 175281f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung */ 1753037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung @Deprecated 175481f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung public void setRemoteAdapter(int appWidgetId, int viewId, Intent intent) { 1755037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung setRemoteAdapter(viewId, intent); 1756037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 1757037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 1758037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung /** 1759037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * Equivalent to calling {@link android.widget.AbsListView#setRemoteViewsAdapter(Intent)}. 1760037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * Can only be used for App Widgets. 1761037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * 176293dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the {@link AbsListView} 1763037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * @param intent The intent of the service which will be 1764037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * providing data to the RemoteViewsAdapter 1765037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung */ 1766037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public void setRemoteAdapter(int viewId, Intent intent) { 1767037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung addAction(new SetRemoteViewsAdapterIntent(viewId, intent)); 1768499cb9f516062b654952d282f211bee44c31a3c2Winson Chung } 1769499cb9f516062b654952d282f211bee44c31a3c2Winson Chung 1770499cb9f516062b654952d282f211bee44c31a3c2Winson Chung /** 1771499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * Equivalent to calling {@link android.widget.AbsListView#smoothScrollToPosition(int, int)}. 1772499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * 177393dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view to change 1774499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * @param position Scroll to this adapter position 1775499cb9f516062b654952d282f211bee44c31a3c2Winson Chung */ 1776499cb9f516062b654952d282f211bee44c31a3c2Winson Chung public void setScrollPosition(int viewId, int position) { 1777499cb9f516062b654952d282f211bee44c31a3c2Winson Chung setInt(viewId, "smoothScrollToPosition", position); 1778499cb9f516062b654952d282f211bee44c31a3c2Winson Chung } 1779499cb9f516062b654952d282f211bee44c31a3c2Winson Chung 1780499cb9f516062b654952d282f211bee44c31a3c2Winson Chung /** 1781499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * Equivalent to calling {@link android.widget.AbsListView#smoothScrollToPosition(int, int)}. 1782499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * 178393dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view to change 178495362595ed4a42aec87b4d166092b30c8139d220Winson Chung * @param offset Scroll by this adapter position offset 1785499cb9f516062b654952d282f211bee44c31a3c2Winson Chung */ 1786499cb9f516062b654952d282f211bee44c31a3c2Winson Chung public void setRelativeScrollPosition(int viewId, int offset) { 1787499cb9f516062b654952d282f211bee44c31a3c2Winson Chung setInt(viewId, "smoothScrollByOffset", offset); 1788499cb9f516062b654952d282f211bee44c31a3c2Winson Chung } 1789499cb9f516062b654952d282f211bee44c31a3c2Winson Chung 1790499cb9f516062b654952d282f211bee44c31a3c2Winson Chung /** 1791592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one boolean on a view in the layout for this RemoteViews. 1792592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 179393dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1794592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1795592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1796592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setBoolean(int viewId, String methodName, boolean value) { 17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.BOOLEAN, value)); 17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1801592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1802592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one byte on a view in the layout for this RemoteViews. 1803592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 180493dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1805592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1806592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1807592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setByte(int viewId, String methodName, byte value) { 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.BYTE, value)); 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1812592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1813592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one short on a view in the layout for this RemoteViews. 1814592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 181593dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1816592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1817592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1818592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setShort(int viewId, String methodName, short value) { 18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.SHORT, value)); 18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1823592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1824592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one int on a view in the layout for this RemoteViews. 1825592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 182693dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1827592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1828592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1829592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setInt(int viewId, String methodName, int value) { 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.INT, value)); 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1834592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1835592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one long on a view in the layout for this RemoteViews. 1836592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 183793dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1838592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1839592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1840592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setLong(int viewId, String methodName, long value) { 18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.LONG, value)); 18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1845592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1846592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one float on a view in the layout for this RemoteViews. 1847592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 184893dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1849592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1850592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1851592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFloat(int viewId, String methodName, float value) { 18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.FLOAT, value)); 18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1856592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1857592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one double on a view in the layout for this RemoteViews. 1858592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 185993dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1860592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1861592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1862592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDouble(int viewId, String methodName, double value) { 18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.DOUBLE, value)); 18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1867592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1868592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one char on a view in the layout for this RemoteViews. 1869592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 187093dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1871592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1872592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1873592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setChar(int viewId, String methodName, char value) { 18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.CHAR, value)); 18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1878592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1879592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one String on a view in the layout for this RemoteViews. 1880592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 188193dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1882592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1883592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1884592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setString(int viewId, String methodName, String value) { 18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.STRING, value)); 18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1890592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one CharSequence on a view in the layout for this RemoteViews. 1891592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 189293dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1893592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1894592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1895592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setCharSequence(int viewId, String methodName, CharSequence value) { 18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.CHAR_SEQUENCE, value)); 18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1900592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1901592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one Uri on a view in the layout for this RemoteViews. 1902592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 190393dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1904592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1905592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1906592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setUri(int viewId, String methodName, Uri value) { 19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.URI, value)); 19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1911592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1912592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one Bitmap on a view in the layout for this RemoteViews. 1913592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @more 1914592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * <p class="note">The bitmap will be flattened into the parcel if this object is 1915592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * sent across processes, so it may end up using a lot of memory, and may be fairly slow.</p> 1916592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 191793dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1918592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1919592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1920592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setBitmap(int viewId, String methodName, Bitmap value) { 19225d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen addAction(new BitmapReflectionAction(viewId, methodName, value)); 19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1926d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert * Call a method taking one Bundle on a view in the layout for this RemoteViews. 1927d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert * 192893dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1929d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert * @param methodName The name of the method to call. 1930d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert * @param value The value to pass to the method. 1931d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert */ 1932d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert public void setBundle(int viewId, String methodName, Bundle value) { 1933d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert addAction(new ReflectionAction(viewId, methodName, ReflectionAction.BUNDLE, value)); 1934d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert } 1935d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert 1936d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert /** 193793dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * Call a method taking one Intent on a view in the layout for this RemoteViews. 1938499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * 193993dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 194093dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param methodName The name of the method to call. 194193dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param value The {@link android.content.Intent} to pass the method. 1942499cb9f516062b654952d282f211bee44c31a3c2Winson Chung */ 1943499cb9f516062b654952d282f211bee44c31a3c2Winson Chung public void setIntent(int viewId, String methodName, Intent value) { 1944499cb9f516062b654952d282f211bee44c31a3c2Winson Chung addAction(new ReflectionAction(viewId, methodName, ReflectionAction.INTENT, value)); 1945499cb9f516062b654952d282f211bee44c31a3c2Winson Chung } 1946499cb9f516062b654952d282f211bee44c31a3c2Winson Chung 1947499cb9f516062b654952d282f211bee44c31a3c2Winson Chung /** 1948e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov * Equivalent to calling View.setContentDescription 1949e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov * 1950e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov * @param viewId The id of the view whose content description should change 1951e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov * @param contentDescription The new content description for the view 1952e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov */ 1953e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov public void setContentDescription(int viewId, CharSequence contentDescription) { 1954e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov setCharSequence(viewId, "setContentDescription", contentDescription); 1955e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov } 1956e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov 19575d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private RemoteViews getRemoteViewsToApply(Context context) { 19585d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (hasLandscapeAndPortraitLayouts()) { 19595d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen int orientation = context.getResources().getConfiguration().orientation; 19605d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (orientation == Configuration.ORIENTATION_LANDSCAPE) { 19615d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen return mLandscape; 19625d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } else { 19635d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen return mPortrait; 19645d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 19655d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 19665d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen return this; 19675d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 19685d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 1969e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov /** 19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inflates the view hierarchy represented by this object and applies 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * all of the actions. 19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>Caller beware: this may throw</strong> 19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context Default context to use 19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parent Parent that the resulting view hierarchy will be attached to. This method 19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * does <strong>not</strong> attach the hierarchy. The caller should do so when appropriate. 19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The inflated view hierarchy 19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View apply(Context context, ViewGroup parent) { 19815d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen RemoteViews rvToApply = getRemoteViewsToApply(context); 19825d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 1983a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy View result; 19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context c = prepareContext(context); 19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1987a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy LayoutInflater inflater = (LayoutInflater) 1988a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inflater = inflater.cloneInContext(c); 19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inflater.setFilter(this); 19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19935d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen result = inflater.inflate(rvToApply.getLayoutId(), parent, false); 19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19955d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen rvToApply.performApply(result, parent); 19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19995d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Applies all of the actions to the provided view. 20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>Caller beware: this may throw</strong> 20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param v The view to apply the actions to. This should be the result of 20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the {@link #apply(Context,ViewGroup)} call. 20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void reapply(Context context, View v) { 20095d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen RemoteViews rvToApply = getRemoteViewsToApply(context); 20105d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 20115d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // In the case that a view has this RemoteViews applied in one orientation, is persisted 20125d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // across orientation change, and has the RemoteViews re-applied in the new orientation, 20135d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // we throw an exception, since the layouts may be completely unrelated. 20145d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (hasLandscapeAndPortraitLayouts()) { 20155d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (v.getId() != rvToApply.getLayoutId()) { 20165d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen throw new RuntimeException("Attempting to re-apply RemoteViews to a view that" + 20175d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen " that does not share the same root layout id."); 20185d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 20195d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 20205d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project prepareContext(context); 20225d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen rvToApply.performApply(v, (ViewGroup) v.getParent()); 20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2025037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung private void performApply(View v, ViewGroup parent) { 20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActions != null) { 20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mActions.size(); 20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Action a = mActions.get(i); 2030037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung a.apply(v, parent); 20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context prepareContext(Context context) { 2036a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy Context c; 20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String packageName = mPackage; 20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (packageName != null) { 20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2041870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy c = context.createPackageContext(packageName, Context.CONTEXT_RESTRICTED); 20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (NameNotFoundException e) { 20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOG_TAG, "Package name " + packageName + " not found"); 20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c = context; 20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c = context; 20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return c; 20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* (non-Javadoc) 20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used to restrict the views which can be inflated 20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.view.LayoutInflater.Filter#onLoadClass(java.lang.Class) 20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2058e6ac8b9aade9443ab8456c8f7a47cdfba3b70266Gilles Debunne public boolean onLoadClass(Class clazz) { 20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return clazz.isAnnotationPresent(RemoteView.class); 20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20615d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 20675d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (!hasLandscapeAndPortraitLayouts()) { 20685d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeInt(MODE_NORMAL); 20695d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // We only write the bitmap cache if we are the root RemoteViews, as this cache 20705d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // is shared by all children. 20715d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (mIsRoot) { 20725d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmapCache.writeBitmapsToParcel(dest, flags); 20735d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 20745d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeString(mPackage); 20755d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeInt(mLayoutId); 20765d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeInt(mIsWidgetCollectionChild ? 1 : 0); 20775d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen int count; 20785d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (mActions != null) { 20795d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen count = mActions.size(); 20805d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } else { 20815d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen count = 0; 20825d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 20835d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeInt(count); 20845d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen for (int i=0; i<count; i++) { 20855d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen Action a = mActions.get(i); 20865d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen a.writeToParcel(dest, 0); 20875d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20895d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeInt(MODE_HAS_LANDSCAPE_AND_PORTRAIT); 20905d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // We only write the bitmap cache if we are the root RemoteViews, as this cache 20915d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // is shared by all children. 20925d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (mIsRoot) { 20935d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmapCache.writeBitmapsToParcel(dest, flags); 20945d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 20955d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mLandscape.writeToParcel(dest, flags); 20965d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mPortrait.writeToParcel(dest, flags); 20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parcelable.Creator that instantiates RemoteViews objects 21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<RemoteViews> CREATOR = new Parcelable.Creator<RemoteViews>() { 21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RemoteViews createFromParcel(Parcel parcel) { 21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RemoteViews(parcel); 21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RemoteViews[] newArray(int size) { 21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RemoteViews[size]; 21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2113