RemoteViews.java revision 0b96a57c851af2f66e3bc738035478efb3c1957e
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 19ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohenimport java.lang.annotation.ElementType; 20ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohenimport java.lang.annotation.Retention; 21ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohenimport java.lang.annotation.RetentionPolicy; 22ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohenimport java.lang.annotation.Target; 23ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohenimport java.lang.reflect.Method; 24ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohenimport java.util.ArrayList; 25ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.PendingIntent; 271480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohenimport android.appwidget.AppWidgetHostView; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 29fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackbornimport android.content.Intent; 30fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackbornimport android.content.IntentSender; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PorterDuff; 347597065d6b0877ffc460b443fdb1595965ccd7b2Joe Onoratoimport android.graphics.Rect; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 37d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringertimport android.os.Bundle; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.RemotableViewMethod; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater.Filter; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View.OnClickListener; 48a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohenimport android.widget.AdapterView.OnItemClickListener; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A class that describes a view hierarchy that can be displayed in 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * another process. The hierarchy is inflated from a layout resource 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * file, and this class provides some basic operations for modifying 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the content of the inflated hierarchy. 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class RemoteViews implements Parcelable, Filter { 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String LOG_TAG = "RemoteViews"; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6281f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * The intent extra that contains the appWidgetId. 6381f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * @hide 6481f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung */ 6581f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung static final String EXTRA_REMOTEADAPTER_APPWIDGET_ID = "remoteAdapterAppWidgetId"; 6681f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung 6781f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung /** 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The package name of the package containing the layout 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resource. (Added to the parcel) 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 713030193dc179b3010f2dd3bffe9c1dec54da38fcGilles Debunne private final String mPackage; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The resource ID of the layout file. (Added to the parcel) 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 763030193dc179b3010f2dd3bffe9c1dec54da38fcGilles Debunne private final int mLayoutId; 77a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An array of actions to perform on the view tree once it has been 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inflated 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ArrayList<Action> mActions; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 843ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung /** 853ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung * A class to keep track of memory usage by this RemoteViews 863ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung */ 873ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung private MemoryUsageCounter mMemoryUsageCounter; 883ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 91ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * This flag indicates whether this RemoteViews object is being created from a 92ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * RemoteViewsService for use as a child of a widget collection. This flag is used 93ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * to determine whether or not certain features are available, in particular, 94ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * setting on click extras and setting on click pending intents. The former is enabled, 95ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * and the latter disabled when this flag is true. 96ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen */ 97ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen private boolean mIsWidgetCollectionChild = false; 98ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 99ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen /** 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This annotation indicates that a subclass of View is alllowed to be used 101a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy * with the {@link RemoteViews} mechanism. 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Target({ ElementType.TYPE }) 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Retention(RetentionPolicy.RUNTIME) 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public @interface RemoteView { 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Exception to send when something goes wrong executing an action 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class ActionException extends RuntimeException { 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ActionException(Exception ex) { 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(ex); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ActionException(String message) { 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(message); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 120a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class for all actions that can be performed on an 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inflated view. 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato * SUBCLASSES MUST BE IMMUTABLE SO CLONE WORKS!!!!! 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private abstract static class Action implements Parcelable { 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract void apply(View root) throws ActionException; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1333ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 1343ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung /** 1353ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung * Overridden by each class to report on it's own memory usage 1363ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung */ 1373ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung public void updateMemoryUsageEstimate(MemoryUsageCounter counter) { 1383ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // We currently only calculate Bitmap memory usage, so by default, don't do anything 1393ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // here 1403ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung return; 1413ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 142ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung 143ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung protected boolean startIntentSafely(Context context, PendingIntent pendingIntent, 144ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung Intent fillInIntent) { 145ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung try { 146ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung // TODO: Unregister this handler if PendingIntent.FLAG_ONE_SHOT? 147ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung context.startIntentSender( 148ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung pendingIntent.getIntentSender(), fillInIntent, 149ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung Intent.FLAG_ACTIVITY_NEW_TASK, 150ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung Intent.FLAG_ACTIVITY_NEW_TASK, 0); 151ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung } catch (IntentSender.SendIntentException e) { 152ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung android.util.Log.e(LOG_TAG, "Cannot send pending intent: ", e); 153ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung return false; 154ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung } catch (Exception e) { 155ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung android.util.Log.e(LOG_TAG, "Cannot send pending intent due to " + 156ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung "unknown exception: ", e); 157ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung return false; 158ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung } 159ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung return true; 160ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung } 161a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy } 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1631480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen private class SetEmptyView extends Action { 1641480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen int viewId; 1651480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen int emptyViewId; 1661480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 1671480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen public final static int TAG = 6; 1681480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 1691480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen SetEmptyView(int viewId, int emptyViewId) { 1701480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen this.viewId = viewId; 1711480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen this.emptyViewId = emptyViewId; 1721480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 1731480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 1741480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen SetEmptyView(Parcel in) { 1751480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen this.viewId = in.readInt(); 1761480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen this.emptyViewId = in.readInt(); 1771480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 1781480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 1791480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen public void writeToParcel(Parcel out, int flags) { 1801480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen out.writeInt(TAG); 1811480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen out.writeInt(this.viewId); 1821480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen out.writeInt(this.emptyViewId); 1831480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 1841480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 1851480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen @Override 1861480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen public void apply(View root) { 1871480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen final View view = root.findViewById(viewId); 1881480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen if (!(view instanceof AdapterView<?>)) return; 1891480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 1901480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen AdapterView<?> adapterView = (AdapterView<?>) view; 1911480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 1921480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen final View emptyView = root.findViewById(emptyViewId); 1931480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen if (emptyView == null) return; 1941480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 1951480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen adapterView.setEmptyView(emptyView); 1961480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 1971480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 1981480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 19935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen private class SetOnClickFillInIntent extends Action { 20035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen public SetOnClickFillInIntent(int id, Intent fillInIntent) { 20135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen this.viewId = id; 20235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen this.fillInIntent = fillInIntent; 20335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 20435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 20535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen public SetOnClickFillInIntent(Parcel parcel) { 20635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen viewId = parcel.readInt(); 20735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen fillInIntent = Intent.CREATOR.createFromParcel(parcel); 20835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 20935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 21035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen public void writeToParcel(Parcel dest, int flags) { 21135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen dest.writeInt(TAG); 21235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen dest.writeInt(viewId); 21335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen fillInIntent.writeToParcel(dest, 0 /* no flags */); 21435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 21535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 21635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen @Override 21735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen public void apply(View root) { 21835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen final View target = root.findViewById(viewId); 2192b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (target == null) return; 22035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 22135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen if (!mIsWidgetCollectionChild) { 22235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen Log.e("RemoteViews", "The method setOnClickFillInIntent is available " + 22335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen "only from RemoteViewsFactory (ie. on collection items)."); 22435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen return; 22535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 226a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen if (target == root) { 227a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen target.setTagInternal(com.android.internal.R.id.fillInIntent, fillInIntent); 228a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen } else if (target != null && fillInIntent != null) { 22935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen OnClickListener listener = new OnClickListener() { 23035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen public void onClick(View v) { 23135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen // Insure that this view is a child of an AdapterView 23235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen View parent = (View) v.getParent(); 23335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen while (!(parent instanceof AdapterView<?>) 23435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen && !(parent instanceof AppWidgetHostView)) { 23535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen parent = (View) parent.getParent(); 23635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 23735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 23835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen if (parent instanceof AppWidgetHostView) { 23935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen // Somehow they've managed to get this far without having 24035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen // and AdapterView as a parent. 24135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen Log.e("RemoteViews", "Collection item doesn't have AdapterView parent"); 24235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen return; 24335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 24435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 24535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen // Insure that a template pending intent has been set on an ancestor 24635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen if (!(parent.getTag() instanceof PendingIntent)) { 24735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen Log.e("RemoteViews", "Attempting setOnClickFillInIntent without" + 248a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen " calling setPendingIntentTemplate on parent."); 24935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen return; 25035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 25135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 25235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen PendingIntent pendingIntent = (PendingIntent) parent.getTag(); 25335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 25435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen final float appScale = v.getContext().getResources() 255a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen .getCompatibilityInfo().applicationScale; 25635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen final int[] pos = new int[2]; 25735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen v.getLocationOnScreen(pos); 25835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 25935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen final Rect rect = new Rect(); 26035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen rect.left = (int) (pos[0] * appScale + 0.5f); 26135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen rect.top = (int) (pos[1] * appScale + 0.5f); 26235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen rect.right = (int) ((pos[0] + v.getWidth()) * appScale + 0.5f); 26335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen rect.bottom = (int) ((pos[1] + v.getHeight()) * appScale + 0.5f); 26435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 26535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen fillInIntent.setSourceBounds(rect); 266ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung startIntentSafely(v.getContext(), pendingIntent, fillInIntent); 26735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 26835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 26935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen }; 27035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen target.setOnClickListener(listener); 27135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 27235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 27335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 27435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen int viewId; 27535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen Intent fillInIntent; 27635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 27735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen public final static int TAG = 9; 27835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 27935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 280ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen private class SetPendingIntentTemplate extends Action { 281ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen public SetPendingIntentTemplate(int id, PendingIntent pendingIntentTemplate) { 282ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen this.viewId = id; 283ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen this.pendingIntentTemplate = pendingIntentTemplate; 284ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 285ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 286ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen public SetPendingIntentTemplate(Parcel parcel) { 287ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen viewId = parcel.readInt(); 288ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen pendingIntentTemplate = PendingIntent.readPendingIntentOrNullFromParcel(parcel); 289ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 290ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 291ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen public void writeToParcel(Parcel dest, int flags) { 292ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen dest.writeInt(TAG); 293ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen dest.writeInt(viewId); 294ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen pendingIntentTemplate.writeToParcel(dest, 0 /* no flags */); 295ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 296ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 297ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen @Override 298ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen public void apply(View root) { 299ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen final View target = root.findViewById(viewId); 3002b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (target == null) return; 301ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 302ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen // If the view isn't an AdapterView, setting a PendingIntent template doesn't make sense 303ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen if (target instanceof AdapterView<?>) { 304a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen AdapterView<?> av = (AdapterView<?>) target; 305ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen // The PendingIntent template is stored in the view's tag. 306a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen OnItemClickListener listener = new OnItemClickListener() { 307a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen public void onItemClick(AdapterView<?> parent, View view, 308a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen int position, long id) { 309a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen // The view should be a frame layout 310a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen if (view instanceof ViewGroup) { 311a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen ViewGroup vg = (ViewGroup) view; 312a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen 313a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen // AdapterViews contain their children in a frame 314a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen // so we need to go one layer deeper here. 315a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen if (parent instanceof AdapterViewAnimator) { 316a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen vg = (ViewGroup) vg.getChildAt(0); 317a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen } 318a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen if (vg == null) return; 319a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen 320a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen Intent fillInIntent = null; 321a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen int childCount = vg.getChildCount(); 322a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen for (int i = 0; i < childCount; i++) { 323a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen Object tag = vg.getChildAt(i).getTag(com.android.internal.R.id.fillInIntent); 324a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen if (tag instanceof Intent) { 325a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen fillInIntent = (Intent) tag; 326a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen break; 327a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen } 328a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen } 329a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen if (fillInIntent == null) return; 330a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen 331a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen final float appScale = view.getContext().getResources() 332a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen .getCompatibilityInfo().applicationScale; 333a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen final int[] pos = new int[2]; 334a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen view.getLocationOnScreen(pos); 335a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen 336a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen final Rect rect = new Rect(); 337a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen rect.left = (int) (pos[0] * appScale + 0.5f); 338a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen rect.top = (int) (pos[1] * appScale + 0.5f); 339a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen rect.right = (int) ((pos[0] + view.getWidth()) * appScale + 0.5f); 340a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen rect.bottom = (int) ((pos[1] + view.getHeight()) * appScale + 0.5f); 341a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen 342a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen final Intent intent = new Intent(); 343a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen intent.setSourceBounds(rect); 344a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen startIntentSafely(view.getContext(), pendingIntentTemplate, fillInIntent); 345a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen } 346a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen } 347a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen }; 348a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen av.setOnItemClickListener(listener); 349a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen av.setTag(pendingIntentTemplate); 350ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } else { 351ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen Log.e("RemoteViews", "Cannot setPendingIntentTemplate on a view which is not" + 35235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen "an AdapterView (id: " + viewId + ")"); 353ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen return; 354ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 355ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 356ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 357ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen int viewId; 358ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen PendingIntent pendingIntentTemplate; 359ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 360ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen public final static int TAG = 8; 361ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 362ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.View#setOnClickListener(android.view.View.OnClickListener)} 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to launch the provided {@link PendingIntent}. 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class SetOnClickPendingIntent extends Action { 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SetOnClickPendingIntent(int id, PendingIntent pendingIntent) { 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.viewId = id; 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.pendingIntent = pendingIntent; 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 373ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SetOnClickPendingIntent(Parcel parcel) { 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project viewId = parcel.readInt(); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pendingIntent = PendingIntent.readPendingIntentOrNullFromParcel(parcel); 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 378ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(TAG); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(viewId); 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pendingIntent.writeToParcel(dest, 0 /* no flags */); 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 384ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void apply(View root) { 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View target = root.findViewById(viewId); 3882b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (target == null) return; 389ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 390ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen // If the view is an AdapterView, setting a PendingIntent on click doesn't make much 391ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen // sense, do they mean to set a PendingIntent template for the AdapterView's children? 392ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen if (mIsWidgetCollectionChild) { 39335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen Log.e("RemoteViews", "Cannot setOnClickPendingIntent for collection item " + 39435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen "(id: " + viewId + ")"); 395ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen // TODO: return; We'll let this slide until apps are up to date. 396ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 397ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target != null && pendingIntent != null) { 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OnClickListener listener = new OnClickListener() { 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onClick(View v) { 401a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey // Find target view location in screen coordinates and 402a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey // fill into PendingIntent before sending. 403a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey final float appScale = v.getContext().getResources() 404a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey .getCompatibilityInfo().applicationScale; 405a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey final int[] pos = new int[2]; 4067597065d6b0877ffc460b443fdb1595965ccd7b2Joe Onorato v.getLocationOnScreen(pos); 407a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey 408a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey final Rect rect = new Rect(); 409a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey rect.left = (int) (pos[0] * appScale + 0.5f); 410a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey rect.top = (int) (pos[1] * appScale + 0.5f); 411a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey rect.right = (int) ((pos[0] + v.getWidth()) * appScale + 0.5f); 412a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey rect.bottom = (int) ((pos[1] + v.getHeight()) * appScale + 0.5f); 413a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey 414a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey final Intent intent = new Intent(); 415a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey intent.setSourceBounds(rect); 416ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung startIntentSafely(v.getContext(), pendingIntent, intent); 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project target.setOnClickListener(listener); 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int viewId; 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PendingIntent pendingIntent; 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static int TAG = 1; 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling a combination of {@link Drawable#setAlpha(int)}, 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Drawable#setColorFilter(int, android.graphics.PorterDuff.Mode)}, 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and/or {@link Drawable#setLevel(int)} on the {@link Drawable} of a given view. 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These operations will be performed on the {@link Drawable} returned by the 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * target {@link View#getBackground()} by default. If targetBackground is false, 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * we assume the target is an {@link ImageView} and try applying the operations 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to {@link ImageView#getDrawable()}. 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You can omit specific calls by marking their values with null or -1. 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class SetDrawableParameters extends Action { 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SetDrawableParameters(int id, boolean targetBackground, int alpha, 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int colorFilter, PorterDuff.Mode mode, int level) { 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.viewId = id; 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.targetBackground = targetBackground; 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.alpha = alpha; 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.colorFilter = colorFilter; 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.filterMode = mode; 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.level = level; 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SetDrawableParameters(Parcel parcel) { 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project viewId = parcel.readInt(); 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetBackground = parcel.readInt() != 0; 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project alpha = parcel.readInt(); 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project colorFilter = parcel.readInt(); 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasMode = parcel.readInt() != 0; 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasMode) { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filterMode = PorterDuff.Mode.valueOf(parcel.readString()); 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filterMode = null; 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project level = parcel.readInt(); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(TAG); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(viewId); 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(targetBackground ? 1 : 0); 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(alpha); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(colorFilter); 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (filterMode != null) { 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(1); 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(filterMode.toString()); 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(0); 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(level); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void apply(View root) { 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View target = root.findViewById(viewId); 4842b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (target == null) return; 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Pick the correct drawable to modify for this view 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable targetDrawable = null; 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (targetBackground) { 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetDrawable = target.getBackground(); 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (target instanceof ImageView) { 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ImageView imageView = (ImageView) target; 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetDrawable = imageView.getDrawable(); 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 495a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy if (targetDrawable != null) { 496a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy // Perform modifications only if values are set correctly 497a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy if (alpha != -1) { 498a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy targetDrawable.setAlpha(alpha); 499a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy } 500a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy if (colorFilter != -1 && filterMode != null) { 501a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy targetDrawable.setColorFilter(colorFilter, filterMode); 502a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy } 503a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy if (level != -1) { 504a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy targetDrawable.setLevel(level); 505a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy } 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5083ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int viewId; 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean targetBackground; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int alpha; 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int colorFilter; 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PorterDuff.Mode filterMode; 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int level; 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static int TAG = 3; 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5192dd2197805edb4d9547b143deef2226413218f4cAdam Cohen private class ReflectionActionWithoutParams extends Action { 5202dd2197805edb4d9547b143deef2226413218f4cAdam Cohen int viewId; 5212dd2197805edb4d9547b143deef2226413218f4cAdam Cohen String methodName; 5222dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 5232dd2197805edb4d9547b143deef2226413218f4cAdam Cohen public final static int TAG = 5; 5242dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 5252dd2197805edb4d9547b143deef2226413218f4cAdam Cohen ReflectionActionWithoutParams(int viewId, String methodName) { 5262dd2197805edb4d9547b143deef2226413218f4cAdam Cohen this.viewId = viewId; 5272dd2197805edb4d9547b143deef2226413218f4cAdam Cohen this.methodName = methodName; 5282dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 5292dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 5302dd2197805edb4d9547b143deef2226413218f4cAdam Cohen ReflectionActionWithoutParams(Parcel in) { 5312dd2197805edb4d9547b143deef2226413218f4cAdam Cohen this.viewId = in.readInt(); 5322dd2197805edb4d9547b143deef2226413218f4cAdam Cohen this.methodName = in.readString(); 5332dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 5342dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 5352dd2197805edb4d9547b143deef2226413218f4cAdam Cohen public void writeToParcel(Parcel out, int flags) { 5362dd2197805edb4d9547b143deef2226413218f4cAdam Cohen out.writeInt(TAG); 5372dd2197805edb4d9547b143deef2226413218f4cAdam Cohen out.writeInt(this.viewId); 5382dd2197805edb4d9547b143deef2226413218f4cAdam Cohen out.writeString(this.methodName); 5392dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 5402dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 5412dd2197805edb4d9547b143deef2226413218f4cAdam Cohen @Override 5422dd2197805edb4d9547b143deef2226413218f4cAdam Cohen public void apply(View root) { 5432dd2197805edb4d9547b143deef2226413218f4cAdam Cohen final View view = root.findViewById(viewId); 5442b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (view == null) return; 5452dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 5462dd2197805edb4d9547b143deef2226413218f4cAdam Cohen Class klass = view.getClass(); 5472dd2197805edb4d9547b143deef2226413218f4cAdam Cohen Method method; 5482dd2197805edb4d9547b143deef2226413218f4cAdam Cohen try { 5492dd2197805edb4d9547b143deef2226413218f4cAdam Cohen method = klass.getMethod(this.methodName); 5502dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } catch (NoSuchMethodException ex) { 5512dd2197805edb4d9547b143deef2226413218f4cAdam Cohen throw new ActionException("view: " + klass.getName() + " doesn't have method: " 5522dd2197805edb4d9547b143deef2226413218f4cAdam Cohen + this.methodName + "()"); 5532dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 5542dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 5552dd2197805edb4d9547b143deef2226413218f4cAdam Cohen if (!method.isAnnotationPresent(RemotableViewMethod.class)) { 5562dd2197805edb4d9547b143deef2226413218f4cAdam Cohen throw new ActionException("view: " + klass.getName() 5572dd2197805edb4d9547b143deef2226413218f4cAdam Cohen + " can't use method with RemoteViews: " 5582dd2197805edb4d9547b143deef2226413218f4cAdam Cohen + this.methodName + "()"); 5592dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 5602dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 5612dd2197805edb4d9547b143deef2226413218f4cAdam Cohen try { 5622dd2197805edb4d9547b143deef2226413218f4cAdam Cohen //noinspection ConstantIfStatement 5632dd2197805edb4d9547b143deef2226413218f4cAdam Cohen if (false) { 5642dd2197805edb4d9547b143deef2226413218f4cAdam Cohen Log.d("RemoteViews", "view: " + klass.getName() + " calling method: " 5652dd2197805edb4d9547b143deef2226413218f4cAdam Cohen + this.methodName + "()"); 5662dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 5672dd2197805edb4d9547b143deef2226413218f4cAdam Cohen method.invoke(view); 5682dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } catch (Exception ex) { 5692dd2197805edb4d9547b143deef2226413218f4cAdam Cohen throw new ActionException(ex); 5702dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 5712dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 5722dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 5732dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class for the reflection actions. 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class ReflectionAction extends Action { 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int TAG = 2; 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int BOOLEAN = 1; 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int BYTE = 2; 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int SHORT = 3; 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int INT = 4; 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int LONG = 5; 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int FLOAT = 6; 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int DOUBLE = 7; 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int CHAR = 8; 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int STRING = 9; 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int CHAR_SEQUENCE = 10; 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int URI = 11; 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int BITMAP = 12; 592d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert static final int BUNDLE = 13; 593499cb9f516062b654952d282f211bee44c31a3c2Winson Chung static final int INTENT = 14; 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int viewId; 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String methodName; 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object value; 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ReflectionAction(int viewId, String methodName, int type, Object value) { 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.viewId = viewId; 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.methodName = methodName; 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.type = type; 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = value; 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ReflectionAction(Parcel in) { 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.viewId = in.readInt(); 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.methodName = in.readString(); 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.type = in.readInt(); 611a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy //noinspection ConstantIfStatement 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d("RemoteViews", "read viewId=0x" + Integer.toHexString(this.viewId) 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " methodName=" + this.methodName + " type=" + this.type); 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (this.type) { 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BOOLEAN: 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readInt() != 0; 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BYTE: 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readByte(); 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SHORT: 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = (short)in.readInt(); 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INT: 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readInt(); 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LONG: 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readLong(); 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FLOAT: 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readFloat(); 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DOUBLE: 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readDouble(); 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR: 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = (char)in.readInt(); 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STRING: 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readString(); 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR_SEQUENCE: 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case URI: 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = Uri.CREATOR.createFromParcel(in); 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BITMAP: 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = Bitmap.CREATOR.createFromParcel(in); 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 653d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert case BUNDLE: 654d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert this.value = in.readBundle(); 655d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert break; 656499cb9f516062b654952d282f211bee44c31a3c2Winson Chung case INTENT: 657499cb9f516062b654952d282f211bee44c31a3c2Winson Chung this.value = Intent.CREATOR.createFromParcel(in); 658499cb9f516062b654952d282f211bee44c31a3c2Winson Chung break; 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, int flags) { 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(TAG); 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(this.viewId); 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(this.methodName); 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(this.type); 669a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy //noinspection ConstantIfStatement 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d("RemoteViews", "write viewId=0x" + Integer.toHexString(this.viewId) 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " methodName=" + this.methodName + " type=" + this.type); 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (this.type) { 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BOOLEAN: 676a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeInt((Boolean) this.value ? 1 : 0); 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BYTE: 679a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeByte((Byte) this.value); 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SHORT: 682a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeInt((Short) this.value); 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INT: 685a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeInt((Integer) this.value); 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LONG: 688a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeLong((Long) this.value); 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FLOAT: 691a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeFloat((Float) this.value); 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DOUBLE: 694a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeDouble((Double) this.value); 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR: 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt((int)((Character)this.value).charValue()); 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STRING: 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString((String)this.value); 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR_SEQUENCE: 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextUtils.writeToParcel((CharSequence)this.value, out, flags); 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case URI: 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((Uri)this.value).writeToParcel(out, flags); 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BITMAP: 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((Bitmap)this.value).writeToParcel(out, flags); 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 711d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert case BUNDLE: 712d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert out.writeBundle((Bundle) this.value); 713d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert break; 714499cb9f516062b654952d282f211bee44c31a3c2Winson Chung case INTENT: 715499cb9f516062b654952d282f211bee44c31a3c2Winson Chung ((Intent)this.value).writeToParcel(out, flags); 716499cb9f516062b654952d282f211bee44c31a3c2Winson Chung break; 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Class getParameterType() { 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (this.type) { 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BOOLEAN: 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return boolean.class; 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BYTE: 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return byte.class; 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SHORT: 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return short.class; 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INT: 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return int.class; 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LONG: 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return long.class; 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FLOAT: 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return float.class; 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DOUBLE: 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return double.class; 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR: 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return char.class; 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STRING: 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return String.class; 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR_SEQUENCE: 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return CharSequence.class; 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case URI: 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Uri.class; 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BITMAP: 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Bitmap.class; 748d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert case BUNDLE: 749d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert return Bundle.class; 750499cb9f516062b654952d282f211bee44c31a3c2Winson Chung case INTENT: 751499cb9f516062b654952d282f211bee44c31a3c2Winson Chung return Intent.class; 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void apply(View root) { 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View view = root.findViewById(viewId); 7602b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (view == null) return; 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Class param = getParameterType(); 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (param == null) { 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ActionException("bad type: " + this.type); 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Class klass = view.getClass(); 768a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy Method method; 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method = klass.getMethod(this.methodName, getParameterType()); 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (NoSuchMethodException ex) { 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ActionException("view: " + klass.getName() + " doesn't have method: " 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + this.methodName + "(" + param.getName() + ")"); 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!method.isAnnotationPresent(RemotableViewMethod.class)) { 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ActionException("view: " + klass.getName() 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " can't use method with RemoteViews: " 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + this.methodName + "(" + param.getName() + ")"); 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 784a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy //noinspection ConstantIfStatement 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d("RemoteViews", "view: " + klass.getName() + " calling method: " 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + this.methodName + "(" + param.getName() + ") with " 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (this.value == null ? "null" : this.value.getClass().getName())); 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method.invoke(view, this.value); 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (Exception ex) { 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ActionException(ex); 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7963ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 7973ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung @Override 7983ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung public void updateMemoryUsageEstimate(MemoryUsageCounter counter) { 7993ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // We currently only calculate Bitmap memory usage 8003ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung switch (this.type) { 8013ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung case BITMAP: 8023ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung if (this.value != null) { 8033ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung final Bitmap b = (Bitmap) this.value; 8043ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung final Bitmap.Config c = b.getConfig(); 805f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato // If we don't know, be pessimistic and assume 4 8063ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung int bpp = 4; 807f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato if (c != null) { 808f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato switch (c) { 809f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato case ALPHA_8: 810f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato bpp = 1; 811f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato break; 812f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato case RGB_565: 813f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato case ARGB_4444: 814f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato bpp = 2; 815f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato break; 816f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato case ARGB_8888: 817f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato bpp = 4; 818f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato break; 819f01345e19d6ab39c368d030a7741a06d25b4d2ccJoe Onorato } 8203ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 8213ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung counter.bitmapIncrement(b.getWidth() * b.getHeight() * bpp); 8223ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 8233ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung break; 8243ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung default: 8253ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung break; 8263ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 8273ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8301162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey /** 8311162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * Equivalent to calling {@link ViewGroup#addView(View)} after inflating the 8321162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * given {@link RemoteViews}, or calling {@link ViewGroup#removeAllViews()} 8331162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * when null. This allows users to build "nested" {@link RemoteViews}. 8341162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey */ 8351162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey private class ViewGroupAction extends Action { 8361162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public ViewGroupAction(int viewId, RemoteViews nestedViews) { 8371162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey this.viewId = viewId; 8381162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey this.nestedViews = nestedViews; 8391162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 8401162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 8411162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public ViewGroupAction(Parcel parcel) { 8421162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey viewId = parcel.readInt(); 8431162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey nestedViews = parcel.readParcelable(null); 8441162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 8451162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 8461162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public void writeToParcel(Parcel dest, int flags) { 8471162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey dest.writeInt(TAG); 8481162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey dest.writeInt(viewId); 8491162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey dest.writeParcelable(nestedViews, 0 /* no flags */); 8501162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 8511162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 8521162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey @Override 8531162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public void apply(View root) { 8541162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey final Context context = root.getContext(); 8551162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey final ViewGroup target = (ViewGroup) root.findViewById(viewId); 8562b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (target == null) return; 8571162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey if (nestedViews != null) { 8581162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey // Inflate nested views and add as children 8591162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey target.addView(nestedViews.apply(context, target)); 8602b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato } else { 8611162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey // Clear all children when nested views omitted 8621162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey target.removeAllViews(); 8631162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 8641162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 8651162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 8663ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung @Override 8673ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung public void updateMemoryUsageEstimate(MemoryUsageCounter counter) { 8683ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung if (nestedViews != null) { 8693ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung counter.bitmapIncrement(nestedViews.estimateBitmapMemoryUsage()); 8703ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 8713ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 8723ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 8731162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey int viewId; 8741162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey RemoteViews nestedViews; 8751162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 8761162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public final static int TAG = 4; 8771162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8803ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung * Simple class used to keep track of memory usage in a RemoteViews. 8813ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung * 8823ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung */ 8833ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung private class MemoryUsageCounter { 8843ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung public void clear() { 8853ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung mBitmapHeapMemoryUsage = 0; 8863ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 8873ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 8883ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung public void bitmapIncrement(int numBytes) { 8893ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung mBitmapHeapMemoryUsage += numBytes; 8903ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 8913ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 8923ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung public int getBitmapHeapMemoryUsage() { 8933ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung return mBitmapHeapMemoryUsage; 8943ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 8953ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 8963ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung int mBitmapHeapMemoryUsage; 8973ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 8983ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 8993ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung /** 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new RemoteViews object that will display the views contained 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the specified layout file. 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param packageName Name of the package that contains the layout resource 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param layoutId The id of the layout resource 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RemoteViews(String packageName, int layoutId) { 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackage = packageName; 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutId = layoutId; 9093ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 9103ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // setup the memory usage statistics 9113ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung mMemoryUsageCounter = new MemoryUsageCounter(); 9123ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung recalculateMemoryUsage(); 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reads a RemoteViews object from a parcel. 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parcel 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RemoteViews(Parcel parcel) { 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackage = parcel.readString(); 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutId = parcel.readInt(); 923ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen mIsWidgetCollectionChild = parcel.readInt() == 1 ? true : false; 924ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = parcel.readInt(); 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (count > 0) { 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActions = new ArrayList<Action>(count); 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<count; i++) { 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int tag = parcel.readInt(); 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (tag) { 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SetOnClickPendingIntent.TAG: 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActions.add(new SetOnClickPendingIntent(parcel)); 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SetDrawableParameters.TAG: 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActions.add(new SetDrawableParameters(parcel)); 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ReflectionAction.TAG: 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActions.add(new ReflectionAction(parcel)); 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9401162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey case ViewGroupAction.TAG: 9411162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey mActions.add(new ViewGroupAction(parcel)); 9421162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey break; 9432dd2197805edb4d9547b143deef2226413218f4cAdam Cohen case ReflectionActionWithoutParams.TAG: 9442dd2197805edb4d9547b143deef2226413218f4cAdam Cohen mActions.add(new ReflectionActionWithoutParams(parcel)); 9452dd2197805edb4d9547b143deef2226413218f4cAdam Cohen break; 9461480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen case SetEmptyView.TAG: 9471480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen mActions.add(new SetEmptyView(parcel)); 9481480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen break; 949ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen case SetPendingIntentTemplate.TAG: 950ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen mActions.add(new SetPendingIntentTemplate(parcel)); 951ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen break; 95235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen case SetOnClickFillInIntent.TAG: 95335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen mActions.add(new SetOnClickFillInIntent(parcel)); 95435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen break; 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ActionException("Tag " + tag + " not found"); 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9603ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 9613ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // setup the memory usage statistics 9623ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung mMemoryUsageCounter = new MemoryUsageCounter(); 9633ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung recalculateMemoryUsage(); 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9663030193dc179b3010f2dd3bffe9c1dec54da38fcGilles Debunne @Override 96718e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato public RemoteViews clone() { 96818e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato final RemoteViews that = new RemoteViews(mPackage, mLayoutId); 96918e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato if (mActions != null) { 97018e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato that.mActions = (ArrayList<Action>)mActions.clone(); 97118e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato } 9723ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 9733ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // update the memory usage stats of the cloned RemoteViews 9743ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung that.recalculateMemoryUsage(); 97518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato return that; 97618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato } 97718e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPackage() { 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackage; 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getLayoutId() { 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLayoutId; 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9863ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung /* 987ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * This flag indicates whether this RemoteViews object is being created from a 988ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * RemoteViewsService for use as a child of a widget collection. This flag is used 989ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * to determine whether or not certain features are available, in particular, 990ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * setting on click extras and setting on click pending intents. The former is enabled, 991ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * and the latter disabled when this flag is true. 992ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen */ 993ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen void setIsWidgetCollectionChild(boolean isWidgetCollectionChild) { 994ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen mIsWidgetCollectionChild = isWidgetCollectionChild; 995ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 996ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 997ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen /** 9983ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung * Updates the memory usage statistics. 9993ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung */ 10003ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung private void recalculateMemoryUsage() { 10013ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung mMemoryUsageCounter.clear(); 10023ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 10033ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // Accumulate the memory usage for each action 10043ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung if (mActions != null) { 10053ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung final int count = mActions.size(); 10063ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung for (int i= 0; i < count; ++i) { 10073ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung mActions.get(i).updateMemoryUsageEstimate(mMemoryUsageCounter); 10083ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 10093ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 10103ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 10113ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 10123ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung /** 10133ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung * Returns an estimate of the bitmap heap memory usage for this RemoteViews. 10143ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung */ 10153ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung int estimateBitmapMemoryUsage() { 10163ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung return mMemoryUsageCounter.getBitmapHeapMemoryUsage(); 10173ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 10183ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 10193ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung /** 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add an action to be executed on the remote side when apply is called. 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param a The action to add 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void addAction(Action a) { 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActions == null) { 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActions = new ArrayList<Action>(); 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActions.add(a); 10293ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 10303ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // update the memory usage stats 10313ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung a.updateMemoryUsageEstimate(mMemoryUsageCounter); 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10331162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 10341162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey /** 10351162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * Equivalent to calling {@link ViewGroup#addView(View)} after inflating the 10361162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * given {@link RemoteViews}. This allows users to build "nested" 10371162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * {@link RemoteViews}. In cases where consumers of {@link RemoteViews} may 10381162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * recycle layouts, use {@link #removeAllViews(int)} to clear any existing 10391162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * children. 10401162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * 10411162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * @param viewId The id of the parent {@link ViewGroup} to add child into. 10421162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * @param nestedView {@link RemoteViews} that describes the child. 10431162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey */ 10441162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public void addView(int viewId, RemoteViews nestedView) { 10451162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey addAction(new ViewGroupAction(viewId, nestedView)); 10461162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 10471162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 10481162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey /** 10491162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * Equivalent to calling {@link ViewGroup#removeAllViews()}. 10501162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * 10511162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * @param viewId The id of the parent {@link ViewGroup} to remove all 10521162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * children from. 10531162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey */ 10541162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public void removeAllViews(int viewId) { 10551162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey addAction(new ViewGroupAction(viewId, null)); 10561162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 10571162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10590b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * Equivalent to calling {@link AdapterViewAnimator#showNext()} 10602dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * 10610b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * @param viewId The id of the view on which to call {@link AdapterViewAnimator#showNext()} 10622dd2197805edb4d9547b143deef2226413218f4cAdam Cohen */ 10632dd2197805edb4d9547b143deef2226413218f4cAdam Cohen public void showNext(int viewId) { 10642dd2197805edb4d9547b143deef2226413218f4cAdam Cohen addAction(new ReflectionActionWithoutParams(viewId, "showNext")); 10652dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 10662dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 10672dd2197805edb4d9547b143deef2226413218f4cAdam Cohen /** 10680b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * Equivalent to calling {@link AdapterViewAnimator#showPrevious()} 10692dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * 10700b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * @param viewId The id of the view on which to call {@link AdapterViewAnimator#showPrevious()} 10712dd2197805edb4d9547b143deef2226413218f4cAdam Cohen */ 10722dd2197805edb4d9547b143deef2226413218f4cAdam Cohen public void showPrevious(int viewId) { 10732dd2197805edb4d9547b143deef2226413218f4cAdam Cohen addAction(new ReflectionActionWithoutParams(viewId, "showPrevious")); 10742dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 10752dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 10762dd2197805edb4d9547b143deef2226413218f4cAdam Cohen /** 10770b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * Equivalent to calling {@link AdapterViewAnimator#setDisplayedChild(int)} 10780b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * 10790b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * @param viewId The id of the view on which to call 10800b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * {@link AdapterViewAnimator#setDisplayedChild(int)} 10810b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen */ 10820b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen public void setDisplayedChild(int viewId, int childIndex) { 10830b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen setInt(viewId, "setDisplayedChild", childIndex); 10840b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen } 10850b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen 10860b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen /** 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling View.setVisibility 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose visibility should change 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param visibility The new visibility for the view 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setViewVisibility(int viewId, int visibility) { 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInt(viewId, "setVisibility", visibility); 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1095ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling TextView.setText 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose text should change 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param text The new text for the view 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTextViewText(int viewId, CharSequence text) { 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setCharSequence(viewId, "setText", text); 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling ImageView.setImageResource 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose drawable should change 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param srcId The new resource id for the drawable 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setImageViewResource(int viewId, int srcId) { 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInt(viewId, "setImageResource", srcId); 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling ImageView.setImageURI 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose drawable should change 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param uri The Uri for the image 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setImageViewUri(int viewId, Uri uri) { 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setUri(viewId, "setImageURI", uri); 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling ImageView.setImageBitmap 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose drawable should change 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bitmap The new Bitmap for the drawable 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setImageViewBitmap(int viewId, Bitmap bitmap) { 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBitmap(viewId, "setImageBitmap", bitmap); 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11371480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen * Equivalent to calling AdapterView.setEmptyView 11381480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen * 11391480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen * @param viewId The id of the view on which to set the empty view 11401480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen * @param emptyViewId The view id of the empty view 11411480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen */ 11421480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen public void setEmptyView(int viewId, int emptyViewId) { 11431480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen addAction(new SetEmptyView(viewId, emptyViewId)); 11441480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 11451480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 11461480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen /** 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling {@link Chronometer#setBase Chronometer.setBase}, 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Chronometer#setFormat Chronometer.setFormat}, 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and {@link Chronometer#start Chronometer.start()} or 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Chronometer#stop Chronometer.stop()}. 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose text should change 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param base The time at which the timer would have read 0:00. This 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * time should be based off of 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.os.SystemClock#elapsedRealtime SystemClock.elapsedRealtime()}. 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param format The Chronometer format string, or null to 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * simply display the timer value. 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param started True if you want the clock to be started, false if not. 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setChronometer(int viewId, long base, String format, boolean started) { 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setLong(viewId, "setBase", base); 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setString(viewId, "setFormat", format); 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBoolean(viewId, "setStarted", started); 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling {@link ProgressBar#setMax ProgressBar.setMax}, 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ProgressBar#setProgress ProgressBar.setProgress}, and 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ProgressBar#setIndeterminate ProgressBar.setIndeterminate} 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If indeterminate is true, then the values for max and progress are ignored. 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose text should change 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param max The 100% value for the progress bar 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param progress The current value of the progress bar. 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param indeterminate True if the progress bar is indeterminate, 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * false if not. 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setProgressBar(int viewId, int max, int progress, 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean indeterminate) { 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBoolean(viewId, "setIndeterminate", indeterminate); 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!indeterminate) { 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInt(viewId, "setMax", max); 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInt(viewId, "setProgress", progress); 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.View#setOnClickListener(android.view.View.OnClickListener)} 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to launch the provided {@link PendingIntent}. 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 119335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * When setting the on-click action of items within collections (eg. {@link ListView}, 119435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * {@link StackView} etc.), this method will not work. Instead, use {@link 119535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * RemoteViews#setPendingIntentTemplate(int, PendingIntent) in conjunction with 119635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * RemoteViews#setOnClickFillInIntent(int, Intent). 119735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view that will trigger the {@link PendingIntent} when clicked 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pendingIntent The {@link PendingIntent} to send when user clicks 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnClickPendingIntent(int viewId, PendingIntent pendingIntent) { 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new SetOnClickPendingIntent(viewId, pendingIntent)); 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 120635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * When using collections (eg. {@link ListView}, {@link StackView} etc.) in widgets, it is very 120735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * costly to set PendingIntents on the individual items, and is hence not permitted. Instead 120835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * this method should be used to set a single PendingIntent template on the collection, and 120935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * individual items can differentiate their on-click behavior using 121035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * {@link RemoteViews#setOnClickFillInIntent(int, Intent)}. 1211ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * 1212ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * @param viewId The id of the collection who's children will use this PendingIntent template 1213ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * when clicked 1214ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * @param pendingIntentTemplate The {@link PendingIntent} to be combined with extras specified 1215ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * by a child of viewId and executed when that child is clicked 1216ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen */ 1217ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen public void setPendingIntentTemplate(int viewId, PendingIntent pendingIntentTemplate) { 1218ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen addAction(new SetPendingIntentTemplate(viewId, pendingIntentTemplate)); 1219ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 1220ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 1221ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen /** 122235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * When using collections (eg. {@link ListView}, {@link StackView} etc.) in widgets, it is very 122335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * costly to set PendingIntents on the individual items, and is hence not permitted. Instead 122435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * a single PendingIntent template can be set on the collection, see {@link 122535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * RemoteViews#setPendingIntentTemplate(int, PendingIntent)}, and the individual on-click 122635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * action of a given item can be distinguished by setting a fillInIntent on that item. The 122735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * fillInIntent is then combined with the PendingIntent template in order to determine the final 122835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * intent which will be executed when the item is clicked. This works as follows: any fields 122935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * which are left blank in the PendingIntent template, but are provided by the fillInIntent 123035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * will be overwritten, and the resulting PendingIntent will be used. 123135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * 123235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * 123335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * of the PendingIntent template will then be filled in with the associated fields that are 123435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * set in fillInIntent. See {@link Intent#fillIn(Intent, int)} for more details. 123535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * 123635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * @param viewId The id of the view on which to set the fillInIntent 123735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * @param fillInIntent The intent which will be combined with the parent's PendingIntent 123835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * in order to determine the on-click behavior of the view specified by viewId 123935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen */ 124035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen public void setOnClickFillInIntent(int viewId, Intent fillInIntent) { 124135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen addAction(new SetOnClickFillInIntent(viewId, fillInIntent)); 124235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 124335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 124435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen /** 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling a combination of {@link Drawable#setAlpha(int)}, 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Drawable#setColorFilter(int, android.graphics.PorterDuff.Mode)}, 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and/or {@link Drawable#setLevel(int)} on the {@link Drawable} of a given 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * view. 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You can omit specific calls by marking their values with null or -1. 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view that contains the target 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Drawable} 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param targetBackground If true, apply these parameters to the 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Drawable} returned by 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.View#getBackground()}. Otherwise, assume 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the target view is an {@link ImageView} and apply them to 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ImageView#getDrawable()}. 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param alpha Specify an alpha value for the drawable, or -1 to leave 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unchanged. 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param colorFilter Specify a color for a 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.graphics.ColorFilter} for this drawable, or -1 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to leave unchanged. 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param mode Specify a PorterDuff mode for this drawable, or null to leave 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unchanged. 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param level Specify the level for the drawable, or -1 to leave 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unchanged. 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDrawableParameters(int viewId, boolean targetBackground, int alpha, 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int colorFilter, PorterDuff.Mode mode, int level) { 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new SetDrawableParameters(viewId, targetBackground, alpha, 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project colorFilter, mode, level)); 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling {@link android.widget.TextView#setTextColor(int)}. 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose text should change 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param color Sets the text color for all the states (normal, selected, 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * focused) to be this color. 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTextColor(int viewId, int color) { 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInt(viewId, "setTextColor", color); 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1287592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1288499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * Equivalent to calling {@link android.widget.AbsListView#setRemoteViewsAdapter(Intent)}. 1289499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * 129081f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * @param appWidgetId The id of the app widget which contains the specified view 129181f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * @param viewId The id of the view whose text should change 129281f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * @param intent The intent of the service which will be 129381f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * providing data to the RemoteViewsAdapter 129481f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung */ 129581f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung public void setRemoteAdapter(int appWidgetId, int viewId, Intent intent) { 129681f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung // Embed the AppWidget Id for use in RemoteViewsAdapter when connecting to the intent 129781f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung // RemoteViewsService 129881f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung intent.putExtra(EXTRA_REMOTEADAPTER_APPWIDGET_ID, appWidgetId); 1299499cb9f516062b654952d282f211bee44c31a3c2Winson Chung setIntent(viewId, "setRemoteViewsAdapter", intent); 1300499cb9f516062b654952d282f211bee44c31a3c2Winson Chung } 1301499cb9f516062b654952d282f211bee44c31a3c2Winson Chung 1302499cb9f516062b654952d282f211bee44c31a3c2Winson Chung /** 1303499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * Equivalent to calling {@link android.widget.AbsListView#smoothScrollToPosition(int, int)}. 1304499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * 1305499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * @param viewId The id of the view whose text should change 1306499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * @param position Scroll to this adapter position 1307499cb9f516062b654952d282f211bee44c31a3c2Winson Chung */ 1308499cb9f516062b654952d282f211bee44c31a3c2Winson Chung public void setScrollPosition(int viewId, int position) { 1309499cb9f516062b654952d282f211bee44c31a3c2Winson Chung setInt(viewId, "smoothScrollToPosition", position); 1310499cb9f516062b654952d282f211bee44c31a3c2Winson Chung } 1311499cb9f516062b654952d282f211bee44c31a3c2Winson Chung 1312499cb9f516062b654952d282f211bee44c31a3c2Winson Chung /** 1313499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * Equivalent to calling {@link android.widget.AbsListView#smoothScrollToPosition(int, int)}. 1314499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * 1315499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * @param viewId The id of the view whose text should change 131695362595ed4a42aec87b4d166092b30c8139d220Winson Chung * @param offset Scroll by this adapter position offset 1317499cb9f516062b654952d282f211bee44c31a3c2Winson Chung */ 1318499cb9f516062b654952d282f211bee44c31a3c2Winson Chung public void setRelativeScrollPosition(int viewId, int offset) { 1319499cb9f516062b654952d282f211bee44c31a3c2Winson Chung setInt(viewId, "smoothScrollByOffset", offset); 1320499cb9f516062b654952d282f211bee44c31a3c2Winson Chung } 1321499cb9f516062b654952d282f211bee44c31a3c2Winson Chung 1322499cb9f516062b654952d282f211bee44c31a3c2Winson Chung /** 1323592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one boolean on a view in the layout for this RemoteViews. 1324592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 1325592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param viewId The id of the view whose text should change 1326592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1327592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1328592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setBoolean(int viewId, String methodName, boolean value) { 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.BOOLEAN, value)); 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1333592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1334592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one byte on a view in the layout for this RemoteViews. 1335592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 1336592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param viewId The id of the view whose text should change 1337592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1338592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1339592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setByte(int viewId, String methodName, byte value) { 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.BYTE, value)); 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1344592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1345592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one short on a view in the layout for this RemoteViews. 1346592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 1347592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param viewId The id of the view whose text should change 1348592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1349592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1350592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setShort(int viewId, String methodName, short value) { 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.SHORT, value)); 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1355592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1356592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one int on a view in the layout for this RemoteViews. 1357592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 1358592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param viewId The id of the view whose text should change 1359592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1360592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1361592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setInt(int viewId, String methodName, int value) { 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.INT, value)); 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1366592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1367592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one long on a view in the layout for this RemoteViews. 1368592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 1369592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param viewId The id of the view whose text should change 1370592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1371592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1372592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setLong(int viewId, String methodName, long value) { 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.LONG, value)); 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1377592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1378592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one float on a view in the layout for this RemoteViews. 1379592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 1380592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param viewId The id of the view whose text should change 1381592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1382592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1383592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFloat(int viewId, String methodName, float value) { 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.FLOAT, value)); 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1388592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1389592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one double on a view in the layout for this RemoteViews. 1390592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 1391592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param viewId The id of the view whose text should change 1392592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1393592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1394592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDouble(int viewId, String methodName, double value) { 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.DOUBLE, value)); 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1399592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1400592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one char on a view in the layout for this RemoteViews. 1401592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 1402592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param viewId The id of the view whose text should change 1403592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1404592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1405592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setChar(int viewId, String methodName, char value) { 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.CHAR, value)); 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1410592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1411592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one String on a view in the layout for this RemoteViews. 1412592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 1413592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param viewId The id of the view whose text should change 1414592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1415592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1416592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setString(int viewId, String methodName, String value) { 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.STRING, value)); 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1421592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1422592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one CharSequence on a view in the layout for this RemoteViews. 1423592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 1424592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param viewId The id of the view whose text should change 1425592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1426592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1427592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setCharSequence(int viewId, String methodName, CharSequence value) { 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.CHAR_SEQUENCE, value)); 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1432592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1433592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one Uri on a view in the layout for this RemoteViews. 1434592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 1435592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param viewId The id of the view whose text should change 1436592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1437592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1438592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setUri(int viewId, String methodName, Uri value) { 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.URI, value)); 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1443592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1444592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one Bitmap on a view in the layout for this RemoteViews. 1445592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @more 1446592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * <p class="note">The bitmap will be flattened into the parcel if this object is 1447592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * sent across processes, so it may end up using a lot of memory, and may be fairly slow.</p> 1448592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 1449592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param viewId The id of the view whose text should change 1450592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1451592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1452592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setBitmap(int viewId, String methodName, Bitmap value) { 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.BITMAP, value)); 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1458d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert * Call a method taking one Bundle on a view in the layout for this RemoteViews. 1459d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert * 1460d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert * @param viewId The id of the view whose text should change 1461d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert * @param methodName The name of the method to call. 1462d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert * @param value The value to pass to the method. 1463d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert */ 1464d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert public void setBundle(int viewId, String methodName, Bundle value) { 1465d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert addAction(new ReflectionAction(viewId, methodName, ReflectionAction.BUNDLE, value)); 1466d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert } 1467d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert 1468d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert /** 1469499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * 1470499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * @param viewId 1471499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * @param methodName 1472499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * @param value 1473499cb9f516062b654952d282f211bee44c31a3c2Winson Chung */ 1474499cb9f516062b654952d282f211bee44c31a3c2Winson Chung public void setIntent(int viewId, String methodName, Intent value) { 1475499cb9f516062b654952d282f211bee44c31a3c2Winson Chung addAction(new ReflectionAction(viewId, methodName, ReflectionAction.INTENT, value)); 1476499cb9f516062b654952d282f211bee44c31a3c2Winson Chung } 1477499cb9f516062b654952d282f211bee44c31a3c2Winson Chung 1478499cb9f516062b654952d282f211bee44c31a3c2Winson Chung /** 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inflates the view hierarchy represented by this object and applies 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * all of the actions. 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>Caller beware: this may throw</strong> 14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context Default context to use 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parent Parent that the resulting view hierarchy will be attached to. This method 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * does <strong>not</strong> attach the hierarchy. The caller should do so when appropriate. 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The inflated view hierarchy 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View apply(Context context, ViewGroup parent) { 1490a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy View result; 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context c = prepareContext(context); 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1494a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy LayoutInflater inflater = (LayoutInflater) 1495a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inflater = inflater.cloneInContext(c); 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inflater.setFilter(this); 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = inflater.inflate(mLayoutId, parent, false); 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performApply(result); 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Applies all of the actions to the provided view. 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>Caller beware: this may throw</strong> 15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param v The view to apply the actions to. This should be the result of 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the {@link #apply(Context,ViewGroup)} call. 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void reapply(Context context, View v) { 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project prepareContext(context); 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performApply(v); 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void performApply(View v) { 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActions != null) { 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mActions.size(); 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Action a = mActions.get(i); 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.apply(v); 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context prepareContext(Context context) { 1531a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy Context c; 15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String packageName = mPackage; 15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (packageName != null) { 15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1536870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy c = context.createPackageContext(packageName, Context.CONTEXT_RESTRICTED); 15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (NameNotFoundException e) { 15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOG_TAG, "Package name " + packageName + " not found"); 15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c = context; 15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c = context; 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return c; 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* (non-Javadoc) 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used to restrict the views which can be inflated 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.view.LayoutInflater.Filter#onLoadClass(java.lang.Class) 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1553e6ac8b9aade9443ab8456c8f7a47cdfba3b70266Gilles Debunne public boolean onLoadClass(Class clazz) { 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return clazz.isAnnotationPresent(RemoteView.class); 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(mPackage); 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(mLayoutId); 1564ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen dest.writeInt(mIsWidgetCollectionChild ? 1 : 0); 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count; 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActions != null) { 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count = mActions.size(); 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count = 0; 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(count); 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<count; i++) { 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Action a = mActions.get(i); 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.writeToParcel(dest, 0); 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parcelable.Creator that instantiates RemoteViews objects 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<RemoteViews> CREATOR = new Parcelable.Creator<RemoteViews>() { 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RemoteViews createFromParcel(Parcel parcel) { 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RemoteViews(parcel); 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RemoteViews[] newArray(int size) { 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RemoteViews[size]; 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1591