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