RemoteViews.java revision dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456
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; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PorterDuff; 287597065d6b0877ffc460b443fdb1595965ccd7b2Joe Onoratoimport android.graphics.Rect; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 31d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringertimport android.os.Bundle; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater; 37dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chungimport android.view.LayoutInflater.Filter; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.RemotableViewMethod; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View.OnClickListener; 41dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chungimport android.view.ViewGroup; 42a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohenimport android.widget.AdapterView.OnItemClickListener; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 44dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chungimport java.lang.annotation.ElementType; 45dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chungimport java.lang.annotation.Retention; 46dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chungimport java.lang.annotation.RetentionPolicy; 47dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chungimport java.lang.annotation.Target; 48dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chungimport java.lang.reflect.Method; 49dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chungimport java.util.ArrayList; 50dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A class that describes a view hierarchy that can be displayed in 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * another process. The hierarchy is inflated from a layout resource 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * file, and this class provides some basic operations for modifying 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the content of the inflated hierarchy. 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class RemoteViews implements Parcelable, Filter { 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String LOG_TAG = "RemoteViews"; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6381f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * The intent extra that contains the appWidgetId. 6481f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * @hide 6581f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung */ 6681f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung static final String EXTRA_REMOTEADAPTER_APPWIDGET_ID = "remoteAdapterAppWidgetId"; 6781f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung 6881f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung /** 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The package name of the package containing the layout 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resource. (Added to the parcel) 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 723030193dc179b3010f2dd3bffe9c1dec54da38fcGilles Debunne private final String mPackage; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The resource ID of the layout file. (Added to the parcel) 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 773030193dc179b3010f2dd3bffe9c1dec54da38fcGilles Debunne private final int mLayoutId; 78a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An array of actions to perform on the view tree once it has been 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inflated 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ArrayList<Action> mActions; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 853ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung /** 863ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung * A class to keep track of memory usage by this RemoteViews 873ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung */ 883ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung private MemoryUsageCounter mMemoryUsageCounter; 893ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 92ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * This flag indicates whether this RemoteViews object is being created from a 93ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * RemoteViewsService for use as a child of a widget collection. This flag is used 94ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * to determine whether or not certain features are available, in particular, 95ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * setting on click extras and setting on click pending intents. The former is enabled, 96ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * and the latter disabled when this flag is true. 97ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen */ 98ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen private boolean mIsWidgetCollectionChild = false; 99ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 100ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen /** 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This annotation indicates that a subclass of View is alllowed to be used 102a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy * with the {@link RemoteViews} mechanism. 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Target({ ElementType.TYPE }) 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Retention(RetentionPolicy.RUNTIME) 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public @interface RemoteView { 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Exception to send when something goes wrong executing an action 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class ActionException extends RuntimeException { 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ActionException(Exception ex) { 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(ex); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ActionException(String message) { 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(message); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 121a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class for all actions that can be performed on an 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inflated view. 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato * SUBCLASSES MUST BE IMMUTABLE SO CLONE WORKS!!!!! 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private abstract static class Action implements Parcelable { 129037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public abstract void apply(View root, ViewGroup rootParent) throws ActionException; 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1343ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 1353ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung /** 1363ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung * Overridden by each class to report on it's own memory usage 1373ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung */ 1383ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung public void updateMemoryUsageEstimate(MemoryUsageCounter counter) { 1393ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // We currently only calculate Bitmap memory usage, so by default, don't do anything 1403ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // here 1413ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung return; 1423ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 143ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung 144dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung protected boolean startIntentSafely(View view, PendingIntent pendingIntent, 145ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung Intent fillInIntent) { 146ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung try { 147ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung // TODO: Unregister this handler if PendingIntent.FLAG_ONE_SHOT? 148dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung Context context = view.getContext(); 149dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung ActivityOptions opts = ActivityOptions.makeScaleUpAnimation(view, 150dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung 0, 0, 151dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung view.getMeasuredWidth(), view.getMeasuredHeight()); 152ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung context.startIntentSender( 153ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung pendingIntent.getIntentSender(), fillInIntent, 154ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung Intent.FLAG_ACTIVITY_NEW_TASK, 155dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung Intent.FLAG_ACTIVITY_NEW_TASK, 0, opts.toBundle()); 156ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung } catch (IntentSender.SendIntentException e) { 157ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung android.util.Log.e(LOG_TAG, "Cannot send pending intent: ", e); 158ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung return false; 159ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung } catch (Exception e) { 160ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung android.util.Log.e(LOG_TAG, "Cannot send pending intent due to " + 161ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung "unknown exception: ", e); 162ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung return false; 163ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung } 164ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung return true; 165ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung } 166a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy } 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1681480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen private class SetEmptyView extends Action { 1691480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen int viewId; 1701480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen int emptyViewId; 1711480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 1721480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen public final static int TAG = 6; 1731480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 1741480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen SetEmptyView(int viewId, int emptyViewId) { 1751480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen this.viewId = viewId; 1761480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen this.emptyViewId = emptyViewId; 1771480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 1781480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 1791480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen SetEmptyView(Parcel in) { 1801480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen this.viewId = in.readInt(); 1811480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen this.emptyViewId = in.readInt(); 1821480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 1831480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 1841480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen public void writeToParcel(Parcel out, int flags) { 1851480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen out.writeInt(TAG); 1861480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen out.writeInt(this.viewId); 1871480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen out.writeInt(this.emptyViewId); 1881480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 1891480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 1901480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen @Override 191037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public void apply(View root, ViewGroup rootParent) { 1921480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen final View view = root.findViewById(viewId); 1931480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen if (!(view instanceof AdapterView<?>)) return; 1941480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 1951480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen AdapterView<?> adapterView = (AdapterView<?>) view; 1961480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 1971480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen final View emptyView = root.findViewById(emptyViewId); 1981480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen if (emptyView == null) return; 1991480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 2001480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen adapterView.setEmptyView(emptyView); 2011480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 2021480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 2031480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 20435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen private class SetOnClickFillInIntent extends Action { 20535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen public SetOnClickFillInIntent(int id, Intent fillInIntent) { 20635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen this.viewId = id; 20735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen this.fillInIntent = fillInIntent; 20835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 20935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 21035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen public SetOnClickFillInIntent(Parcel parcel) { 21135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen viewId = parcel.readInt(); 21235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen fillInIntent = Intent.CREATOR.createFromParcel(parcel); 21335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 21435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 21535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen public void writeToParcel(Parcel dest, int flags) { 21635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen dest.writeInt(TAG); 21735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen dest.writeInt(viewId); 21835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen fillInIntent.writeToParcel(dest, 0 /* no flags */); 21935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 22035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 22135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen @Override 222037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public void apply(View root, ViewGroup rootParent) { 22335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen final View target = root.findViewById(viewId); 2242b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (target == null) return; 22535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 22635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen if (!mIsWidgetCollectionChild) { 22735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen Log.e("RemoteViews", "The method setOnClickFillInIntent is available " + 22835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen "only from RemoteViewsFactory (ie. on collection items)."); 22935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen return; 23035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 231a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen if (target == root) { 232a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen target.setTagInternal(com.android.internal.R.id.fillInIntent, fillInIntent); 233a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen } else if (target != null && fillInIntent != null) { 23435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen OnClickListener listener = new OnClickListener() { 23535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen public void onClick(View v) { 23635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen // Insure that this view is a child of an AdapterView 23735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen View parent = (View) v.getParent(); 23835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen while (!(parent instanceof AdapterView<?>) 23935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen && !(parent instanceof AppWidgetHostView)) { 24035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen parent = (View) parent.getParent(); 24135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 24235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 24335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen if (parent instanceof AppWidgetHostView) { 24435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen // Somehow they've managed to get this far without having 24535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen // and AdapterView as a parent. 24635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen Log.e("RemoteViews", "Collection item doesn't have AdapterView parent"); 24735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen return; 24835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 24935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 25035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen // Insure that a template pending intent has been set on an ancestor 25135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen if (!(parent.getTag() instanceof PendingIntent)) { 25235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen Log.e("RemoteViews", "Attempting setOnClickFillInIntent without" + 253a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen " calling setPendingIntentTemplate on parent."); 25435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen return; 25535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 25635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 25735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen PendingIntent pendingIntent = (PendingIntent) parent.getTag(); 25835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 25935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen final float appScale = v.getContext().getResources() 260a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen .getCompatibilityInfo().applicationScale; 26135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen final int[] pos = new int[2]; 26235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen v.getLocationOnScreen(pos); 26335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 26435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen final Rect rect = new Rect(); 26535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen rect.left = (int) (pos[0] * appScale + 0.5f); 26635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen rect.top = (int) (pos[1] * appScale + 0.5f); 26735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen rect.right = (int) ((pos[0] + v.getWidth()) * appScale + 0.5f); 26835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen rect.bottom = (int) ((pos[1] + v.getHeight()) * appScale + 0.5f); 26935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 27035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen fillInIntent.setSourceBounds(rect); 271dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung startIntentSafely(v, pendingIntent, fillInIntent); 27235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 27335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 27435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen }; 27535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen target.setOnClickListener(listener); 27635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 27735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 27835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 27935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen int viewId; 28035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen Intent fillInIntent; 28135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 28235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen public final static int TAG = 9; 28335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 28435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 285ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen private class SetPendingIntentTemplate extends Action { 286ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen public SetPendingIntentTemplate(int id, PendingIntent pendingIntentTemplate) { 287ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen this.viewId = id; 288ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen this.pendingIntentTemplate = pendingIntentTemplate; 289ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 290ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 291ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen public SetPendingIntentTemplate(Parcel parcel) { 292ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen viewId = parcel.readInt(); 293ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen pendingIntentTemplate = PendingIntent.readPendingIntentOrNullFromParcel(parcel); 294ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 295ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 296ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen public void writeToParcel(Parcel dest, int flags) { 297ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen dest.writeInt(TAG); 298ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen dest.writeInt(viewId); 299ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen pendingIntentTemplate.writeToParcel(dest, 0 /* no flags */); 300ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 301ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 302ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen @Override 303037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public void apply(View root, ViewGroup rootParent) { 304ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen final View target = root.findViewById(viewId); 3052b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (target == null) return; 306ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 307ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen // If the view isn't an AdapterView, setting a PendingIntent template doesn't make sense 308ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen if (target instanceof AdapterView<?>) { 309a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen AdapterView<?> av = (AdapterView<?>) target; 310ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen // The PendingIntent template is stored in the view's tag. 311a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen OnItemClickListener listener = new OnItemClickListener() { 312a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen public void onItemClick(AdapterView<?> parent, View view, 313a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen int position, long id) { 314a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen // The view should be a frame layout 315a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen if (view instanceof ViewGroup) { 316a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen ViewGroup vg = (ViewGroup) view; 317a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen 318a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen // AdapterViews contain their children in a frame 319a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen // so we need to go one layer deeper here. 320a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen if (parent instanceof AdapterViewAnimator) { 321a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen vg = (ViewGroup) vg.getChildAt(0); 322a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen } 323a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen if (vg == null) return; 324a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen 325a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen Intent fillInIntent = null; 326a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen int childCount = vg.getChildCount(); 327a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen for (int i = 0; i < childCount; i++) { 328a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen Object tag = vg.getChildAt(i).getTag(com.android.internal.R.id.fillInIntent); 329a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen if (tag instanceof Intent) { 330a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen fillInIntent = (Intent) tag; 331a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen break; 332a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen } 333a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen } 334a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen if (fillInIntent == null) return; 335a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen 336a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen final float appScale = view.getContext().getResources() 337a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen .getCompatibilityInfo().applicationScale; 338a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen final int[] pos = new int[2]; 339a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen view.getLocationOnScreen(pos); 340a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen 341a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen final Rect rect = new Rect(); 342a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen rect.left = (int) (pos[0] * appScale + 0.5f); 343a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen rect.top = (int) (pos[1] * appScale + 0.5f); 344a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen rect.right = (int) ((pos[0] + view.getWidth()) * appScale + 0.5f); 345a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen rect.bottom = (int) ((pos[1] + view.getHeight()) * appScale + 0.5f); 346a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen 347a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen final Intent intent = new Intent(); 348a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen intent.setSourceBounds(rect); 349dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung startIntentSafely(view, pendingIntentTemplate, fillInIntent); 350a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen } 351a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen } 352a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen }; 353a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen av.setOnItemClickListener(listener); 354a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen av.setTag(pendingIntentTemplate); 355ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } else { 356ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen Log.e("RemoteViews", "Cannot setPendingIntentTemplate on a view which is not" + 35735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen "an AdapterView (id: " + viewId + ")"); 358ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen return; 359ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 360ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 361ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 362ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen int viewId; 363ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen PendingIntent pendingIntentTemplate; 364ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 365ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen public final static int TAG = 8; 366ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 367ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 368037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung private class SetRemoteViewsAdapterIntent extends Action { 369037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public SetRemoteViewsAdapterIntent(int id, Intent intent) { 370037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung this.viewId = id; 371037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung this.intent = intent; 372037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 373037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 374037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public SetRemoteViewsAdapterIntent(Parcel parcel) { 375037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung viewId = parcel.readInt(); 376037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung intent = Intent.CREATOR.createFromParcel(parcel); 377037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 378037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 379037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public void writeToParcel(Parcel dest, int flags) { 380037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung dest.writeInt(TAG); 381037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung dest.writeInt(viewId); 382037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung intent.writeToParcel(dest, flags); 383037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 384037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 385037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung @Override 386037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public void apply(View root, ViewGroup rootParent) { 387037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung final View target = root.findViewById(viewId); 388037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung if (target == null) return; 389037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 390037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung // Ensure that we are applying to an AppWidget root 391037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung if (!(rootParent instanceof AppWidgetHostView)) { 392037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung Log.e("RemoteViews", "SetRemoteViewsAdapterIntent action can only be used for " + 393037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung "AppWidgets (root id: " + viewId + ")"); 394037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung return; 395037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 396037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung // Ensure that we are calling setRemoteAdapter on an AdapterView that supports it 397037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung if (!(target instanceof AbsListView) && !(target instanceof AdapterViewAnimator)) { 398037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung Log.e("RemoteViews", "Cannot setRemoteViewsAdapter on a view which is not " + 399037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung "an AbsListView or AdapterViewAnimator (id: " + viewId + ")"); 400037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung return; 401037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 402037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 403037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung // Embed the AppWidget Id for use in RemoteViewsAdapter when connecting to the intent 404037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung // RemoteViewsService 405037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung AppWidgetHostView host = (AppWidgetHostView) rootParent; 406037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung intent.putExtra(EXTRA_REMOTEADAPTER_APPWIDGET_ID, host.getAppWidgetId()); 407037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung if (target instanceof AbsListView) { 408037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung AbsListView v = (AbsListView) target; 409037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung v.setRemoteViewsAdapter(intent); 410037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } else if (target instanceof AdapterViewAnimator) { 411037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung AdapterViewAnimator v = (AdapterViewAnimator) target; 412037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung v.setRemoteViewsAdapter(intent); 413037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 414037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 415037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 416037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung int viewId; 417037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung Intent intent; 418037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 419037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public final static int TAG = 10; 420037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 421037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.View#setOnClickListener(android.view.View.OnClickListener)} 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to launch the provided {@link PendingIntent}. 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class SetOnClickPendingIntent extends Action { 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SetOnClickPendingIntent(int id, PendingIntent pendingIntent) { 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.viewId = id; 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.pendingIntent = pendingIntent; 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 432ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SetOnClickPendingIntent(Parcel parcel) { 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project viewId = parcel.readInt(); 435c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen 436c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // We check a flag to determine if the parcel contains a PendingIntent. 437c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (parcel.readInt() != 0) { 438c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen pendingIntent = PendingIntent.readPendingIntentOrNullFromParcel(parcel); 439c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 441ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(TAG); 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(viewId); 445c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen 446c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // We use a flag to indicate whether the parcel contains a valid object. 447c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen dest.writeInt(pendingIntent != null ? 1 : 0); 448c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (pendingIntent != null) { 449c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen pendingIntent.writeToParcel(dest, 0 /* no flags */); 450c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 452ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 454037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public void apply(View root, ViewGroup rootParent) { 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View target = root.findViewById(viewId); 4562b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (target == null) return; 457ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 458ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen // If the view is an AdapterView, setting a PendingIntent on click doesn't make much 459ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen // sense, do they mean to set a PendingIntent template for the AdapterView's children? 460ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen if (mIsWidgetCollectionChild) { 46135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen Log.e("RemoteViews", "Cannot setOnClickPendingIntent for collection item " + 462c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen "(id: " + viewId + ")"); 463ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen // TODO: return; We'll let this slide until apps are up to date. 464ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 465ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 466c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (target != null) { 467c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // If the pendingIntent is null, we clear the onClickListener 468c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen OnClickListener listener = null; 469c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (pendingIntent != null) { 470c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen listener = new OnClickListener() { 471c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen public void onClick(View v) { 472c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // Find target view location in screen coordinates and 473c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // fill into PendingIntent before sending. 474c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen final float appScale = v.getContext().getResources() 475c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen .getCompatibilityInfo().applicationScale; 476c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen final int[] pos = new int[2]; 477c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen v.getLocationOnScreen(pos); 478c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen 479c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen final Rect rect = new Rect(); 480c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen rect.left = (int) (pos[0] * appScale + 0.5f); 481c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen rect.top = (int) (pos[1] * appScale + 0.5f); 482c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen rect.right = (int) ((pos[0] + v.getWidth()) * appScale + 0.5f); 483c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen rect.bottom = (int) ((pos[1] + v.getHeight()) * appScale + 0.5f); 484c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen 485c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen final Intent intent = new Intent(); 486c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen intent.setSourceBounds(rect); 487dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung startIntentSafely(v, pendingIntent, intent); 488c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 489c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen }; 490c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project target.setOnClickListener(listener); 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 494c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int viewId; 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PendingIntent pendingIntent; 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static int TAG = 1; 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling a combination of {@link Drawable#setAlpha(int)}, 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Drawable#setColorFilter(int, android.graphics.PorterDuff.Mode)}, 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and/or {@link Drawable#setLevel(int)} on the {@link Drawable} of a given view. 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These operations will be performed on the {@link Drawable} returned by the 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * target {@link View#getBackground()} by default. If targetBackground is false, 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * we assume the target is an {@link ImageView} and try applying the operations 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to {@link ImageView#getDrawable()}. 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You can omit specific calls by marking their values with null or -1. 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class SetDrawableParameters extends Action { 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SetDrawableParameters(int id, boolean targetBackground, int alpha, 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int colorFilter, PorterDuff.Mode mode, int level) { 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.viewId = id; 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.targetBackground = targetBackground; 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.alpha = alpha; 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.colorFilter = colorFilter; 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.filterMode = mode; 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.level = level; 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SetDrawableParameters(Parcel parcel) { 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project viewId = parcel.readInt(); 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetBackground = parcel.readInt() != 0; 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project alpha = parcel.readInt(); 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project colorFilter = parcel.readInt(); 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasMode = parcel.readInt() != 0; 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasMode) { 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filterMode = PorterDuff.Mode.valueOf(parcel.readString()); 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filterMode = null; 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project level = parcel.readInt(); 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(TAG); 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(viewId); 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(targetBackground ? 1 : 0); 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(alpha); 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(colorFilter); 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (filterMode != null) { 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(1); 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(filterMode.toString()); 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(0); 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(level); 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 554037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public void apply(View root, ViewGroup rootParent) { 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View target = root.findViewById(viewId); 5562b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (target == null) return; 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Pick the correct drawable to modify for this view 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable targetDrawable = null; 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (targetBackground) { 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetDrawable = target.getBackground(); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (target instanceof ImageView) { 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ImageView imageView = (ImageView) target; 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetDrawable = imageView.getDrawable(); 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 567a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy if (targetDrawable != null) { 568a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy // Perform modifications only if values are set correctly 569a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy if (alpha != -1) { 570a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy targetDrawable.setAlpha(alpha); 571a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy } 572a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy if (colorFilter != -1 && filterMode != null) { 573a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy targetDrawable.setColorFilter(colorFilter, filterMode); 574a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy } 575a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy if (level != -1) { 576a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy targetDrawable.setLevel(level); 577a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy } 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5803ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int viewId; 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean targetBackground; 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int alpha; 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int colorFilter; 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PorterDuff.Mode filterMode; 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int level; 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static int TAG = 3; 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5912dd2197805edb4d9547b143deef2226413218f4cAdam Cohen private class ReflectionActionWithoutParams extends Action { 5922dd2197805edb4d9547b143deef2226413218f4cAdam Cohen int viewId; 5932dd2197805edb4d9547b143deef2226413218f4cAdam Cohen String methodName; 5942dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 5952dd2197805edb4d9547b143deef2226413218f4cAdam Cohen public final static int TAG = 5; 5962dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 5972dd2197805edb4d9547b143deef2226413218f4cAdam Cohen ReflectionActionWithoutParams(int viewId, String methodName) { 5982dd2197805edb4d9547b143deef2226413218f4cAdam Cohen this.viewId = viewId; 5992dd2197805edb4d9547b143deef2226413218f4cAdam Cohen this.methodName = methodName; 6002dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6012dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 6022dd2197805edb4d9547b143deef2226413218f4cAdam Cohen ReflectionActionWithoutParams(Parcel in) { 6032dd2197805edb4d9547b143deef2226413218f4cAdam Cohen this.viewId = in.readInt(); 6042dd2197805edb4d9547b143deef2226413218f4cAdam Cohen this.methodName = in.readString(); 6052dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6062dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 6072dd2197805edb4d9547b143deef2226413218f4cAdam Cohen public void writeToParcel(Parcel out, int flags) { 6082dd2197805edb4d9547b143deef2226413218f4cAdam Cohen out.writeInt(TAG); 6092dd2197805edb4d9547b143deef2226413218f4cAdam Cohen out.writeInt(this.viewId); 6102dd2197805edb4d9547b143deef2226413218f4cAdam Cohen out.writeString(this.methodName); 6112dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6122dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 6132dd2197805edb4d9547b143deef2226413218f4cAdam Cohen @Override 614037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public void apply(View root, ViewGroup rootParent) { 6152dd2197805edb4d9547b143deef2226413218f4cAdam Cohen final View view = root.findViewById(viewId); 6162b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (view == null) return; 6172dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 6182dd2197805edb4d9547b143deef2226413218f4cAdam Cohen Class klass = view.getClass(); 6192dd2197805edb4d9547b143deef2226413218f4cAdam Cohen Method method; 6202dd2197805edb4d9547b143deef2226413218f4cAdam Cohen try { 6212dd2197805edb4d9547b143deef2226413218f4cAdam Cohen method = klass.getMethod(this.methodName); 6222dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } catch (NoSuchMethodException ex) { 6232dd2197805edb4d9547b143deef2226413218f4cAdam Cohen throw new ActionException("view: " + klass.getName() + " doesn't have method: " 6242dd2197805edb4d9547b143deef2226413218f4cAdam Cohen + this.methodName + "()"); 6252dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6262dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 6272dd2197805edb4d9547b143deef2226413218f4cAdam Cohen if (!method.isAnnotationPresent(RemotableViewMethod.class)) { 6282dd2197805edb4d9547b143deef2226413218f4cAdam Cohen throw new ActionException("view: " + klass.getName() 6292dd2197805edb4d9547b143deef2226413218f4cAdam Cohen + " can't use method with RemoteViews: " 6302dd2197805edb4d9547b143deef2226413218f4cAdam Cohen + this.methodName + "()"); 6312dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6322dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 6332dd2197805edb4d9547b143deef2226413218f4cAdam Cohen try { 6342dd2197805edb4d9547b143deef2226413218f4cAdam Cohen //noinspection ConstantIfStatement 6352dd2197805edb4d9547b143deef2226413218f4cAdam Cohen if (false) { 6362dd2197805edb4d9547b143deef2226413218f4cAdam Cohen Log.d("RemoteViews", "view: " + klass.getName() + " calling method: " 6372dd2197805edb4d9547b143deef2226413218f4cAdam Cohen + this.methodName + "()"); 6382dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6392dd2197805edb4d9547b143deef2226413218f4cAdam Cohen method.invoke(view); 6402dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } catch (Exception ex) { 6412dd2197805edb4d9547b143deef2226413218f4cAdam Cohen throw new ActionException(ex); 6422dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6432dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6442dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6452dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class for the reflection actions. 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class ReflectionAction extends Action { 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int TAG = 2; 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int BOOLEAN = 1; 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int BYTE = 2; 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int SHORT = 3; 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int INT = 4; 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int LONG = 5; 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int FLOAT = 6; 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int DOUBLE = 7; 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int CHAR = 8; 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int STRING = 9; 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int CHAR_SEQUENCE = 10; 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int URI = 11; 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int BITMAP = 12; 664d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert static final int BUNDLE = 13; 665499cb9f516062b654952d282f211bee44c31a3c2Winson Chung static final int INTENT = 14; 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int viewId; 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String methodName; 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object value; 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ReflectionAction(int viewId, String methodName, int type, Object value) { 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.viewId = viewId; 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.methodName = methodName; 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.type = type; 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = value; 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ReflectionAction(Parcel in) { 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.viewId = in.readInt(); 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.methodName = in.readString(); 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.type = in.readInt(); 683a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy //noinspection ConstantIfStatement 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d("RemoteViews", "read viewId=0x" + Integer.toHexString(this.viewId) 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " methodName=" + this.methodName + " type=" + this.type); 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 688c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen 689c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // For some values that may have been null, we first check a flag to see if they were 690c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // written to the parcel. 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (this.type) { 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BOOLEAN: 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readInt() != 0; 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BYTE: 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readByte(); 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SHORT: 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = (short)in.readInt(); 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INT: 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readInt(); 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LONG: 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readLong(); 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FLOAT: 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readFloat(); 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DOUBLE: 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readDouble(); 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR: 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = (char)in.readInt(); 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STRING: 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readString(); 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR_SEQUENCE: 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case URI: 723c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (in.readInt() != 0) { 724c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen this.value = Uri.CREATOR.createFromParcel(in); 725c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BITMAP: 728c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (in.readInt() != 0) { 729c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen this.value = Bitmap.CREATOR.createFromParcel(in); 730c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 732d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert case BUNDLE: 733d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert this.value = in.readBundle(); 734d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert break; 735499cb9f516062b654952d282f211bee44c31a3c2Winson Chung case INTENT: 736c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (in.readInt() != 0) { 737c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen this.value = Intent.CREATOR.createFromParcel(in); 738c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 739499cb9f516062b654952d282f211bee44c31a3c2Winson Chung break; 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, int flags) { 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(TAG); 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(this.viewId); 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(this.methodName); 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(this.type); 750a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy //noinspection ConstantIfStatement 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d("RemoteViews", "write viewId=0x" + Integer.toHexString(this.viewId) 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " methodName=" + this.methodName + " type=" + this.type); 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 755c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen 756c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // For some values which are null, we record an integer flag to indicate whether 757c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // we have written a valid value to the parcel. 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (this.type) { 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BOOLEAN: 760a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeInt((Boolean) this.value ? 1 : 0); 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BYTE: 763a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeByte((Byte) this.value); 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SHORT: 766a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeInt((Short) this.value); 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INT: 769a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeInt((Integer) this.value); 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LONG: 772a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeLong((Long) this.value); 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FLOAT: 775a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeFloat((Float) this.value); 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DOUBLE: 778a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeDouble((Double) this.value); 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR: 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt((int)((Character)this.value).charValue()); 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STRING: 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString((String)this.value); 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR_SEQUENCE: 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextUtils.writeToParcel((CharSequence)this.value, out, flags); 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case URI: 790c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen out.writeInt(this.value != null ? 1 : 0); 791c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (this.value != null) { 792c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen ((Uri)this.value).writeToParcel(out, flags); 793c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BITMAP: 796c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen out.writeInt(this.value != null ? 1 : 0); 797c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (this.value != null) { 798c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen ((Bitmap)this.value).writeToParcel(out, flags); 799c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 801d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert case BUNDLE: 802d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert out.writeBundle((Bundle) this.value); 803d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert break; 804499cb9f516062b654952d282f211bee44c31a3c2Winson Chung case INTENT: 805c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen out.writeInt(this.value != null ? 1 : 0); 806c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (this.value != null) { 807c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen ((Intent)this.value).writeToParcel(out, flags); 808c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 809499cb9f516062b654952d282f211bee44c31a3c2Winson Chung break; 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Class getParameterType() { 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (this.type) { 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BOOLEAN: 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return boolean.class; 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BYTE: 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return byte.class; 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SHORT: 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return short.class; 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INT: 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return int.class; 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LONG: 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return long.class; 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FLOAT: 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return float.class; 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DOUBLE: 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return double.class; 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR: 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return char.class; 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STRING: 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return String.class; 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR_SEQUENCE: 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return CharSequence.class; 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case URI: 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Uri.class; 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BITMAP: 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Bitmap.class; 841d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert case BUNDLE: 842d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert return Bundle.class; 843499cb9f516062b654952d282f211bee44c31a3c2Winson Chung case INTENT: 844499cb9f516062b654952d282f211bee44c31a3c2Winson Chung return Intent.class; 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 851037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public void apply(View root, ViewGroup rootParent) { 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View view = root.findViewById(viewId); 8532b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (view == null) return; 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Class param = getParameterType(); 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (param == null) { 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ActionException("bad type: " + this.type); 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Class klass = view.getClass(); 861a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy Method method; 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method = klass.getMethod(this.methodName, getParameterType()); 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (NoSuchMethodException ex) { 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ActionException("view: " + klass.getName() + " doesn't have method: " 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + this.methodName + "(" + param.getName() + ")"); 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!method.isAnnotationPresent(RemotableViewMethod.class)) { 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ActionException("view: " + klass.getName() 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " can't use method with RemoteViews: " 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + this.methodName + "(" + param.getName() + ")"); 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 877a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy //noinspection ConstantIfStatement 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d("RemoteViews", "view: " + klass.getName() + " calling method: " 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + this.methodName + "(" + param.getName() + ") with " 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (this.value == null ? "null" : this.value.getClass().getName())); 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method.invoke(view, this.value); 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (Exception ex) { 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ActionException(ex); 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8893ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 8903ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung @Override 8913ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung public void updateMemoryUsageEstimate(MemoryUsageCounter counter) { 8923ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // We currently only calculate Bitmap memory usage 8933ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung switch (this.type) { 8943ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung case BITMAP: 8953ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung if (this.value != null) { 8963ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung final Bitmap b = (Bitmap) this.value; 8973ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung final Bitmap.Config c = b.getConfig(); 898f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato // If we don't know, be pessimistic and assume 4 8993ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung int bpp = 4; 900f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato if (c != null) { 901f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato switch (c) { 902f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato case ALPHA_8: 903f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato bpp = 1; 904f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato break; 905f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato case RGB_565: 906f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato case ARGB_4444: 907f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato bpp = 2; 908f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato break; 909f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato case ARGB_8888: 910f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato bpp = 4; 911f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato break; 912f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato } 9133ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 9143ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung counter.bitmapIncrement(b.getWidth() * b.getHeight() * bpp); 9153ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 9163ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung break; 9173ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung default: 9183ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung break; 9193ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 9203ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9231162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey /** 9241162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * Equivalent to calling {@link ViewGroup#addView(View)} after inflating the 9251162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * given {@link RemoteViews}, or calling {@link ViewGroup#removeAllViews()} 9261162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * when null. This allows users to build "nested" {@link RemoteViews}. 9271162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey */ 9281162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey private class ViewGroupAction extends Action { 9291162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public ViewGroupAction(int viewId, RemoteViews nestedViews) { 9301162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey this.viewId = viewId; 9311162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey this.nestedViews = nestedViews; 9321162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 9331162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 9341162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public ViewGroupAction(Parcel parcel) { 9351162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey viewId = parcel.readInt(); 9361162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey nestedViews = parcel.readParcelable(null); 9371162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 9381162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 9391162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public void writeToParcel(Parcel dest, int flags) { 9401162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey dest.writeInt(TAG); 9411162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey dest.writeInt(viewId); 9421162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey dest.writeParcelable(nestedViews, 0 /* no flags */); 9431162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 9441162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 9451162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey @Override 946037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public void apply(View root, ViewGroup rootParent) { 9471162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey final Context context = root.getContext(); 9481162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey final ViewGroup target = (ViewGroup) root.findViewById(viewId); 9492b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (target == null) return; 9501162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey if (nestedViews != null) { 9511162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey // Inflate nested views and add as children 9521162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey target.addView(nestedViews.apply(context, target)); 9532b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato } else { 9541162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey // Clear all children when nested views omitted 9551162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey target.removeAllViews(); 9561162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 9571162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 9581162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 9593ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung @Override 9603ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung public void updateMemoryUsageEstimate(MemoryUsageCounter counter) { 9613ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung if (nestedViews != null) { 9623ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung counter.bitmapIncrement(nestedViews.estimateBitmapMemoryUsage()); 9633ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 9643ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 9653ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 9661162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey int viewId; 9671162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey RemoteViews nestedViews; 9681162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 9691162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public final static int TAG = 4; 9701162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 973820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * Helper action to set compound drawables on a TextView. Supports relative 974820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * (s/t/e/b) or cardinal (l/t/r/b) arrangement. 975820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler */ 976820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler private class TextViewDrawableAction extends Action { 977820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler public TextViewDrawableAction(int viewId, boolean isRelative, int d1, int d2, int d3, int d4) { 978820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler this.viewId = viewId; 979820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler this.isRelative = isRelative; 980820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler this.d1 = d1; 981820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler this.d2 = d2; 982820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler this.d3 = d3; 983820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler this.d4 = d4; 984820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } 985820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler 986820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler public TextViewDrawableAction(Parcel parcel) { 987820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler viewId = parcel.readInt(); 988820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler isRelative = (parcel.readInt() != 0); 989820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler d1 = parcel.readInt(); 990820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler d2 = parcel.readInt(); 991820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler d3 = parcel.readInt(); 992820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler d4 = parcel.readInt(); 993820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } 994820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler 995820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler public void writeToParcel(Parcel dest, int flags) { 996820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler dest.writeInt(TAG); 997820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler dest.writeInt(viewId); 998820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler dest.writeInt(isRelative ? 1 : 0); 999820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler dest.writeInt(d1); 1000820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler dest.writeInt(d2); 1001820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler dest.writeInt(d3); 1002820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler dest.writeInt(d4); 1003820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } 1004820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler 1005820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler @Override 1006820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler public void apply(View root, ViewGroup rootParent) { 1007820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler final Context context = root.getContext(); 1008820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler final TextView target = (TextView) root.findViewById(viewId); 1009820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler if (target == null) return; 1010820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler if (isRelative) { 1011820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler target.setCompoundDrawablesRelativeWithIntrinsicBounds(d1, d2, d3, d4); 1012820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } else { 1013820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler target.setCompoundDrawablesWithIntrinsicBounds(d1, d2, d3, d4); 1014820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } 1015820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } 1016820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler 1017820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler int viewId; 1018820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler boolean isRelative = false; 1019820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler int d1, d2, d3, d4; 1020820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler 1021820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler public final static int TAG = 11; 1022820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } 1023820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler 1024820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler /** 10253ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung * Simple class used to keep track of memory usage in a RemoteViews. 10263ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung * 10273ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung */ 10283ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung private class MemoryUsageCounter { 10293ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung public void clear() { 10303ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung mBitmapHeapMemoryUsage = 0; 10313ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 10323ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 10333ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung public void bitmapIncrement(int numBytes) { 10343ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung mBitmapHeapMemoryUsage += numBytes; 10353ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 10363ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 10373ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung public int getBitmapHeapMemoryUsage() { 10383ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung return mBitmapHeapMemoryUsage; 10393ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 10403ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 10413ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung int mBitmapHeapMemoryUsage; 10423ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 10433ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 10443ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung /** 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new RemoteViews object that will display the views contained 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the specified layout file. 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param packageName Name of the package that contains the layout resource 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param layoutId The id of the layout resource 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RemoteViews(String packageName, int layoutId) { 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackage = packageName; 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutId = layoutId; 10543ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 10553ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // setup the memory usage statistics 10563ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung mMemoryUsageCounter = new MemoryUsageCounter(); 10573ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung recalculateMemoryUsage(); 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reads a RemoteViews object from a parcel. 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parcel 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RemoteViews(Parcel parcel) { 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackage = parcel.readString(); 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutId = parcel.readInt(); 1068ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen mIsWidgetCollectionChild = parcel.readInt() == 1 ? true : false; 1069ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = parcel.readInt(); 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (count > 0) { 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActions = new ArrayList<Action>(count); 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<count; i++) { 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int tag = parcel.readInt(); 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (tag) { 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SetOnClickPendingIntent.TAG: 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActions.add(new SetOnClickPendingIntent(parcel)); 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SetDrawableParameters.TAG: 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActions.add(new SetDrawableParameters(parcel)); 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ReflectionAction.TAG: 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActions.add(new ReflectionAction(parcel)); 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 10851162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey case ViewGroupAction.TAG: 10861162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey mActions.add(new ViewGroupAction(parcel)); 10871162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey break; 10882dd2197805edb4d9547b143deef2226413218f4cAdam Cohen case ReflectionActionWithoutParams.TAG: 10892dd2197805edb4d9547b143deef2226413218f4cAdam Cohen mActions.add(new ReflectionActionWithoutParams(parcel)); 10902dd2197805edb4d9547b143deef2226413218f4cAdam Cohen break; 10911480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen case SetEmptyView.TAG: 10921480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen mActions.add(new SetEmptyView(parcel)); 10931480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen break; 1094ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen case SetPendingIntentTemplate.TAG: 1095ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen mActions.add(new SetPendingIntentTemplate(parcel)); 1096ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen break; 109735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen case SetOnClickFillInIntent.TAG: 109835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen mActions.add(new SetOnClickFillInIntent(parcel)); 109935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen break; 1100037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung case SetRemoteViewsAdapterIntent.TAG: 1101037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung mActions.add(new SetRemoteViewsAdapterIntent(parcel)); 1102037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung break; 1103820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler case TextViewDrawableAction.TAG: 1104820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler mActions.add(new TextViewDrawableAction(parcel)); 1105820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler break; 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ActionException("Tag " + tag + " not found"); 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11113ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 11123ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // setup the memory usage statistics 11133ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung mMemoryUsageCounter = new MemoryUsageCounter(); 11143ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung recalculateMemoryUsage(); 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11173030193dc179b3010f2dd3bffe9c1dec54da38fcGilles Debunne @Override 111818e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato public RemoteViews clone() { 111918e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato final RemoteViews that = new RemoteViews(mPackage, mLayoutId); 112018e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato if (mActions != null) { 112118e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato that.mActions = (ArrayList<Action>)mActions.clone(); 112218e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato } 11233ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 11243ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // update the memory usage stats of the cloned RemoteViews 11253ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung that.recalculateMemoryUsage(); 112618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato return that; 112718e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato } 112818e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPackage() { 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackage; 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getLayoutId() { 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLayoutId; 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11373ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung /* 1138ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * This flag indicates whether this RemoteViews object is being created from a 1139ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * RemoteViewsService for use as a child of a widget collection. This flag is used 1140ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * to determine whether or not certain features are available, in particular, 1141ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * setting on click extras and setting on click pending intents. The former is enabled, 1142ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * and the latter disabled when this flag is true. 1143ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen */ 1144ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen void setIsWidgetCollectionChild(boolean isWidgetCollectionChild) { 1145ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen mIsWidgetCollectionChild = isWidgetCollectionChild; 1146ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 1147ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 1148ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen /** 11493ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung * Updates the memory usage statistics. 11503ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung */ 11513ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung private void recalculateMemoryUsage() { 11523ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung mMemoryUsageCounter.clear(); 11533ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 11543ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // Accumulate the memory usage for each action 11553ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung if (mActions != null) { 11563ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung final int count = mActions.size(); 11573ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung for (int i= 0; i < count; ++i) { 11583ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung mActions.get(i).updateMemoryUsageEstimate(mMemoryUsageCounter); 11593ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 11603ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 11613ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 11623ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 11633ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung /** 11643ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung * Returns an estimate of the bitmap heap memory usage for this RemoteViews. 11653ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung */ 11663ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung int estimateBitmapMemoryUsage() { 11673ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung return mMemoryUsageCounter.getBitmapHeapMemoryUsage(); 11683ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 11693ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 11703ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung /** 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add an action to be executed on the remote side when apply is called. 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param a The action to add 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void addAction(Action a) { 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActions == null) { 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActions = new ArrayList<Action>(); 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActions.add(a); 11803ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 11813ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // update the memory usage stats 11823ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung a.updateMemoryUsageEstimate(mMemoryUsageCounter); 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11841162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 11851162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey /** 11861162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * Equivalent to calling {@link ViewGroup#addView(View)} after inflating the 11871162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * given {@link RemoteViews}. This allows users to build "nested" 11881162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * {@link RemoteViews}. In cases where consumers of {@link RemoteViews} may 11891162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * recycle layouts, use {@link #removeAllViews(int)} to clear any existing 11901162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * children. 11911162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * 11921162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * @param viewId The id of the parent {@link ViewGroup} to add child into. 11931162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * @param nestedView {@link RemoteViews} that describes the child. 11941162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey */ 11951162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public void addView(int viewId, RemoteViews nestedView) { 11961162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey addAction(new ViewGroupAction(viewId, nestedView)); 11971162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 11981162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 11991162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey /** 12001162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * Equivalent to calling {@link ViewGroup#removeAllViews()}. 12011162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * 12021162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * @param viewId The id of the parent {@link ViewGroup} to remove all 12031162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * children from. 12041162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey */ 12051162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public void removeAllViews(int viewId) { 12061162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey addAction(new ViewGroupAction(viewId, null)); 12071162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 12081162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12100b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * Equivalent to calling {@link AdapterViewAnimator#showNext()} 12112dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * 12120b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * @param viewId The id of the view on which to call {@link AdapterViewAnimator#showNext()} 12132dd2197805edb4d9547b143deef2226413218f4cAdam Cohen */ 12142dd2197805edb4d9547b143deef2226413218f4cAdam Cohen public void showNext(int viewId) { 12152dd2197805edb4d9547b143deef2226413218f4cAdam Cohen addAction(new ReflectionActionWithoutParams(viewId, "showNext")); 12162dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 12172dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 12182dd2197805edb4d9547b143deef2226413218f4cAdam Cohen /** 12190b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * Equivalent to calling {@link AdapterViewAnimator#showPrevious()} 12202dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * 12210b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * @param viewId The id of the view on which to call {@link AdapterViewAnimator#showPrevious()} 12222dd2197805edb4d9547b143deef2226413218f4cAdam Cohen */ 12232dd2197805edb4d9547b143deef2226413218f4cAdam Cohen public void showPrevious(int viewId) { 12242dd2197805edb4d9547b143deef2226413218f4cAdam Cohen addAction(new ReflectionActionWithoutParams(viewId, "showPrevious")); 12252dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 12262dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 12272dd2197805edb4d9547b143deef2226413218f4cAdam Cohen /** 12280b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * Equivalent to calling {@link AdapterViewAnimator#setDisplayedChild(int)} 12290b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * 12300b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * @param viewId The id of the view on which to call 12310b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * {@link AdapterViewAnimator#setDisplayedChild(int)} 12320b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen */ 12330b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen public void setDisplayedChild(int viewId, int childIndex) { 12340b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen setInt(viewId, "setDisplayedChild", childIndex); 12350b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen } 12360b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen 12370b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen /** 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling View.setVisibility 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose visibility should change 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param visibility The new visibility for the view 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setViewVisibility(int viewId, int visibility) { 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInt(viewId, "setVisibility", visibility); 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1246ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling TextView.setText 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose text should change 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param text The new text for the view 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTextViewText(int viewId, CharSequence text) { 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setCharSequence(viewId, "setText", text); 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1258820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * Equivalent to calling 1259820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * {@link TextView#setCompoundDrawablesWithIntrinsicBounds(int, int, int, int)}. 1260820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * 1261820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param viewId The id of the view whose text should change 1262820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param left The id of a drawable to place to the left of the text, or 0 1263820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param top The id of a drawable to place above the text, or 0 1264820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param right The id of a drawable to place to the right of the text, or 0 1265820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param bottom The id of a drawable to place below the text, or 0 1266820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler */ 1267820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler public void setTextViewCompoundDrawables(int viewId, int left, int top, int right, int bottom) { 1268820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler addAction(new TextViewDrawableAction(viewId, false, left, top, right, bottom)); 1269820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } 1270820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler 1271820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler /** 1272820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * Equivalent to calling {@link 1273820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * TextView#setCompoundDrawablesRelativeWithIntrinsicBounds(int, int, int, int)}. 1274820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * 1275820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param viewId The id of the view whose text should change 1276820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param start The id of a drawable to place before the text (relative to the 1277820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * layout direction), or 0 1278820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param top The id of a drawable to place above the text, or 0 1279820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param end The id of a drawable to place after the text, or 0 1280820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param bottom The id of a drawable to place below the text, or 0 1281820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler */ 1282820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler public void setTextViewCompoundDrawablesRelative(int viewId, int start, int top, int end, int bottom) { 1283820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler addAction(new TextViewDrawableAction(viewId, true, start, top, end, bottom)); 1284820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } 1285820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler 1286820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler /** 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling ImageView.setImageResource 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose drawable should change 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param srcId The new resource id for the drawable 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setImageViewResource(int viewId, int srcId) { 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInt(viewId, "setImageResource", srcId); 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling ImageView.setImageURI 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose drawable should change 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param uri The Uri for the image 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setImageViewUri(int viewId, Uri uri) { 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setUri(viewId, "setImageURI", uri); 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling ImageView.setImageBitmap 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 130993dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view whose bitmap should change 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bitmap The new Bitmap for the drawable 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setImageViewBitmap(int viewId, Bitmap bitmap) { 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBitmap(viewId, "setImageBitmap", bitmap); 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13171480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen * Equivalent to calling AdapterView.setEmptyView 13181480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen * 13191480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen * @param viewId The id of the view on which to set the empty view 13201480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen * @param emptyViewId The view id of the empty view 13211480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen */ 13221480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen public void setEmptyView(int viewId, int emptyViewId) { 13231480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen addAction(new SetEmptyView(viewId, emptyViewId)); 13241480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 13251480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 13261480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen /** 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling {@link Chronometer#setBase Chronometer.setBase}, 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Chronometer#setFormat Chronometer.setFormat}, 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and {@link Chronometer#start Chronometer.start()} or 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Chronometer#stop Chronometer.stop()}. 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 133293dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the {@link Chronometer} to change 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param base The time at which the timer would have read 0:00. This 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * time should be based off of 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.os.SystemClock#elapsedRealtime SystemClock.elapsedRealtime()}. 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param format The Chronometer format string, or null to 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * simply display the timer value. 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param started True if you want the clock to be started, false if not. 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setChronometer(int viewId, long base, String format, boolean started) { 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setLong(viewId, "setBase", base); 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setString(viewId, "setFormat", format); 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBoolean(viewId, "setStarted", started); 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling {@link ProgressBar#setMax ProgressBar.setMax}, 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ProgressBar#setProgress ProgressBar.setProgress}, and 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ProgressBar#setIndeterminate ProgressBar.setIndeterminate} 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If indeterminate is true, then the values for max and progress are ignored. 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 135393dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the {@link ProgressBar} to change 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param max The 100% value for the progress bar 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param progress The current value of the progress bar. 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param indeterminate True if the progress bar is indeterminate, 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * false if not. 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setProgressBar(int viewId, int max, int progress, 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean indeterminate) { 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBoolean(viewId, "setIndeterminate", indeterminate); 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!indeterminate) { 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInt(viewId, "setMax", max); 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInt(viewId, "setProgress", progress); 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.View#setOnClickListener(android.view.View.OnClickListener)} 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to launch the provided {@link PendingIntent}. 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 137335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * When setting the on-click action of items within collections (eg. {@link ListView}, 137435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * {@link StackView} etc.), this method will not work. Instead, use {@link 137535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * RemoteViews#setPendingIntentTemplate(int, PendingIntent) in conjunction with 137635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * RemoteViews#setOnClickFillInIntent(int, Intent). 137735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view that will trigger the {@link PendingIntent} when clicked 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pendingIntent The {@link PendingIntent} to send when user clicks 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnClickPendingIntent(int viewId, PendingIntent pendingIntent) { 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new SetOnClickPendingIntent(viewId, pendingIntent)); 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 138635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * When using collections (eg. {@link ListView}, {@link StackView} etc.) in widgets, it is very 138735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * costly to set PendingIntents on the individual items, and is hence not permitted. Instead 138835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * this method should be used to set a single PendingIntent template on the collection, and 138935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * individual items can differentiate their on-click behavior using 139035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * {@link RemoteViews#setOnClickFillInIntent(int, Intent)}. 1391ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * 1392ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * @param viewId The id of the collection who's children will use this PendingIntent template 1393ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * when clicked 1394ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * @param pendingIntentTemplate The {@link PendingIntent} to be combined with extras specified 1395ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * by a child of viewId and executed when that child is clicked 1396ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen */ 1397ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen public void setPendingIntentTemplate(int viewId, PendingIntent pendingIntentTemplate) { 1398ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen addAction(new SetPendingIntentTemplate(viewId, pendingIntentTemplate)); 1399ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 1400ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 1401ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen /** 140235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * When using collections (eg. {@link ListView}, {@link StackView} etc.) in widgets, it is very 140335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * costly to set PendingIntents on the individual items, and is hence not permitted. Instead 140435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * a single PendingIntent template can be set on the collection, see {@link 140535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * RemoteViews#setPendingIntentTemplate(int, PendingIntent)}, and the individual on-click 140635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * action of a given item can be distinguished by setting a fillInIntent on that item. The 140735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * fillInIntent is then combined with the PendingIntent template in order to determine the final 140835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * intent which will be executed when the item is clicked. This works as follows: any fields 140935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * which are left blank in the PendingIntent template, but are provided by the fillInIntent 141035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * will be overwritten, and the resulting PendingIntent will be used. 141135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * 141235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * 141335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * of the PendingIntent template will then be filled in with the associated fields that are 141435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * set in fillInIntent. See {@link Intent#fillIn(Intent, int)} for more details. 141535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * 141635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * @param viewId The id of the view on which to set the fillInIntent 141735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * @param fillInIntent The intent which will be combined with the parent's PendingIntent 141835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * in order to determine the on-click behavior of the view specified by viewId 141935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen */ 142035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen public void setOnClickFillInIntent(int viewId, Intent fillInIntent) { 142135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen addAction(new SetOnClickFillInIntent(viewId, fillInIntent)); 142235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 142335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 142435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen /** 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling a combination of {@link Drawable#setAlpha(int)}, 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Drawable#setColorFilter(int, android.graphics.PorterDuff.Mode)}, 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and/or {@link Drawable#setLevel(int)} on the {@link Drawable} of a given 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * view. 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You can omit specific calls by marking their values with null or -1. 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view that contains the target 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Drawable} 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param targetBackground If true, apply these parameters to the 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Drawable} returned by 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.View#getBackground()}. Otherwise, assume 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the target view is an {@link ImageView} and apply them to 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ImageView#getDrawable()}. 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param alpha Specify an alpha value for the drawable, or -1 to leave 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unchanged. 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param colorFilter Specify a color for a 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.graphics.ColorFilter} for this drawable, or -1 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to leave unchanged. 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param mode Specify a PorterDuff mode for this drawable, or null to leave 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unchanged. 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param level Specify the level for the drawable, or -1 to leave 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unchanged. 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDrawableParameters(int viewId, boolean targetBackground, int alpha, 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int colorFilter, PorterDuff.Mode mode, int level) { 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new SetDrawableParameters(viewId, targetBackground, alpha, 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project colorFilter, mode, level)); 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling {@link android.widget.TextView#setTextColor(int)}. 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 145993dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view whose text color should change 14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param color Sets the text color for all the states (normal, selected, 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * focused) to be this color. 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTextColor(int viewId, int color) { 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInt(viewId, "setTextColor", color); 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1467592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1468499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * Equivalent to calling {@link android.widget.AbsListView#setRemoteViewsAdapter(Intent)}. 1469499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * 1470037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * @param appWidgetId The id of the app widget which contains the specified view. (This 1471037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * parameter is ignored in this deprecated method) 147293dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the {@link AbsListView} 147381f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * @param intent The intent of the service which will be 147481f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * providing data to the RemoteViewsAdapter 1475037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * @deprecated This method has been deprecated. See 1476037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * {@link android.widget.RemoteViews#setRemoteAdapter(int, Intent)} 147781f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung */ 1478037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung @Deprecated 147981f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung public void setRemoteAdapter(int appWidgetId, int viewId, Intent intent) { 1480037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung setRemoteAdapter(viewId, intent); 1481037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 1482037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 1483037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung /** 1484037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * Equivalent to calling {@link android.widget.AbsListView#setRemoteViewsAdapter(Intent)}. 1485037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * Can only be used for App Widgets. 1486037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * 148793dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the {@link AbsListView} 1488037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * @param intent The intent of the service which will be 1489037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * providing data to the RemoteViewsAdapter 1490037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung */ 1491037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public void setRemoteAdapter(int viewId, Intent intent) { 1492037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung addAction(new SetRemoteViewsAdapterIntent(viewId, intent)); 1493499cb9f516062b654952d282f211bee44c31a3c2Winson Chung } 1494499cb9f516062b654952d282f211bee44c31a3c2Winson Chung 1495499cb9f516062b654952d282f211bee44c31a3c2Winson Chung /** 1496499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * Equivalent to calling {@link android.widget.AbsListView#smoothScrollToPosition(int, int)}. 1497499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * 149893dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view to change 1499499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * @param position Scroll to this adapter position 1500499cb9f516062b654952d282f211bee44c31a3c2Winson Chung */ 1501499cb9f516062b654952d282f211bee44c31a3c2Winson Chung public void setScrollPosition(int viewId, int position) { 1502499cb9f516062b654952d282f211bee44c31a3c2Winson Chung setInt(viewId, "smoothScrollToPosition", position); 1503499cb9f516062b654952d282f211bee44c31a3c2Winson Chung } 1504499cb9f516062b654952d282f211bee44c31a3c2Winson Chung 1505499cb9f516062b654952d282f211bee44c31a3c2Winson Chung /** 1506499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * Equivalent to calling {@link android.widget.AbsListView#smoothScrollToPosition(int, int)}. 1507499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * 150893dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view to change 150995362595ed4a42aec87b4d166092b30c8139d220Winson Chung * @param offset Scroll by this adapter position offset 1510499cb9f516062b654952d282f211bee44c31a3c2Winson Chung */ 1511499cb9f516062b654952d282f211bee44c31a3c2Winson Chung public void setRelativeScrollPosition(int viewId, int offset) { 1512499cb9f516062b654952d282f211bee44c31a3c2Winson Chung setInt(viewId, "smoothScrollByOffset", offset); 1513499cb9f516062b654952d282f211bee44c31a3c2Winson Chung } 1514499cb9f516062b654952d282f211bee44c31a3c2Winson Chung 1515499cb9f516062b654952d282f211bee44c31a3c2Winson Chung /** 1516592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one boolean on a view in the layout for this RemoteViews. 1517592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 151893dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1519592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1520592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1521592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setBoolean(int viewId, String methodName, boolean value) { 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.BOOLEAN, value)); 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1526592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1527592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one byte on a view in the layout for this RemoteViews. 1528592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 152993dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1530592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1531592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1532592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setByte(int viewId, String methodName, byte value) { 15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.BYTE, value)); 15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1537592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1538592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one short on a view in the layout for this RemoteViews. 1539592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 154093dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1541592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1542592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1543592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setShort(int viewId, String methodName, short value) { 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.SHORT, value)); 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1548592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1549592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one int on a view in the layout for this RemoteViews. 1550592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 155193dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1552592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1553592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1554592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setInt(int viewId, String methodName, int value) { 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.INT, value)); 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1559592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1560592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one long on a view in the layout for this RemoteViews. 1561592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 156293dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1563592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1564592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1565592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setLong(int viewId, String methodName, long value) { 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.LONG, value)); 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1570592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1571592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one float on a view in the layout for this RemoteViews. 1572592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 157393dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1574592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1575592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1576592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFloat(int viewId, String methodName, float value) { 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.FLOAT, value)); 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1581592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1582592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one double on a view in the layout for this RemoteViews. 1583592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 158493dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1585592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1586592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1587592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDouble(int viewId, String methodName, double value) { 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.DOUBLE, value)); 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1592592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1593592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one char on a view in the layout for this RemoteViews. 1594592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 159593dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1596592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1597592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1598592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setChar(int viewId, String methodName, char value) { 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.CHAR, value)); 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1603592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1604592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one String on a view in the layout for this RemoteViews. 1605592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 160693dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1607592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1608592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1609592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setString(int viewId, String methodName, String value) { 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.STRING, value)); 16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1614592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1615592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one CharSequence on a view in the layout for this RemoteViews. 1616592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 161793dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1618592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1619592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1620592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setCharSequence(int viewId, String methodName, CharSequence value) { 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.CHAR_SEQUENCE, value)); 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1625592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1626592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one Uri on a view in the layout for this RemoteViews. 1627592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 162893dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1629592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1630592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1631592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setUri(int viewId, String methodName, Uri value) { 16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.URI, value)); 16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1636592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1637592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one Bitmap on a view in the layout for this RemoteViews. 1638592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @more 1639592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * <p class="note">The bitmap will be flattened into the parcel if this object is 1640592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * sent across processes, so it may end up using a lot of memory, and may be fairly slow.</p> 1641592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 164293dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1643592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1644592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1645592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setBitmap(int viewId, String methodName, Bitmap value) { 16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.BITMAP, value)); 16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1651d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert * Call a method taking one Bundle on a view in the layout for this RemoteViews. 1652d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert * 165393dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1654d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert * @param methodName The name of the method to call. 1655d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert * @param value The value to pass to the method. 1656d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert */ 1657d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert public void setBundle(int viewId, String methodName, Bundle value) { 1658d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert addAction(new ReflectionAction(viewId, methodName, ReflectionAction.BUNDLE, value)); 1659d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert } 1660d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert 1661d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert /** 166293dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * Call a method taking one Intent on a view in the layout for this RemoteViews. 1663499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * 166493dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 166593dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param methodName The name of the method to call. 166693dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param value The {@link android.content.Intent} to pass the method. 1667499cb9f516062b654952d282f211bee44c31a3c2Winson Chung */ 1668499cb9f516062b654952d282f211bee44c31a3c2Winson Chung public void setIntent(int viewId, String methodName, Intent value) { 1669499cb9f516062b654952d282f211bee44c31a3c2Winson Chung addAction(new ReflectionAction(viewId, methodName, ReflectionAction.INTENT, value)); 1670499cb9f516062b654952d282f211bee44c31a3c2Winson Chung } 1671499cb9f516062b654952d282f211bee44c31a3c2Winson Chung 1672499cb9f516062b654952d282f211bee44c31a3c2Winson Chung /** 1673e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov * Equivalent to calling View.setContentDescription 1674e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov * 1675e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov * @param viewId The id of the view whose content description should change 1676e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov * @param contentDescription The new content description for the view 1677e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov */ 1678e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov public void setContentDescription(int viewId, CharSequence contentDescription) { 1679e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov setCharSequence(viewId, "setContentDescription", contentDescription); 1680e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov } 1681e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov 1682e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov /** 16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inflates the view hierarchy represented by this object and applies 16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * all of the actions. 16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>Caller beware: this may throw</strong> 16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context Default context to use 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parent Parent that the resulting view hierarchy will be attached to. This method 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * does <strong>not</strong> attach the hierarchy. The caller should do so when appropriate. 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The inflated view hierarchy 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View apply(Context context, ViewGroup parent) { 1694a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy View result; 16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context c = prepareContext(context); 16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1698a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy LayoutInflater inflater = (LayoutInflater) 1699a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inflater = inflater.cloneInContext(c); 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inflater.setFilter(this); 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = inflater.inflate(mLayoutId, parent, false); 17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1706037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung performApply(result, parent); 17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Applies all of the actions to the provided view. 17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>Caller beware: this may throw</strong> 17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param v The view to apply the actions to. This should be the result of 17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the {@link #apply(Context,ViewGroup)} call. 17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void reapply(Context context, View v) { 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project prepareContext(context); 1721037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung performApply(v, (ViewGroup) v.getParent()); 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1724037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung private void performApply(View v, ViewGroup parent) { 17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActions != null) { 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mActions.size(); 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Action a = mActions.get(i); 1729037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung a.apply(v, parent); 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context prepareContext(Context context) { 1735a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy Context c; 17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String packageName = mPackage; 17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (packageName != null) { 17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1740870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy c = context.createPackageContext(packageName, Context.CONTEXT_RESTRICTED); 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (NameNotFoundException e) { 17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOG_TAG, "Package name " + packageName + " not found"); 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c = context; 17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c = context; 17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return c; 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* (non-Javadoc) 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used to restrict the views which can be inflated 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.view.LayoutInflater.Filter#onLoadClass(java.lang.Class) 17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1757e6ac8b9aade9443ab8456c8f7a47cdfba3b70266Gilles Debunne public boolean onLoadClass(Class clazz) { 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return clazz.isAnnotationPresent(RemoteView.class); 17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(mPackage); 17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(mLayoutId); 1768ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen dest.writeInt(mIsWidgetCollectionChild ? 1 : 0); 17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count; 17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActions != null) { 17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count = mActions.size(); 17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count = 0; 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(count); 17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<count; i++) { 17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Action a = mActions.get(i); 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.writeToParcel(dest, 0); 17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parcelable.Creator that instantiates RemoteViews objects 17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<RemoteViews> CREATOR = new Parcelable.Creator<RemoteViews>() { 17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RemoteViews createFromParcel(Parcel parcel) { 17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RemoteViews(parcel); 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RemoteViews[] newArray(int size) { 17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RemoteViews[size]; 17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1795