RemoteViews.java revision 1927ae8a56a010919a7535231fa0f7db70f7e152
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; 25ffc46a5c7c60c911fdaab48681c323c89b570dacAdam Cohenimport android.content.pm.ApplicationInfo; 26ffc46a5c7c60c911fdaab48681c323c89b570dacAdam Cohenimport android.content.pm.PackageManager; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException; 285d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohenimport android.content.res.Configuration; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PorterDuff; 317597065d6b0877ffc460b443fdb1595965ccd7b2Joe Onoratoimport android.graphics.Rect; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 34ffc46a5c7c60c911fdaab48681c323c89b570dacAdam Cohenimport android.os.Build; 35d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringertimport android.os.Bundle; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 407264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandlerimport android.util.TypedValue; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater; 42dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chungimport android.view.LayoutInflater.Filter; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.RemotableViewMethod; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View.OnClickListener; 46dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chungimport android.view.ViewGroup; 47a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohenimport android.widget.AdapterView.OnItemClickListener; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chungimport java.lang.annotation.ElementType; 50dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chungimport java.lang.annotation.Retention; 51dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chungimport java.lang.annotation.RetentionPolicy; 52dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chungimport java.lang.annotation.Target; 53dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chungimport java.lang.reflect.Method; 54dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chungimport java.util.ArrayList; 55dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A class that describes a view hierarchy that can be displayed in 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * another process. The hierarchy is inflated from a layout resource 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * file, and this class provides some basic operations for modifying 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the content of the inflated hierarchy. 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class RemoteViews implements Parcelable, Filter { 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String LOG_TAG = "RemoteViews"; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6881f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * The intent extra that contains the appWidgetId. 6981f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * @hide 7081f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung */ 7181f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung static final String EXTRA_REMOTEADAPTER_APPWIDGET_ID = "remoteAdapterAppWidgetId"; 7281f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung 7381f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung /** 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The package name of the package containing the layout 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resource. (Added to the parcel) 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 773030193dc179b3010f2dd3bffe9c1dec54da38fcGilles Debunne private final String mPackage; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The resource ID of the layout file. (Added to the parcel) 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 823030193dc179b3010f2dd3bffe9c1dec54da38fcGilles Debunne private final int mLayoutId; 83a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An array of actions to perform on the view tree once it has been 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inflated 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ArrayList<Action> mActions; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 903ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung /** 913ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung * A class to keep track of memory usage by this RemoteViews 923ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung */ 933ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung private MemoryUsageCounter mMemoryUsageCounter; 943ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 955d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen /** 965d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * Maps bitmaps to unique indicies to avoid Bitmap duplication. 975d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen */ 985d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private BitmapCache mBitmapCache; 995d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 1005d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen /** 1015d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * Indicates whether or not this RemoteViews object is contained as a child of any other 1025d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * RemoteViews. 1035d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen */ 1045d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private boolean mIsRoot = true; 1055d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 1065d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen /** 1075d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * Constants to whether or not this RemoteViews is composed of a landscape and portrait 1085d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * RemoteViews. 1095d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen */ 1105d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private static final int MODE_NORMAL = 0; 1115d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private static final int MODE_HAS_LANDSCAPE_AND_PORTRAIT = 1; 1125d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 1135d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen /** 1145d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * Used in conjunction with the special constructor 1155d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * {@link #RemoteViews(RemoteViews, RemoteViews)} to keep track of the landscape and portrait 1165d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * RemoteViews. 1175d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen */ 1185d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private RemoteViews mLandscape = null; 1195d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private RemoteViews mPortrait = null; 1205d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 122ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * This flag indicates whether this RemoteViews object is being created from a 123ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * RemoteViewsService for use as a child of a widget collection. This flag is used 124ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * to determine whether or not certain features are available, in particular, 125ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * setting on click extras and setting on click pending intents. The former is enabled, 126ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * and the latter disabled when this flag is true. 127ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen */ 1281927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn private boolean mIsWidgetCollectionChild = false; 1291927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn 1301927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn private static final OnClickHandler DEFAULT_ON_CLICK_HANDLER = new OnClickHandler(); 1311927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn private OnClickHandler mOnClickHandler = DEFAULT_ON_CLICK_HANDLER; 132ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 133ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen /** 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This annotation indicates that a subclass of View is alllowed to be used 135a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy * with the {@link RemoteViews} mechanism. 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Target({ ElementType.TYPE }) 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Retention(RetentionPolicy.RUNTIME) 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public @interface RemoteView { 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Exception to send when something goes wrong executing an action 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class ActionException extends RuntimeException { 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ActionException(Exception ex) { 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(ex); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ActionException(String message) { 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(message); 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 154a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen 1551927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn /** @hide */ 1561927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn public static class OnClickHandler { 1571927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn public boolean onClickHandler(View view, PendingIntent pendingIntent, 158ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung Intent fillInIntent) { 159ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung try { 160ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung // TODO: Unregister this handler if PendingIntent.FLAG_ONE_SHOT? 161dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung Context context = view.getContext(); 162dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung ActivityOptions opts = ActivityOptions.makeScaleUpAnimation(view, 163dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung 0, 0, 164dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung view.getMeasuredWidth(), view.getMeasuredHeight()); 165ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung context.startIntentSender( 166ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung pendingIntent.getIntentSender(), fillInIntent, 167ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung Intent.FLAG_ACTIVITY_NEW_TASK, 168dc6f79bf4374f2fcea2b9d4d0aa7f2e39cc42456Winson Chung Intent.FLAG_ACTIVITY_NEW_TASK, 0, opts.toBundle()); 169ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung } catch (IntentSender.SendIntentException e) { 170ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung android.util.Log.e(LOG_TAG, "Cannot send pending intent: ", e); 171ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung return false; 172ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung } catch (Exception e) { 173ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung android.util.Log.e(LOG_TAG, "Cannot send pending intent due to " + 174ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung "unknown exception: ", e); 175ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung return false; 176ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung } 177ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung return true; 178ae615981315d9318edb1d8bf2a0f607f90cc77acWinson Chung } 1791927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn } 1801927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn 1811927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn /** 1821927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn * Base class for all actions that can be performed on an 1831927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn * inflated view. 1841927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn * 1851927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn * SUBCLASSES MUST BE IMMUTABLE SO CLONE WORKS!!!!! 1861927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn */ 1871927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn private abstract static class Action implements Parcelable { 1881927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn public abstract void apply(RemoteViews owner, View root, 1891927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn ViewGroup rootParent) throws ActionException; 1901927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn 1911927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn public int describeContents() { 1921927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn return 0; 1931927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn } 1941927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn 1951927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn /** 1961927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn * Overridden by each class to report on it's own memory usage 1971927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn */ 1981927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn public void updateMemoryUsageEstimate(MemoryUsageCounter counter) { 1991927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn // We currently only calculate Bitmap memory usage, so by default, don't do anything 2001927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn // here 2011927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn return; 2021927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn } 2035d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 2045d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public void setBitmapCache(BitmapCache bitmapCache) { 2055d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // Do nothing 2065d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 207a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy } 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2091480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen private class SetEmptyView extends Action { 2101480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen int viewId; 2111480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen int emptyViewId; 2121480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 2131480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen public final static int TAG = 6; 2141480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 2151480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen SetEmptyView(int viewId, int emptyViewId) { 2161480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen this.viewId = viewId; 2171480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen this.emptyViewId = emptyViewId; 2181480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 2191480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 2201480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen SetEmptyView(Parcel in) { 2211480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen this.viewId = in.readInt(); 2221480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen this.emptyViewId = in.readInt(); 2231480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 2241480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 2251480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen public void writeToParcel(Parcel out, int flags) { 2261480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen out.writeInt(TAG); 2271480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen out.writeInt(this.viewId); 2281480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen out.writeInt(this.emptyViewId); 2291480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 2301480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 2311480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen @Override 2321927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn public void apply(RemoteViews owner, View root, ViewGroup rootParent) { 2331480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen final View view = root.findViewById(viewId); 2341480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen if (!(view instanceof AdapterView<?>)) return; 2351480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 2361480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen AdapterView<?> adapterView = (AdapterView<?>) view; 2371480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 2381480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen final View emptyView = root.findViewById(emptyViewId); 2391480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen if (emptyView == null) return; 2401480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 2411480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen adapterView.setEmptyView(emptyView); 2421480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 2431480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 2441480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 24535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen private class SetOnClickFillInIntent extends Action { 24635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen public SetOnClickFillInIntent(int id, Intent fillInIntent) { 24735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen this.viewId = id; 24835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen this.fillInIntent = fillInIntent; 24935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 25035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 25135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen public SetOnClickFillInIntent(Parcel parcel) { 25235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen viewId = parcel.readInt(); 25335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen fillInIntent = Intent.CREATOR.createFromParcel(parcel); 25435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 25535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 25635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen public void writeToParcel(Parcel dest, int flags) { 25735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen dest.writeInt(TAG); 25835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen dest.writeInt(viewId); 25935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen fillInIntent.writeToParcel(dest, 0 /* no flags */); 26035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 26135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 26235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen @Override 2631927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn public void apply(RemoteViews owner, View root, ViewGroup rootParent) { 26435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen final View target = root.findViewById(viewId); 2652b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (target == null) return; 26635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 26735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen if (!mIsWidgetCollectionChild) { 26835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen Log.e("RemoteViews", "The method setOnClickFillInIntent is available " + 26935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen "only from RemoteViewsFactory (ie. on collection items)."); 27035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen return; 27135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 272a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen if (target == root) { 273a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen target.setTagInternal(com.android.internal.R.id.fillInIntent, fillInIntent); 274a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen } else if (target != null && fillInIntent != null) { 2751927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn final OnClickHandler clicker = owner.mOnClickHandler; 27635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen OnClickListener listener = new OnClickListener() { 27735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen public void onClick(View v) { 27835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen // Insure that this view is a child of an AdapterView 27935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen View parent = (View) v.getParent(); 28035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen while (!(parent instanceof AdapterView<?>) 28135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen && !(parent instanceof AppWidgetHostView)) { 28235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen parent = (View) parent.getParent(); 28335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 28435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 28535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen if (parent instanceof AppWidgetHostView) { 28635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen // Somehow they've managed to get this far without having 28735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen // and AdapterView as a parent. 28835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen Log.e("RemoteViews", "Collection item doesn't have AdapterView parent"); 28935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen return; 29035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 29135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 29235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen // Insure that a template pending intent has been set on an ancestor 29335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen if (!(parent.getTag() instanceof PendingIntent)) { 29435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen Log.e("RemoteViews", "Attempting setOnClickFillInIntent without" + 295a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen " calling setPendingIntentTemplate on parent."); 29635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen return; 29735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 29835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 29935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen PendingIntent pendingIntent = (PendingIntent) parent.getTag(); 30035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 30135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen final float appScale = v.getContext().getResources() 302a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen .getCompatibilityInfo().applicationScale; 30335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen final int[] pos = new int[2]; 30435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen v.getLocationOnScreen(pos); 30535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 30635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen final Rect rect = new Rect(); 30735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen rect.left = (int) (pos[0] * appScale + 0.5f); 30835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen rect.top = (int) (pos[1] * appScale + 0.5f); 30935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen rect.right = (int) ((pos[0] + v.getWidth()) * appScale + 0.5f); 31035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen rect.bottom = (int) ((pos[1] + v.getHeight()) * appScale + 0.5f); 31135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 31235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen fillInIntent.setSourceBounds(rect); 3131927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn clicker.onClickHandler(v, pendingIntent, fillInIntent); 31435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 31535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 31635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen }; 31735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen target.setOnClickListener(listener); 31835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 31935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 32035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 32135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen int viewId; 32235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen Intent fillInIntent; 32335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 32435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen public final static int TAG = 9; 32535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 32635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 327ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen private class SetPendingIntentTemplate extends Action { 328ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen public SetPendingIntentTemplate(int id, PendingIntent pendingIntentTemplate) { 329ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen this.viewId = id; 330ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen this.pendingIntentTemplate = pendingIntentTemplate; 331ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 332ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 333ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen public SetPendingIntentTemplate(Parcel parcel) { 334ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen viewId = parcel.readInt(); 335ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen pendingIntentTemplate = PendingIntent.readPendingIntentOrNullFromParcel(parcel); 336ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 337ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 338ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen public void writeToParcel(Parcel dest, int flags) { 339ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen dest.writeInt(TAG); 340ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen dest.writeInt(viewId); 341ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen pendingIntentTemplate.writeToParcel(dest, 0 /* no flags */); 342ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 343ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 344ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen @Override 3451927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn public void apply(RemoteViews owner, View root, ViewGroup rootParent) { 346ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen final View target = root.findViewById(viewId); 3472b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (target == null) return; 348ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 349ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen // If the view isn't an AdapterView, setting a PendingIntent template doesn't make sense 350ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen if (target instanceof AdapterView<?>) { 351a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen AdapterView<?> av = (AdapterView<?>) target; 3521927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn final OnClickHandler clicker = owner.mOnClickHandler; 353ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen // The PendingIntent template is stored in the view's tag. 354a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen OnItemClickListener listener = new OnItemClickListener() { 355a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen public void onItemClick(AdapterView<?> parent, View view, 356a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen int position, long id) { 357a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen // The view should be a frame layout 358a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen if (view instanceof ViewGroup) { 359a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen ViewGroup vg = (ViewGroup) view; 360a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen 361a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen // AdapterViews contain their children in a frame 362a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen // so we need to go one layer deeper here. 363a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen if (parent instanceof AdapterViewAnimator) { 364a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen vg = (ViewGroup) vg.getChildAt(0); 365a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen } 366a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen if (vg == null) return; 367a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen 368a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen Intent fillInIntent = null; 369a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen int childCount = vg.getChildCount(); 370a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen for (int i = 0; i < childCount; i++) { 371a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen Object tag = vg.getChildAt(i).getTag(com.android.internal.R.id.fillInIntent); 372a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen if (tag instanceof Intent) { 373a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen fillInIntent = (Intent) tag; 374a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen break; 375a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen } 376a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen } 377a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen if (fillInIntent == null) return; 378a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen 379a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen final float appScale = view.getContext().getResources() 380a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen .getCompatibilityInfo().applicationScale; 381a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen final int[] pos = new int[2]; 382a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen view.getLocationOnScreen(pos); 383a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen 384a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen final Rect rect = new Rect(); 385a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen rect.left = (int) (pos[0] * appScale + 0.5f); 386a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen rect.top = (int) (pos[1] * appScale + 0.5f); 387a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen rect.right = (int) ((pos[0] + view.getWidth()) * appScale + 0.5f); 388a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen rect.bottom = (int) ((pos[1] + view.getHeight()) * appScale + 0.5f); 389a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen 390a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen final Intent intent = new Intent(); 391a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen intent.setSourceBounds(rect); 3921927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn clicker.onClickHandler(view, pendingIntentTemplate, fillInIntent); 393a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen } 394a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen } 395a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen }; 396a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen av.setOnItemClickListener(listener); 397a32edd4b4c894f4fb3d9fd7e9d5b80321df79e20Adam Cohen av.setTag(pendingIntentTemplate); 398ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } else { 399ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen Log.e("RemoteViews", "Cannot setPendingIntentTemplate on a view which is not" + 40035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen "an AdapterView (id: " + viewId + ")"); 401ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen return; 402ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 403ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 404ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 405ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen int viewId; 406ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen PendingIntent pendingIntentTemplate; 407ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 408ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen public final static int TAG = 8; 409ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 410ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 411037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung private class SetRemoteViewsAdapterIntent extends Action { 412037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public SetRemoteViewsAdapterIntent(int id, Intent intent) { 413037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung this.viewId = id; 414037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung this.intent = intent; 415037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 416037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 417037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public SetRemoteViewsAdapterIntent(Parcel parcel) { 418037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung viewId = parcel.readInt(); 419037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung intent = Intent.CREATOR.createFromParcel(parcel); 420037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 421037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 422037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public void writeToParcel(Parcel dest, int flags) { 423037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung dest.writeInt(TAG); 424037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung dest.writeInt(viewId); 425037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung intent.writeToParcel(dest, flags); 426037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 427037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 428037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung @Override 4291927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn public void apply(RemoteViews owner, View root, ViewGroup rootParent) { 430037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung final View target = root.findViewById(viewId); 431037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung if (target == null) return; 432037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 433037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung // Ensure that we are applying to an AppWidget root 434037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung if (!(rootParent instanceof AppWidgetHostView)) { 435037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung Log.e("RemoteViews", "SetRemoteViewsAdapterIntent action can only be used for " + 436037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung "AppWidgets (root id: " + viewId + ")"); 437037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung return; 438037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 439037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung // Ensure that we are calling setRemoteAdapter on an AdapterView that supports it 440037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung if (!(target instanceof AbsListView) && !(target instanceof AdapterViewAnimator)) { 441037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung Log.e("RemoteViews", "Cannot setRemoteViewsAdapter on a view which is not " + 442037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung "an AbsListView or AdapterViewAnimator (id: " + viewId + ")"); 443037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung return; 444037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 445037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 446037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung // Embed the AppWidget Id for use in RemoteViewsAdapter when connecting to the intent 447037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung // RemoteViewsService 448037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung AppWidgetHostView host = (AppWidgetHostView) rootParent; 449037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung intent.putExtra(EXTRA_REMOTEADAPTER_APPWIDGET_ID, host.getAppWidgetId()); 450037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung if (target instanceof AbsListView) { 451037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung AbsListView v = (AbsListView) target; 452037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung v.setRemoteViewsAdapter(intent); 453037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } else if (target instanceof AdapterViewAnimator) { 454037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung AdapterViewAnimator v = (AdapterViewAnimator) target; 455037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung v.setRemoteViewsAdapter(intent); 456037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 457037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 458037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 459037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung int viewId; 460037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung Intent intent; 461037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 462037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public final static int TAG = 10; 463037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 464037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.View#setOnClickListener(android.view.View.OnClickListener)} 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to launch the provided {@link PendingIntent}. 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class SetOnClickPendingIntent extends Action { 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SetOnClickPendingIntent(int id, PendingIntent pendingIntent) { 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.viewId = id; 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.pendingIntent = pendingIntent; 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 475ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SetOnClickPendingIntent(Parcel parcel) { 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project viewId = parcel.readInt(); 478c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen 479c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // We check a flag to determine if the parcel contains a PendingIntent. 480c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (parcel.readInt() != 0) { 481c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen pendingIntent = PendingIntent.readPendingIntentOrNullFromParcel(parcel); 482c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 484ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(TAG); 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(viewId); 488c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen 489c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // We use a flag to indicate whether the parcel contains a valid object. 490c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen dest.writeInt(pendingIntent != null ? 1 : 0); 491c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (pendingIntent != null) { 492c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen pendingIntent.writeToParcel(dest, 0 /* no flags */); 493c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 495ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4971927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn public void apply(RemoteViews owner, View root, ViewGroup rootParent) { 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View target = root.findViewById(viewId); 4992b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (target == null) return; 500ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 501ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen // If the view is an AdapterView, setting a PendingIntent on click doesn't make much 502ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen // sense, do they mean to set a PendingIntent template for the AdapterView's children? 503ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen if (mIsWidgetCollectionChild) { 504636fd528f7ad51f565a390226d9f469f8c675ccfDianne Hackborn Log.w("RemoteViews", "Cannot setOnClickPendingIntent for collection item " + 505c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen "(id: " + viewId + ")"); 506ffc46a5c7c60c911fdaab48681c323c89b570dacAdam Cohen ApplicationInfo appInfo = root.getContext().getApplicationInfo(); 507ffc46a5c7c60c911fdaab48681c323c89b570dacAdam Cohen 508ffc46a5c7c60c911fdaab48681c323c89b570dacAdam Cohen // We let this slide for HC and ICS so as to not break compatibility. It should have 509ffc46a5c7c60c911fdaab48681c323c89b570dacAdam Cohen // been disabled from the outset, but was left open by accident. 510ffc46a5c7c60c911fdaab48681c323c89b570dacAdam Cohen if (appInfo != null && 511ffc46a5c7c60c911fdaab48681c323c89b570dacAdam Cohen appInfo.targetSdkVersion >= Build.VERSION_CODES.JELLY_BEAN) { 512ffc46a5c7c60c911fdaab48681c323c89b570dacAdam Cohen return; 513ffc46a5c7c60c911fdaab48681c323c89b570dacAdam Cohen } 514ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 515ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 516c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (target != null) { 517c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // If the pendingIntent is null, we clear the onClickListener 5181927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn final OnClickHandler clicker = owner.mOnClickHandler; 519c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen OnClickListener listener = null; 520c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (pendingIntent != null) { 521c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen listener = new OnClickListener() { 522c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen public void onClick(View v) { 523c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // Find target view location in screen coordinates and 524c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // fill into PendingIntent before sending. 525c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen final float appScale = v.getContext().getResources() 526c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen .getCompatibilityInfo().applicationScale; 527c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen final int[] pos = new int[2]; 528c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen v.getLocationOnScreen(pos); 529c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen 530c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen final Rect rect = new Rect(); 531c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen rect.left = (int) (pos[0] * appScale + 0.5f); 532c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen rect.top = (int) (pos[1] * appScale + 0.5f); 533c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen rect.right = (int) ((pos[0] + v.getWidth()) * appScale + 0.5f); 534c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen rect.bottom = (int) ((pos[1] + v.getHeight()) * appScale + 0.5f); 535c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen 536c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen final Intent intent = new Intent(); 537c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen intent.setSourceBounds(rect); 5381927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn clicker.onClickHandler(v, pendingIntent, intent); 539c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 540c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen }; 541c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project target.setOnClickListener(listener); 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 545c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int viewId; 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PendingIntent pendingIntent; 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static int TAG = 1; 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling a combination of {@link Drawable#setAlpha(int)}, 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Drawable#setColorFilter(int, android.graphics.PorterDuff.Mode)}, 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and/or {@link Drawable#setLevel(int)} on the {@link Drawable} of a given view. 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These operations will be performed on the {@link Drawable} returned by the 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * target {@link View#getBackground()} by default. If targetBackground is false, 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * we assume the target is an {@link ImageView} and try applying the operations 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to {@link ImageView#getDrawable()}. 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You can omit specific calls by marking their values with null or -1. 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class SetDrawableParameters extends Action { 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SetDrawableParameters(int id, boolean targetBackground, int alpha, 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int colorFilter, PorterDuff.Mode mode, int level) { 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.viewId = id; 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.targetBackground = targetBackground; 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.alpha = alpha; 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.colorFilter = colorFilter; 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.filterMode = mode; 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.level = level; 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SetDrawableParameters(Parcel parcel) { 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project viewId = parcel.readInt(); 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetBackground = parcel.readInt() != 0; 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project alpha = parcel.readInt(); 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project colorFilter = parcel.readInt(); 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasMode = parcel.readInt() != 0; 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasMode) { 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filterMode = PorterDuff.Mode.valueOf(parcel.readString()); 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filterMode = null; 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project level = parcel.readInt(); 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(TAG); 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(viewId); 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(targetBackground ? 1 : 0); 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(alpha); 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(colorFilter); 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (filterMode != null) { 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(1); 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(filterMode.toString()); 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(0); 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(level); 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6051927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn public void apply(RemoteViews owner, View root, ViewGroup rootParent) { 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View target = root.findViewById(viewId); 6072b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (target == null) return; 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Pick the correct drawable to modify for this view 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable targetDrawable = null; 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (targetBackground) { 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetDrawable = target.getBackground(); 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (target instanceof ImageView) { 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ImageView imageView = (ImageView) target; 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetDrawable = imageView.getDrawable(); 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 618a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy if (targetDrawable != null) { 619a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy // Perform modifications only if values are set correctly 620a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy if (alpha != -1) { 621a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy targetDrawable.setAlpha(alpha); 622a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy } 623a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy if (colorFilter != -1 && filterMode != null) { 624a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy targetDrawable.setColorFilter(colorFilter, filterMode); 625a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy } 626a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy if (level != -1) { 627a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy targetDrawable.setLevel(level); 628a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy } 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6313ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int viewId; 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean targetBackground; 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int alpha; 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int colorFilter; 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PorterDuff.Mode filterMode; 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int level; 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static int TAG = 3; 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6422dd2197805edb4d9547b143deef2226413218f4cAdam Cohen private class ReflectionActionWithoutParams extends Action { 6432dd2197805edb4d9547b143deef2226413218f4cAdam Cohen int viewId; 6442dd2197805edb4d9547b143deef2226413218f4cAdam Cohen String methodName; 6452dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 6462dd2197805edb4d9547b143deef2226413218f4cAdam Cohen public final static int TAG = 5; 6472dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 6482dd2197805edb4d9547b143deef2226413218f4cAdam Cohen ReflectionActionWithoutParams(int viewId, String methodName) { 6492dd2197805edb4d9547b143deef2226413218f4cAdam Cohen this.viewId = viewId; 6502dd2197805edb4d9547b143deef2226413218f4cAdam Cohen this.methodName = methodName; 6512dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6522dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 6532dd2197805edb4d9547b143deef2226413218f4cAdam Cohen ReflectionActionWithoutParams(Parcel in) { 6542dd2197805edb4d9547b143deef2226413218f4cAdam Cohen this.viewId = in.readInt(); 6552dd2197805edb4d9547b143deef2226413218f4cAdam Cohen this.methodName = in.readString(); 6562dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6572dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 6582dd2197805edb4d9547b143deef2226413218f4cAdam Cohen public void writeToParcel(Parcel out, int flags) { 6592dd2197805edb4d9547b143deef2226413218f4cAdam Cohen out.writeInt(TAG); 6602dd2197805edb4d9547b143deef2226413218f4cAdam Cohen out.writeInt(this.viewId); 6612dd2197805edb4d9547b143deef2226413218f4cAdam Cohen out.writeString(this.methodName); 6622dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6632dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 6642dd2197805edb4d9547b143deef2226413218f4cAdam Cohen @Override 6651927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn public void apply(RemoteViews owner, View root, ViewGroup rootParent) { 6662dd2197805edb4d9547b143deef2226413218f4cAdam Cohen final View view = root.findViewById(viewId); 6672b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (view == null) return; 6682dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 6692dd2197805edb4d9547b143deef2226413218f4cAdam Cohen Class klass = view.getClass(); 6702dd2197805edb4d9547b143deef2226413218f4cAdam Cohen Method method; 6712dd2197805edb4d9547b143deef2226413218f4cAdam Cohen try { 6722dd2197805edb4d9547b143deef2226413218f4cAdam Cohen method = klass.getMethod(this.methodName); 6732dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } catch (NoSuchMethodException ex) { 6742dd2197805edb4d9547b143deef2226413218f4cAdam Cohen throw new ActionException("view: " + klass.getName() + " doesn't have method: " 6752dd2197805edb4d9547b143deef2226413218f4cAdam Cohen + this.methodName + "()"); 6762dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6772dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 6782dd2197805edb4d9547b143deef2226413218f4cAdam Cohen if (!method.isAnnotationPresent(RemotableViewMethod.class)) { 6792dd2197805edb4d9547b143deef2226413218f4cAdam Cohen throw new ActionException("view: " + klass.getName() 6802dd2197805edb4d9547b143deef2226413218f4cAdam Cohen + " can't use method with RemoteViews: " 6812dd2197805edb4d9547b143deef2226413218f4cAdam Cohen + this.methodName + "()"); 6822dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6832dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 6842dd2197805edb4d9547b143deef2226413218f4cAdam Cohen try { 6852dd2197805edb4d9547b143deef2226413218f4cAdam Cohen //noinspection ConstantIfStatement 6862dd2197805edb4d9547b143deef2226413218f4cAdam Cohen if (false) { 6872dd2197805edb4d9547b143deef2226413218f4cAdam Cohen Log.d("RemoteViews", "view: " + klass.getName() + " calling method: " 6882dd2197805edb4d9547b143deef2226413218f4cAdam Cohen + this.methodName + "()"); 6892dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6902dd2197805edb4d9547b143deef2226413218f4cAdam Cohen method.invoke(view); 6912dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } catch (Exception ex) { 6922dd2197805edb4d9547b143deef2226413218f4cAdam Cohen throw new ActionException(ex); 6932dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6942dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6952dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 6962dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 6975d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private static class BitmapCache { 6985d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen ArrayList<Bitmap> mBitmaps; 6995d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 7005d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public BitmapCache() { 7015d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmaps = new ArrayList<Bitmap>(); 7025d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7035d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 7045d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public BitmapCache(Parcel source) { 7055d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen int count = source.readInt(); 7065d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmaps = new ArrayList<Bitmap>(); 7075d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen for (int i = 0; i < count; i++) { 7085d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen Bitmap b = Bitmap.CREATOR.createFromParcel(source); 7095d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmaps.add(b); 7105d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7115d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7125d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 7135d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public int getBitmapId(Bitmap b) { 7145d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (b == null) { 7155d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen return -1; 7165d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } else { 7175d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (mBitmaps.contains(b)) { 7185d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen return mBitmaps.indexOf(b); 7195d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } else { 7205d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmaps.add(b); 7215d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen return (mBitmaps.size() - 1); 7225d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7235d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7245d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7255d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 7265d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public Bitmap getBitmapForId(int id) { 7275d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (id == -1 || id >= mBitmaps.size()) { 7285d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen return null; 7295d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } else { 7305d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen return mBitmaps.get(id); 7315d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7325d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7335d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 7345d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public void writeBitmapsToParcel(Parcel dest, int flags) { 7355d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen int count = mBitmaps.size(); 7365d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeInt(count); 7375d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen for (int i = 0; i < count; i++) { 7385d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmaps.get(i).writeToParcel(dest, flags); 7395d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7405d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7415d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 7425d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public void assimilate(BitmapCache bitmapCache) { 7435d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen ArrayList<Bitmap> bitmapsToBeAdded = bitmapCache.mBitmaps; 7445d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen int count = bitmapsToBeAdded.size(); 7455d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen for (int i = 0; i < count; i++) { 7465d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen Bitmap b = bitmapsToBeAdded.get(i); 7475d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (!mBitmaps.contains(b)) { 7485d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmaps.add(b); 7495d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7505d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7515d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7525d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 7535d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public void addBitmapMemory(MemoryUsageCounter memoryCounter) { 7545d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen for (int i = 0; i < mBitmaps.size(); i++) { 7555d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen memoryCounter.addBitmapMemory(mBitmaps.get(i)); 7565d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7575d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7585d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7595d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 7605d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private class BitmapReflectionAction extends Action { 7615d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen int bitmapId; 7625d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen int viewId; 7635d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen Bitmap bitmap; 7645d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen String methodName; 7655d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 7665d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen BitmapReflectionAction(int viewId, String methodName, Bitmap bitmap) { 7675d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen this.bitmap = bitmap; 7685d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen this.viewId = viewId; 7695d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen this.methodName = methodName; 7705d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen bitmapId = mBitmapCache.getBitmapId(bitmap); 7715d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7725d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 7735d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen BitmapReflectionAction(Parcel in) { 7745d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen viewId = in.readInt(); 7755d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen methodName = in.readString(); 7765d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen bitmapId = in.readInt(); 7775d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen bitmap = mBitmapCache.getBitmapForId(bitmapId); 7785d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7795d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 7805d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen @Override 7815d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public void writeToParcel(Parcel dest, int flags) { 7825d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeInt(TAG); 7835d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeInt(viewId); 7845d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeString(methodName); 7855d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeInt(bitmapId); 7865d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7875d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 7885d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen @Override 7891927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn public void apply(RemoteViews owner, View root, 7901927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn ViewGroup rootParent) throws ActionException { 7915d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen ReflectionAction ra = new ReflectionAction(viewId, methodName, ReflectionAction.BITMAP, 7925d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen bitmap); 7931927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn ra.apply(owner, root, rootParent); 7945d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 7955d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 7965d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen @Override 7975d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public void setBitmapCache(BitmapCache bitmapCache) { 7985d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen bitmapId = bitmapCache.getBitmapId(bitmap); 7995d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 8005d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 8015d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public final static int TAG = 12; 8025d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 8035d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class for the reflection actions. 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class ReflectionAction extends Action { 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int TAG = 2; 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int BOOLEAN = 1; 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int BYTE = 2; 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int SHORT = 3; 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int INT = 4; 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int LONG = 5; 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int FLOAT = 6; 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int DOUBLE = 7; 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int CHAR = 8; 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int STRING = 9; 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int CHAR_SEQUENCE = 10; 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int URI = 11; 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int BITMAP = 12; 822d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert static final int BUNDLE = 13; 823499cb9f516062b654952d282f211bee44c31a3c2Winson Chung static final int INTENT = 14; 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int viewId; 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String methodName; 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object value; 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ReflectionAction(int viewId, String methodName, int type, Object value) { 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.viewId = viewId; 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.methodName = methodName; 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.type = type; 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = value; 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ReflectionAction(Parcel in) { 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.viewId = in.readInt(); 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.methodName = in.readString(); 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.type = in.readInt(); 841a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy //noinspection ConstantIfStatement 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d("RemoteViews", "read viewId=0x" + Integer.toHexString(this.viewId) 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " methodName=" + this.methodName + " type=" + this.type); 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 846c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen 847c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // For some values that may have been null, we first check a flag to see if they were 848c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // written to the parcel. 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (this.type) { 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BOOLEAN: 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readInt() != 0; 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BYTE: 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readByte(); 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SHORT: 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = (short)in.readInt(); 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INT: 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readInt(); 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LONG: 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readLong(); 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FLOAT: 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readFloat(); 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DOUBLE: 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readDouble(); 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR: 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = (char)in.readInt(); 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STRING: 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readString(); 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR_SEQUENCE: 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case URI: 881c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (in.readInt() != 0) { 882c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen this.value = Uri.CREATOR.createFromParcel(in); 883c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BITMAP: 886c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (in.readInt() != 0) { 887c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen this.value = Bitmap.CREATOR.createFromParcel(in); 888c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 890d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert case BUNDLE: 891d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert this.value = in.readBundle(); 892d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert break; 893499cb9f516062b654952d282f211bee44c31a3c2Winson Chung case INTENT: 894c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (in.readInt() != 0) { 895c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen this.value = Intent.CREATOR.createFromParcel(in); 896c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 897499cb9f516062b654952d282f211bee44c31a3c2Winson Chung break; 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, int flags) { 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(TAG); 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(this.viewId); 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(this.methodName); 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(this.type); 908a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy //noinspection ConstantIfStatement 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d("RemoteViews", "write viewId=0x" + Integer.toHexString(this.viewId) 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " methodName=" + this.methodName + " type=" + this.type); 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 913c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen 914c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // For some values which are null, we record an integer flag to indicate whether 915c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen // we have written a valid value to the parcel. 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (this.type) { 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BOOLEAN: 918a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeInt((Boolean) this.value ? 1 : 0); 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BYTE: 921a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeByte((Byte) this.value); 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SHORT: 924a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeInt((Short) this.value); 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INT: 927a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeInt((Integer) this.value); 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LONG: 930a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeLong((Long) this.value); 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FLOAT: 933a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeFloat((Float) this.value); 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DOUBLE: 936a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeDouble((Double) this.value); 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR: 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt((int)((Character)this.value).charValue()); 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STRING: 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString((String)this.value); 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR_SEQUENCE: 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextUtils.writeToParcel((CharSequence)this.value, out, flags); 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case URI: 948c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen out.writeInt(this.value != null ? 1 : 0); 949c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (this.value != null) { 950c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen ((Uri)this.value).writeToParcel(out, flags); 951c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BITMAP: 954c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen out.writeInt(this.value != null ? 1 : 0); 955c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (this.value != null) { 956c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen ((Bitmap)this.value).writeToParcel(out, flags); 957c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 959d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert case BUNDLE: 960d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert out.writeBundle((Bundle) this.value); 961d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert break; 962499cb9f516062b654952d282f211bee44c31a3c2Winson Chung case INTENT: 963c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen out.writeInt(this.value != null ? 1 : 0); 964c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen if (this.value != null) { 965c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen ((Intent)this.value).writeToParcel(out, flags); 966c6151f2369d92e7725d30d13c62b64cff49285a6Adam Cohen } 967499cb9f516062b654952d282f211bee44c31a3c2Winson Chung break; 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Class getParameterType() { 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (this.type) { 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BOOLEAN: 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return boolean.class; 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BYTE: 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return byte.class; 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SHORT: 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return short.class; 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INT: 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return int.class; 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LONG: 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return long.class; 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FLOAT: 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return float.class; 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DOUBLE: 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return double.class; 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR: 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return char.class; 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STRING: 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return String.class; 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR_SEQUENCE: 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return CharSequence.class; 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case URI: 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Uri.class; 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BITMAP: 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Bitmap.class; 999d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert case BUNDLE: 1000d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert return Bundle.class; 1001499cb9f516062b654952d282f211bee44c31a3c2Winson Chung case INTENT: 1002499cb9f516062b654952d282f211bee44c31a3c2Winson Chung return Intent.class; 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10091927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn public void apply(RemoteViews owner, View root, ViewGroup rootParent) { 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View view = root.findViewById(viewId); 10112b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (view == null) return; 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Class param = getParameterType(); 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (param == null) { 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ActionException("bad type: " + this.type); 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Class klass = view.getClass(); 1019a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy Method method; 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method = klass.getMethod(this.methodName, getParameterType()); 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (NoSuchMethodException ex) { 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ActionException("view: " + klass.getName() + " doesn't have method: " 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + this.methodName + "(" + param.getName() + ")"); 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!method.isAnnotationPresent(RemotableViewMethod.class)) { 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ActionException("view: " + klass.getName() 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " can't use method with RemoteViews: " 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + this.methodName + "(" + param.getName() + ")"); 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1035a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy //noinspection ConstantIfStatement 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d("RemoteViews", "view: " + klass.getName() + " calling method: " 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + this.methodName + "(" + param.getName() + ") with " 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (this.value == null ? "null" : this.value.getClass().getName())); 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method.invoke(view, this.value); 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (Exception ex) { 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ActionException(ex); 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10473ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 10483ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung @Override 10493ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung public void updateMemoryUsageEstimate(MemoryUsageCounter counter) { 10503ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // We currently only calculate Bitmap memory usage 10513ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung switch (this.type) { 10523ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung case BITMAP: 10533ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung if (this.value != null) { 10543ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung final Bitmap b = (Bitmap) this.value; 10555d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen counter.addBitmapMemory(b); 10563ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 10573ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung break; 10583ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung default: 10593ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung break; 10603ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 10613ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10645d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private void configureRemoteViewsAsChild(RemoteViews rv) { 10655d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmapCache.assimilate(rv.mBitmapCache); 10665d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen rv.setBitmapCache(mBitmapCache); 10675d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen rv.setNotRoot(); 10685d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 10695d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 10705d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen void setNotRoot() { 10715d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mIsRoot = false; 10725d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 10735d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 10741162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey /** 10751162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * Equivalent to calling {@link ViewGroup#addView(View)} after inflating the 10761162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * given {@link RemoteViews}, or calling {@link ViewGroup#removeAllViews()} 10771162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * when null. This allows users to build "nested" {@link RemoteViews}. 10781162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey */ 10791162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey private class ViewGroupAction extends Action { 10801162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public ViewGroupAction(int viewId, RemoteViews nestedViews) { 10811162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey this.viewId = viewId; 10821162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey this.nestedViews = nestedViews; 1083c431c156bbb5c59f921c031e56744e5d6f12a77aAdam Cohen if (nestedViews != null) { 1084c431c156bbb5c59f921c031e56744e5d6f12a77aAdam Cohen configureRemoteViewsAsChild(nestedViews); 1085c431c156bbb5c59f921c031e56744e5d6f12a77aAdam Cohen } 10861162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 10871162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 10885d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public ViewGroupAction(Parcel parcel, BitmapCache bitmapCache) { 10891162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey viewId = parcel.readInt(); 10905d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen boolean nestedViewsNull = parcel.readInt() == 0; 10915d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (!nestedViewsNull) { 10925d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen nestedViews = new RemoteViews(parcel, bitmapCache); 10935d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } else { 10945d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen nestedViews = null; 10955d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 10961162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 10971162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 10981162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public void writeToParcel(Parcel dest, int flags) { 10991162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey dest.writeInt(TAG); 11001162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey dest.writeInt(viewId); 11015d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (nestedViews != null) { 11025d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeInt(1); 11035d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen nestedViews.writeToParcel(dest, flags); 11045d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } else { 11055d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // signifies null 11065d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeInt(0); 11075d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 11081162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 11091162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 11101162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey @Override 11111927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn public void apply(RemoteViews owner, View root, ViewGroup rootParent) { 11121162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey final Context context = root.getContext(); 11131162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey final ViewGroup target = (ViewGroup) root.findViewById(viewId); 11142b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato if (target == null) return; 11151162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey if (nestedViews != null) { 11161162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey // Inflate nested views and add as children 11171927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn target.addView(nestedViews.apply(owner, context, target)); 11182b69ce469d544f4b2cb6423feaf4da8df7cf7a64Joe Onorato } else { 11191162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey // Clear all children when nested views omitted 11201162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey target.removeAllViews(); 11211162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 11221162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 11231162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 11243ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung @Override 11253ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung public void updateMemoryUsageEstimate(MemoryUsageCounter counter) { 11263ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung if (nestedViews != null) { 11275d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen counter.increment(nestedViews.estimateMemoryUsage()); 11285d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 11295d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 11305d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 11315d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen @Override 11325d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public void setBitmapCache(BitmapCache bitmapCache) { 11335d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (nestedViews != null) { 11345d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen nestedViews.setBitmapCache(bitmapCache); 11353ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 11363ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 11373ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 11381162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey int viewId; 11391162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey RemoteViews nestedViews; 11401162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 11411162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public final static int TAG = 4; 11421162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1145820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * Helper action to set compound drawables on a TextView. Supports relative 1146820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * (s/t/e/b) or cardinal (l/t/r/b) arrangement. 1147820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler */ 1148820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler private class TextViewDrawableAction extends Action { 1149820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler public TextViewDrawableAction(int viewId, boolean isRelative, int d1, int d2, int d3, int d4) { 1150820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler this.viewId = viewId; 1151820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler this.isRelative = isRelative; 1152820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler this.d1 = d1; 1153820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler this.d2 = d2; 1154820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler this.d3 = d3; 1155820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler this.d4 = d4; 1156820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } 1157820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler 1158820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler public TextViewDrawableAction(Parcel parcel) { 1159820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler viewId = parcel.readInt(); 1160820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler isRelative = (parcel.readInt() != 0); 1161820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler d1 = parcel.readInt(); 1162820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler d2 = parcel.readInt(); 1163820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler d3 = parcel.readInt(); 1164820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler d4 = parcel.readInt(); 1165820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } 1166820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler 1167820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler public void writeToParcel(Parcel dest, int flags) { 1168820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler dest.writeInt(TAG); 1169820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler dest.writeInt(viewId); 1170820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler dest.writeInt(isRelative ? 1 : 0); 1171820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler dest.writeInt(d1); 1172820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler dest.writeInt(d2); 1173820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler dest.writeInt(d3); 1174820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler dest.writeInt(d4); 1175820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } 1176820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler 1177820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler @Override 11781927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn public void apply(RemoteViews owner, View root, ViewGroup rootParent) { 1179820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler final Context context = root.getContext(); 1180820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler final TextView target = (TextView) root.findViewById(viewId); 1181820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler if (target == null) return; 1182820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler if (isRelative) { 1183820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler target.setCompoundDrawablesRelativeWithIntrinsicBounds(d1, d2, d3, d4); 1184820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } else { 1185820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler target.setCompoundDrawablesWithIntrinsicBounds(d1, d2, d3, d4); 1186820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } 1187820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } 1188820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler 1189820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler int viewId; 1190820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler boolean isRelative = false; 1191820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler int d1, d2, d3, d4; 1192820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler 1193820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler public final static int TAG = 11; 1194820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } 1195820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler 1196820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler /** 119799d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler * Helper action to set text size on a TextView in any supported units. 11987264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler */ 11997264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler private class TextViewSizeAction extends Action { 12007264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler public TextViewSizeAction(int viewId, int units, float size) { 12017264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler this.viewId = viewId; 12027264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler this.units = units; 12037264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler this.size = size; 12047264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler } 12057264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler 12067264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler public TextViewSizeAction(Parcel parcel) { 12077264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler viewId = parcel.readInt(); 12087264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler units = parcel.readInt(); 12097264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler size = parcel.readFloat(); 12107264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler } 12117264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler 12127264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler public void writeToParcel(Parcel dest, int flags) { 12137264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler dest.writeInt(TAG); 12147264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler dest.writeInt(viewId); 12157264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler dest.writeInt(units); 12167264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler dest.writeFloat(size); 12177264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler } 12187264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler 12197264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler @Override 12201927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn public void apply(RemoteViews owner, View root, ViewGroup rootParent) { 12217264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler final Context context = root.getContext(); 12227264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler final TextView target = (TextView) root.findViewById(viewId); 12237264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler if (target == null) return; 12247264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler target.setTextSize(units, size); 12257264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler } 12267264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler 12277264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler int viewId; 12287264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler int units; 12297264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler float size; 12307264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler 12317264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler public final static int TAG = 13; 12327264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler } 12337264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler 12347264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler /** 123599d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler * Helper action to set padding on a View. 123699d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler */ 123799d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler private class ViewPaddingAction extends Action { 123899d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler public ViewPaddingAction(int viewId, int left, int top, int right, int bottom) { 123999d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler this.viewId = viewId; 124099d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler this.left = left; 124199d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler this.top = top; 124299d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler this.right = right; 124399d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler this.bottom = bottom; 124499d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler } 124599d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler 124699d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler public ViewPaddingAction(Parcel parcel) { 124799d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler viewId = parcel.readInt(); 124899d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler left = parcel.readInt(); 124999d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler top = parcel.readInt(); 125099d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler right = parcel.readInt(); 125199d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler bottom = parcel.readInt(); 125299d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler } 125399d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler 125499d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler public void writeToParcel(Parcel dest, int flags) { 125599d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler dest.writeInt(TAG); 125699d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler dest.writeInt(viewId); 125799d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler dest.writeInt(left); 125899d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler dest.writeInt(top); 125999d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler dest.writeInt(right); 126099d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler dest.writeInt(bottom); 126199d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler } 126299d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler 126399d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler @Override 12641927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn public void apply(RemoteViews owner, View root, ViewGroup rootParent) { 126599d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler final Context context = root.getContext(); 126699d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler final View target = root.findViewById(viewId); 126799d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler if (target == null) return; 126899d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler target.setPadding(left, top, right, bottom); 126999d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler } 127099d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler 127199d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler int viewId; 127299d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler int left, top, right, bottom; 127399d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler 127499d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler public final static int TAG = 14; 127599d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler } 127699d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler 127799d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler /** 12783ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung * Simple class used to keep track of memory usage in a RemoteViews. 12793ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung * 12803ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung */ 12813ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung private class MemoryUsageCounter { 12823ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung public void clear() { 12835d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mMemoryUsage = 0; 12843ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 12853ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 12865d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public void increment(int numBytes) { 12875d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mMemoryUsage += numBytes; 12883ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 12893ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 12905d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public int getMemoryUsage() { 12915d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen return mMemoryUsage; 12923ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 12933ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 12945d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public void addBitmapMemory(Bitmap b) { 12955d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen final Bitmap.Config c = b.getConfig(); 12965d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // If we don't know, be pessimistic and assume 4 12975d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen int bpp = 4; 12985d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (c != null) { 12995d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen switch (c) { 13005d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case ALPHA_8: 13015d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen bpp = 1; 13025d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 13035d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case RGB_565: 13045d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case ARGB_4444: 13055d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen bpp = 2; 13065d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 13075d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case ARGB_8888: 13085d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen bpp = 4; 13095d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 13105d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 13115d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 13125d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen increment(b.getWidth() * b.getHeight() * bpp); 13135d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 13145d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 13155d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen int mMemoryUsage; 13163ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 13173ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 13183ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung /** 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new RemoteViews object that will display the views contained 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the specified layout file. 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param packageName Name of the package that contains the layout resource 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param layoutId The id of the layout resource 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RemoteViews(String packageName, int layoutId) { 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackage = packageName; 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutId = layoutId; 13285d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmapCache = new BitmapCache(); 13293ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 13303ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // setup the memory usage statistics 13313ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung mMemoryUsageCounter = new MemoryUsageCounter(); 13323ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung recalculateMemoryUsage(); 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13355d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private boolean hasLandscapeAndPortraitLayouts() { 13365d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen return (mLandscape != null) && (mPortrait != null); 13375d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 13385d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 13395d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen /** 13405d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * Create a new RemoteViews object that will inflate as the specified 13415d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * landspace or portrait RemoteViews, depending on the current configuration. 13425d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * 13435d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * @param landscape The RemoteViews to inflate in landscape configuration 13445d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * @param portrait The RemoteViews to inflate in portrait configuration 13455d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen */ 13465d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen public RemoteViews(RemoteViews landscape, RemoteViews portrait) { 13475d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (landscape == null || portrait == null) { 13485d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen throw new RuntimeException("Both RemoteViews must be non-null"); 13495d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 13505d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (landscape.getPackage().compareTo(portrait.getPackage()) != 0) { 13515d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen throw new RuntimeException("Both RemoteViews must share the same package"); 13525d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 13535d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mPackage = portrait.getPackage(); 13545d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mLayoutId = portrait.getLayoutId(); 13555d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 13565d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mLandscape = landscape; 13575d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mPortrait = portrait; 13585d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 13595d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // setup the memory usage statistics 13605d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mMemoryUsageCounter = new MemoryUsageCounter(); 13615d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 13625d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmapCache = new BitmapCache(); 13635d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen configureRemoteViewsAsChild(landscape); 13645d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen configureRemoteViewsAsChild(portrait); 13655d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 13665d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen recalculateMemoryUsage(); 13675d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 13685d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reads a RemoteViews object from a parcel. 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parcel 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RemoteViews(Parcel parcel) { 13755d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen this(parcel, null); 13765d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 1377ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 13785d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private RemoteViews(Parcel parcel, BitmapCache bitmapCache) { 13795d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen int mode = parcel.readInt(); 13805d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 13815d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // We only store a bitmap cache in the root of the RemoteViews. 13825d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (bitmapCache == null) { 13835d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmapCache = new BitmapCache(parcel); 13845d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } else { 13855d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen setBitmapCache(bitmapCache); 13865d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen setNotRoot(); 13875d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 13885d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 13895d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (mode == MODE_NORMAL) { 13905d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mPackage = parcel.readString(); 13915d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mLayoutId = parcel.readInt(); 13925d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mIsWidgetCollectionChild = parcel.readInt() == 1 ? true : false; 13935d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 13945d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen int count = parcel.readInt(); 13955d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (count > 0) { 13965d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions = new ArrayList<Action>(count); 13975d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen for (int i=0; i<count; i++) { 13985d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen int tag = parcel.readInt(); 13995d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen switch (tag) { 14005d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case SetOnClickPendingIntent.TAG: 14015d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.add(new SetOnClickPendingIntent(parcel)); 14025d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 14035d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case SetDrawableParameters.TAG: 14045d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.add(new SetDrawableParameters(parcel)); 14055d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 14065d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case ReflectionAction.TAG: 14075d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.add(new ReflectionAction(parcel)); 14085d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 14095d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case ViewGroupAction.TAG: 14105d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.add(new ViewGroupAction(parcel, mBitmapCache)); 14115d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 14125d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case ReflectionActionWithoutParams.TAG: 14135d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.add(new ReflectionActionWithoutParams(parcel)); 14145d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 14155d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case SetEmptyView.TAG: 14165d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.add(new SetEmptyView(parcel)); 14175d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 14185d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case SetPendingIntentTemplate.TAG: 14195d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.add(new SetPendingIntentTemplate(parcel)); 14205d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 14215d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case SetOnClickFillInIntent.TAG: 14225d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.add(new SetOnClickFillInIntent(parcel)); 14235d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 14245d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case SetRemoteViewsAdapterIntent.TAG: 14255d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.add(new SetRemoteViewsAdapterIntent(parcel)); 14265d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 14275d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case TextViewDrawableAction.TAG: 14285d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.add(new TextViewDrawableAction(parcel)); 14295d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 14307264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler case TextViewSizeAction.TAG: 14317264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler mActions.add(new TextViewSizeAction(parcel)); 14327264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler break; 143399d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler case ViewPaddingAction.TAG: 143499d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler mActions.add(new ViewPaddingAction(parcel)); 143599d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler break; 14365d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen case BitmapReflectionAction.TAG: 14375d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.add(new BitmapReflectionAction(parcel)); 14385d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen break; 14395d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen default: 14405d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen throw new ActionException("Tag " + tag + " not found"); 14415d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14445d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } else { 14455d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // MODE_HAS_LANDSCAPE_AND_PORTRAIT 14465d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mLandscape = new RemoteViews(parcel, mBitmapCache); 14475d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mPortrait = new RemoteViews(parcel, mBitmapCache); 14485d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mPackage = mPortrait.getPackage(); 14495d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mLayoutId = mPortrait.getLayoutId(); 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14513ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 14523ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // setup the memory usage statistics 14533ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung mMemoryUsageCounter = new MemoryUsageCounter(); 14543ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung recalculateMemoryUsage(); 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14573030193dc179b3010f2dd3bffe9c1dec54da38fcGilles Debunne @Override 145818e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato public RemoteViews clone() { 14595d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen RemoteViews that; 14605d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (!hasLandscapeAndPortraitLayouts()) { 14615d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen that = new RemoteViews(mPackage, mLayoutId); 14623ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 14635d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (mActions != null) { 14645d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen that.mActions = (ArrayList<Action>)mActions.clone(); 14655d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 14665d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } else { 14675d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen RemoteViews land = mLandscape.clone(); 14685d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen RemoteViews port = mPortrait.clone(); 14695d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen that = new RemoteViews(land, port); 14705d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 14713ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // update the memory usage stats of the cloned RemoteViews 14723ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung that.recalculateMemoryUsage(); 147318e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato return that; 147418e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato } 147518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPackage() { 14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackage; 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14805d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen /** 14815d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * Reutrns the layout id of the root layout associated with this RemoteViews. In the case 14825d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * that the RemoteViews has both a landscape and portrait root, this will return the layout 14835d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * id associated with the portrait layout. 14845d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * 14855d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * @return the layout id. 14865d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen */ 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getLayoutId() { 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLayoutId; 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14913ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung /* 1492ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * This flag indicates whether this RemoteViews object is being created from a 1493ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * RemoteViewsService for use as a child of a widget collection. This flag is used 1494ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * to determine whether or not certain features are available, in particular, 1495ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * setting on click extras and setting on click pending intents. The former is enabled, 1496ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * and the latter disabled when this flag is true. 1497ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen */ 1498ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen void setIsWidgetCollectionChild(boolean isWidgetCollectionChild) { 1499ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen mIsWidgetCollectionChild = isWidgetCollectionChild; 1500ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 1501ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 1502ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen /** 15033ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung * Updates the memory usage statistics. 15043ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung */ 15053ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung private void recalculateMemoryUsage() { 15063ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung mMemoryUsageCounter.clear(); 15073ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 15085d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (!hasLandscapeAndPortraitLayouts()) { 15095d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // Accumulate the memory usage for each action 15105d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (mActions != null) { 15115d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen final int count = mActions.size(); 15125d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen for (int i= 0; i < count; ++i) { 15135d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.get(i).updateMemoryUsageEstimate(mMemoryUsageCounter); 15145d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 15155d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 15165d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (mIsRoot) { 15175d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmapCache.addBitmapMemory(mMemoryUsageCounter); 15183ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 15195d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } else { 15205d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mMemoryUsageCounter.increment(mLandscape.estimateMemoryUsage()); 15215d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mMemoryUsageCounter.increment(mPortrait.estimateMemoryUsage()); 15225d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmapCache.addBitmapMemory(mMemoryUsageCounter); 15235d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 15245d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 15255d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 15265d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen /** 15275d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen * Recursively sets BitmapCache in the hierarchy and update the bitmap ids. 15285d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen */ 15295d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private void setBitmapCache(BitmapCache bitmapCache) { 15305d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmapCache = bitmapCache; 15315d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (!hasLandscapeAndPortraitLayouts()) { 15325d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (mActions != null) { 15335d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen final int count = mActions.size(); 15345d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen for (int i= 0; i < count; ++i) { 15355d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mActions.get(i).setBitmapCache(bitmapCache); 15365d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 15375d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 15385d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } else { 15395d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mLandscape.setBitmapCache(bitmapCache); 15405d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mPortrait.setBitmapCache(bitmapCache); 15413ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 15423ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 15433ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 15443ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung /** 15453ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung * Returns an estimate of the bitmap heap memory usage for this RemoteViews. 15463ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung */ 1547311c79c3e93589c6fc720fe6c58ed522af591376Adam Cohen /** @hide */ 1548311c79c3e93589c6fc720fe6c58ed522af591376Adam Cohen public int estimateMemoryUsage() { 15495d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen return mMemoryUsageCounter.getMemoryUsage(); 15503ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung } 15513ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 15523ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung /** 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add an action to be executed on the remote side when apply is called. 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param a The action to add 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void addAction(Action a) { 15585d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (hasLandscapeAndPortraitLayouts()) { 15595d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen throw new RuntimeException("RemoteViews specifying separate landscape and portrait" + 15605d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen " layouts cannot be modified. Instead, fully configure the landscape and" + 15615d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen " portrait layouts individually before constructing the combined layout."); 15625d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActions == null) { 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActions = new ArrayList<Action>(); 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActions.add(a); 15673ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung 15683ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung // update the memory usage stats 15693ec9a45c36d3ca5ffbc6e85bbeb497b065e14155Winson Chung a.updateMemoryUsageEstimate(mMemoryUsageCounter); 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15711162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 15721162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey /** 15731162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * Equivalent to calling {@link ViewGroup#addView(View)} after inflating the 15741162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * given {@link RemoteViews}. This allows users to build "nested" 15751162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * {@link RemoteViews}. In cases where consumers of {@link RemoteViews} may 15761162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * recycle layouts, use {@link #removeAllViews(int)} to clear any existing 15771162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * children. 15781162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * 15791162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * @param viewId The id of the parent {@link ViewGroup} to add child into. 15801162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * @param nestedView {@link RemoteViews} that describes the child. 15811162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey */ 15821162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public void addView(int viewId, RemoteViews nestedView) { 15831162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey addAction(new ViewGroupAction(viewId, nestedView)); 15841162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 15851162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 15861162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey /** 15871162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * Equivalent to calling {@link ViewGroup#removeAllViews()}. 15881162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * 15891162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * @param viewId The id of the parent {@link ViewGroup} to remove all 15901162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * children from. 15911162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey */ 15921162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public void removeAllViews(int viewId) { 15931162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey addAction(new ViewGroupAction(viewId, null)); 15941162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 15951162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15970b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * Equivalent to calling {@link AdapterViewAnimator#showNext()} 15982dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * 15990b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * @param viewId The id of the view on which to call {@link AdapterViewAnimator#showNext()} 16002dd2197805edb4d9547b143deef2226413218f4cAdam Cohen */ 16012dd2197805edb4d9547b143deef2226413218f4cAdam Cohen public void showNext(int viewId) { 16022dd2197805edb4d9547b143deef2226413218f4cAdam Cohen addAction(new ReflectionActionWithoutParams(viewId, "showNext")); 16032dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 16042dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 16052dd2197805edb4d9547b143deef2226413218f4cAdam Cohen /** 16060b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * Equivalent to calling {@link AdapterViewAnimator#showPrevious()} 16072dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * 16080b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * @param viewId The id of the view on which to call {@link AdapterViewAnimator#showPrevious()} 16092dd2197805edb4d9547b143deef2226413218f4cAdam Cohen */ 16102dd2197805edb4d9547b143deef2226413218f4cAdam Cohen public void showPrevious(int viewId) { 16112dd2197805edb4d9547b143deef2226413218f4cAdam Cohen addAction(new ReflectionActionWithoutParams(viewId, "showPrevious")); 16122dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 16132dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 16142dd2197805edb4d9547b143deef2226413218f4cAdam Cohen /** 16150b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * Equivalent to calling {@link AdapterViewAnimator#setDisplayedChild(int)} 16160b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * 16170b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * @param viewId The id of the view on which to call 16180b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen * {@link AdapterViewAnimator#setDisplayedChild(int)} 16190b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen */ 16200b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen public void setDisplayedChild(int viewId, int childIndex) { 16210b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen setInt(viewId, "setDisplayedChild", childIndex); 16220b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen } 16230b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen 16240b96a57c851af2f66e3bc738035478efb3c1957eAdam Cohen /** 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling View.setVisibility 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose visibility should change 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param visibility The new visibility for the view 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setViewVisibility(int viewId, int visibility) { 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInt(viewId, "setVisibility", visibility); 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1633ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling TextView.setText 16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose text should change 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param text The new text for the view 16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTextViewText(int viewId, CharSequence text) { 16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setCharSequence(viewId, "setText", text); 16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16437264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler 16447264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler /** 16457264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler * Equivalent to calling {@link TextView#setTextSize(int, float)} 16467264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler * 16477264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler * @param viewId The id of the view whose text size should change 16487264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler * @param units The units of size (e.g. COMPLEX_UNIT_SP) 16497264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler * @param size The size of the text 16507264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler */ 16517264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler public void setTextViewTextSize(int viewId, int units, float size) { 16527264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler addAction(new TextViewSizeAction(viewId, units, size)); 16537264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler } 16547264f71399018e2dd79d974ee5162cf652ac786fDaniel Sandler 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1656820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * Equivalent to calling 1657820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * {@link TextView#setCompoundDrawablesWithIntrinsicBounds(int, int, int, int)}. 1658820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * 1659820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param viewId The id of the view whose text should change 1660820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param left The id of a drawable to place to the left of the text, or 0 1661820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param top The id of a drawable to place above the text, or 0 1662820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param right The id of a drawable to place to the right of the text, or 0 1663820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param bottom The id of a drawable to place below the text, or 0 1664820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler */ 1665820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler public void setTextViewCompoundDrawables(int viewId, int left, int top, int right, int bottom) { 1666820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler addAction(new TextViewDrawableAction(viewId, false, left, top, right, bottom)); 1667820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } 1668820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler 1669820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler /** 1670820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param viewId The id of the view whose text should change 167166388dcb09018933ccd1d38eae563f0890ba4f06Fabrice Di Meglio * @param start The id of a drawable to place before the text (relative to the 1672820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * layout direction), or 0 1673820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param top The id of a drawable to place above the text, or 0 1674820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler * @param end The id of a drawable to place after the text, or 0 167566388dcb09018933ccd1d38eae563f0890ba4f06Fabrice Di Meglio * @param bottom The id of a drawable to place below the text, or 0 1676820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler */ 1677820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler public void setTextViewCompoundDrawablesRelative(int viewId, int start, int top, int end, int bottom) { 1678820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler addAction(new TextViewDrawableAction(viewId, true, start, top, end, bottom)); 1679820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler } 1680820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler 1681820ba323f9919d33aac5e999bd8daa7842d3969cDaniel Sandler /** 16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling ImageView.setImageResource 16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose drawable should change 16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param srcId The new resource id for the drawable 16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setImageViewResource(int viewId, int srcId) { 16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInt(viewId, "setImageResource", srcId); 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling ImageView.setImageURI 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose drawable should change 16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param uri The Uri for the image 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setImageViewUri(int viewId, Uri uri) { 16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setUri(viewId, "setImageURI", uri); 16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling ImageView.setImageBitmap 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 170493dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view whose bitmap should change 17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bitmap The new Bitmap for the drawable 17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setImageViewBitmap(int viewId, Bitmap bitmap) { 17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBitmap(viewId, "setImageBitmap", bitmap); 17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17121480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen * Equivalent to calling AdapterView.setEmptyView 17131480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen * 17141480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen * @param viewId The id of the view on which to set the empty view 17151480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen * @param emptyViewId The view id of the empty view 17161480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen */ 17171480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen public void setEmptyView(int viewId, int emptyViewId) { 17181480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen addAction(new SetEmptyView(viewId, emptyViewId)); 17191480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 17201480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 17211480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen /** 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling {@link Chronometer#setBase Chronometer.setBase}, 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Chronometer#setFormat Chronometer.setFormat}, 17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and {@link Chronometer#start Chronometer.start()} or 17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Chronometer#stop Chronometer.stop()}. 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 172793dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the {@link Chronometer} to change 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param base The time at which the timer would have read 0:00. This 17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * time should be based off of 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.os.SystemClock#elapsedRealtime SystemClock.elapsedRealtime()}. 17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param format The Chronometer format string, or null to 17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * simply display the timer value. 17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param started True if you want the clock to be started, false if not. 17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setChronometer(int viewId, long base, String format, boolean started) { 17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setLong(viewId, "setBase", base); 17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setString(viewId, "setFormat", format); 17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBoolean(viewId, "setStarted", started); 17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling {@link ProgressBar#setMax ProgressBar.setMax}, 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ProgressBar#setProgress ProgressBar.setProgress}, and 17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ProgressBar#setIndeterminate ProgressBar.setIndeterminate} 17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If indeterminate is true, then the values for max and progress are ignored. 17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 174893dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the {@link ProgressBar} to change 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param max The 100% value for the progress bar 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param progress The current value of the progress bar. 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param indeterminate True if the progress bar is indeterminate, 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * false if not. 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setProgressBar(int viewId, int max, int progress, 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean indeterminate) { 17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBoolean(viewId, "setIndeterminate", indeterminate); 17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!indeterminate) { 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInt(viewId, "setMax", max); 17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInt(viewId, "setProgress", progress); 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling 17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.View#setOnClickListener(android.view.View.OnClickListener)} 17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to launch the provided {@link PendingIntent}. 17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 176835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * When setting the on-click action of items within collections (eg. {@link ListView}, 176935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * {@link StackView} etc.), this method will not work. Instead, use {@link 177035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * RemoteViews#setPendingIntentTemplate(int, PendingIntent) in conjunction with 177135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * RemoteViews#setOnClickFillInIntent(int, Intent). 177235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * 17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view that will trigger the {@link PendingIntent} when clicked 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pendingIntent The {@link PendingIntent} to send when user clicks 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnClickPendingIntent(int viewId, PendingIntent pendingIntent) { 17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new SetOnClickPendingIntent(viewId, pendingIntent)); 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 178135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * When using collections (eg. {@link ListView}, {@link StackView} etc.) in widgets, it is very 178235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * costly to set PendingIntents on the individual items, and is hence not permitted. Instead 178335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * this method should be used to set a single PendingIntent template on the collection, and 178435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * individual items can differentiate their on-click behavior using 178535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * {@link RemoteViews#setOnClickFillInIntent(int, Intent)}. 1786ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * 1787ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * @param viewId The id of the collection who's children will use this PendingIntent template 1788ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * when clicked 1789ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * @param pendingIntentTemplate The {@link PendingIntent} to be combined with extras specified 1790ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen * by a child of viewId and executed when that child is clicked 1791ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen */ 1792ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen public void setPendingIntentTemplate(int viewId, PendingIntent pendingIntentTemplate) { 1793ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen addAction(new SetPendingIntentTemplate(viewId, pendingIntentTemplate)); 1794ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen } 1795ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen 1796ca6fd847945464c2ddddcd165021082c048f05fbAdam Cohen /** 179735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * When using collections (eg. {@link ListView}, {@link StackView} etc.) in widgets, it is very 179835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * costly to set PendingIntents on the individual items, and is hence not permitted. Instead 179935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * a single PendingIntent template can be set on the collection, see {@link 180035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * RemoteViews#setPendingIntentTemplate(int, PendingIntent)}, and the individual on-click 180135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * action of a given item can be distinguished by setting a fillInIntent on that item. The 180235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * fillInIntent is then combined with the PendingIntent template in order to determine the final 180335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * intent which will be executed when the item is clicked. This works as follows: any fields 180435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * which are left blank in the PendingIntent template, but are provided by the fillInIntent 180535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * will be overwritten, and the resulting PendingIntent will be used. 180635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * 180735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * 180835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * of the PendingIntent template will then be filled in with the associated fields that are 180935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * set in fillInIntent. See {@link Intent#fillIn(Intent, int)} for more details. 181035ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * 181135ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * @param viewId The id of the view on which to set the fillInIntent 181235ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * @param fillInIntent The intent which will be combined with the parent's PendingIntent 181335ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen * in order to determine the on-click behavior of the view specified by viewId 181435ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen */ 181535ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen public void setOnClickFillInIntent(int viewId, Intent fillInIntent) { 181635ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen addAction(new SetOnClickFillInIntent(viewId, fillInIntent)); 181735ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen } 181835ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen 181935ae9ca5bf4b99bc341afe43d501a2d166f5df43Adam Cohen /** 18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling a combination of {@link Drawable#setAlpha(int)}, 18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Drawable#setColorFilter(int, android.graphics.PorterDuff.Mode)}, 18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and/or {@link Drawable#setLevel(int)} on the {@link Drawable} of a given 18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * view. 18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You can omit specific calls by marking their values with null or -1. 18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view that contains the target 18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Drawable} 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param targetBackground If true, apply these parameters to the 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Drawable} returned by 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.View#getBackground()}. Otherwise, assume 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the target view is an {@link ImageView} and apply them to 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ImageView#getDrawable()}. 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param alpha Specify an alpha value for the drawable, or -1 to leave 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unchanged. 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param colorFilter Specify a color for a 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.graphics.ColorFilter} for this drawable, or -1 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to leave unchanged. 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param mode Specify a PorterDuff mode for this drawable, or null to leave 18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unchanged. 18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param level Specify the level for the drawable, or -1 to leave 18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unchanged. 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDrawableParameters(int viewId, boolean targetBackground, int alpha, 18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int colorFilter, PorterDuff.Mode mode, int level) { 18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new SetDrawableParameters(viewId, targetBackground, alpha, 18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project colorFilter, mode, level)); 18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling {@link android.widget.TextView#setTextColor(int)}. 18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 185493dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view whose text color should change 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param color Sets the text color for all the states (normal, selected, 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * focused) to be this color. 18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTextColor(int viewId, int color) { 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInt(viewId, "setTextColor", color); 18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1862592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1863499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * Equivalent to calling {@link android.widget.AbsListView#setRemoteViewsAdapter(Intent)}. 1864499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * 1865037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * @param appWidgetId The id of the app widget which contains the specified view. (This 1866037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * parameter is ignored in this deprecated method) 186793dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the {@link AbsListView} 186881f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * @param intent The intent of the service which will be 186981f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung * providing data to the RemoteViewsAdapter 1870037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * @deprecated This method has been deprecated. See 1871037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * {@link android.widget.RemoteViews#setRemoteAdapter(int, Intent)} 187281f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung */ 1873037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung @Deprecated 187481f39eb6e76d0be1dd341af835e8002a0f80524eWinson Chung public void setRemoteAdapter(int appWidgetId, int viewId, Intent intent) { 1875037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung setRemoteAdapter(viewId, intent); 1876037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung } 1877037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung 1878037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung /** 1879037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * Equivalent to calling {@link android.widget.AbsListView#setRemoteViewsAdapter(Intent)}. 1880037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * Can only be used for App Widgets. 1881037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * 188293dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the {@link AbsListView} 1883037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * @param intent The intent of the service which will be 1884037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung * providing data to the RemoteViewsAdapter 1885037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung */ 1886037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung public void setRemoteAdapter(int viewId, Intent intent) { 1887037300bba5c87c9a9efe1f693b48f6ff1ffd7479Winson Chung addAction(new SetRemoteViewsAdapterIntent(viewId, intent)); 1888499cb9f516062b654952d282f211bee44c31a3c2Winson Chung } 1889499cb9f516062b654952d282f211bee44c31a3c2Winson Chung 1890499cb9f516062b654952d282f211bee44c31a3c2Winson Chung /** 1891499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * Equivalent to calling {@link android.widget.AbsListView#smoothScrollToPosition(int, int)}. 1892499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * 189393dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view to change 1894499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * @param position Scroll to this adapter position 1895499cb9f516062b654952d282f211bee44c31a3c2Winson Chung */ 1896499cb9f516062b654952d282f211bee44c31a3c2Winson Chung public void setScrollPosition(int viewId, int position) { 1897499cb9f516062b654952d282f211bee44c31a3c2Winson Chung setInt(viewId, "smoothScrollToPosition", position); 1898499cb9f516062b654952d282f211bee44c31a3c2Winson Chung } 1899499cb9f516062b654952d282f211bee44c31a3c2Winson Chung 1900499cb9f516062b654952d282f211bee44c31a3c2Winson Chung /** 1901499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * Equivalent to calling {@link android.widget.AbsListView#smoothScrollToPosition(int, int)}. 1902499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * 190393dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view to change 190495362595ed4a42aec87b4d166092b30c8139d220Winson Chung * @param offset Scroll by this adapter position offset 1905499cb9f516062b654952d282f211bee44c31a3c2Winson Chung */ 1906499cb9f516062b654952d282f211bee44c31a3c2Winson Chung public void setRelativeScrollPosition(int viewId, int offset) { 1907499cb9f516062b654952d282f211bee44c31a3c2Winson Chung setInt(viewId, "smoothScrollByOffset", offset); 1908499cb9f516062b654952d282f211bee44c31a3c2Winson Chung } 1909499cb9f516062b654952d282f211bee44c31a3c2Winson Chung 1910499cb9f516062b654952d282f211bee44c31a3c2Winson Chung /** 1911d5353b475001f19e3cbc9c1a4165c9e6038a812fDaniel Sandler * Equivalent to calling {@link android.view.View#setPadding(int, int, int, int)}. 191299d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler * 191399d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler * @param viewId The id of the view to change 191499d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler * @param left the left padding in pixels 191599d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler * @param top the top padding in pixels 191699d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler * @param right the right padding in pixels 191799d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler * @param bottom the bottom padding in pixels 191899d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler */ 191999d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler public void setViewPadding(int viewId, int left, int top, int right, int bottom) { 192099d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler addAction(new ViewPaddingAction(viewId, left, top, right, bottom)); 192199d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler } 192299d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler 192399d1f74864c3449585690f85a5fe6fb36ef796d5Daniel Sandler /** 1924592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one boolean on a view in the layout for this RemoteViews. 1925592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 192693dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1927592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1928592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1929592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setBoolean(int viewId, String methodName, boolean value) { 19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.BOOLEAN, value)); 19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1934592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1935592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one byte on a view in the layout for this RemoteViews. 1936592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 193793dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1938592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1939592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1940592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setByte(int viewId, String methodName, byte value) { 19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.BYTE, value)); 19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1945592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1946592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one short on a view in the layout for this RemoteViews. 1947592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 194893dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1949592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1950592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1951592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setShort(int viewId, String methodName, short value) { 19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.SHORT, value)); 19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1956592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1957592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one int on a view in the layout for this RemoteViews. 1958592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 195993dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1960592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1961592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1962592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setInt(int viewId, String methodName, int value) { 19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.INT, value)); 19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1967592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1968592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one long on a view in the layout for this RemoteViews. 1969592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 197093dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1971592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1972592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1973592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setLong(int viewId, String methodName, long value) { 19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.LONG, value)); 19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1978592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1979592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one float on a view in the layout for this RemoteViews. 1980592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 198193dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1982592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1983592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1984592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFloat(int viewId, String methodName, float value) { 19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.FLOAT, value)); 19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1990592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one double on a view in the layout for this RemoteViews. 1991592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 199293dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 1993592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1994592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1995592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDouble(int viewId, String methodName, double value) { 19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.DOUBLE, value)); 19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2000592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 2001592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one char on a view in the layout for this RemoteViews. 2002592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 200393dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 2004592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 2005592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 2006592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setChar(int viewId, String methodName, char value) { 20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.CHAR, value)); 20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2011592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 2012592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one String on a view in the layout for this RemoteViews. 2013592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 201493dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 2015592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 2016592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 2017592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setString(int viewId, String methodName, String value) { 20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.STRING, value)); 20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2022592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 2023592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one CharSequence on a view in the layout for this RemoteViews. 2024592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 202593dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 2026592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 2027592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 2028592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setCharSequence(int viewId, String methodName, CharSequence value) { 20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.CHAR_SEQUENCE, value)); 20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2033592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 2034592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one Uri on a view in the layout for this RemoteViews. 2035592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 203693dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 2037592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 2038592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 2039592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setUri(int viewId, String methodName, Uri value) { 20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.URI, value)); 20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2044592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 2045592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one Bitmap on a view in the layout for this RemoteViews. 2046592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @more 2047592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * <p class="note">The bitmap will be flattened into the parcel if this object is 2048592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * sent across processes, so it may end up using a lot of memory, and may be fairly slow.</p> 2049592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 205093dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 2051592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 2052592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 2053592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setBitmap(int viewId, String methodName, Bitmap value) { 20555d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen addAction(new BitmapReflectionAction(viewId, methodName, value)); 20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2059d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert * Call a method taking one Bundle on a view in the layout for this RemoteViews. 2060d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert * 206193dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 2062d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert * @param methodName The name of the method to call. 2063d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert * @param value The value to pass to the method. 2064d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert */ 2065d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert public void setBundle(int viewId, String methodName, Bundle value) { 2066d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert addAction(new ReflectionAction(viewId, methodName, ReflectionAction.BUNDLE, value)); 2067d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert } 2068d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert 2069d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert /** 207093dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * Call a method taking one Intent on a view in the layout for this RemoteViews. 2071499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * 207293dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param viewId The id of the view on which to call the method. 207393dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param methodName The name of the method to call. 207493dc642eaf48e3db58c4929df26283fbc5fd663fScott Main * @param value The {@link android.content.Intent} to pass the method. 2075499cb9f516062b654952d282f211bee44c31a3c2Winson Chung */ 2076499cb9f516062b654952d282f211bee44c31a3c2Winson Chung public void setIntent(int viewId, String methodName, Intent value) { 2077499cb9f516062b654952d282f211bee44c31a3c2Winson Chung addAction(new ReflectionAction(viewId, methodName, ReflectionAction.INTENT, value)); 2078499cb9f516062b654952d282f211bee44c31a3c2Winson Chung } 2079499cb9f516062b654952d282f211bee44c31a3c2Winson Chung 2080499cb9f516062b654952d282f211bee44c31a3c2Winson Chung /** 2081e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov * Equivalent to calling View.setContentDescription 2082e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov * 2083e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov * @param viewId The id of the view whose content description should change 2084e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov * @param contentDescription The new content description for the view 2085e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov */ 2086e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov public void setContentDescription(int viewId, CharSequence contentDescription) { 2087e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov setCharSequence(viewId, "setContentDescription", contentDescription); 2088e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov } 2089e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov 20905d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen private RemoteViews getRemoteViewsToApply(Context context) { 20915d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (hasLandscapeAndPortraitLayouts()) { 20925d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen int orientation = context.getResources().getConfiguration().orientation; 20935d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (orientation == Configuration.ORIENTATION_LANDSCAPE) { 20945d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen return mLandscape; 20955d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } else { 20965d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen return mPortrait; 20975d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 20985d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 20995d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen return this; 21005d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 21015d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 21021927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn /** @hide */ 21031927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn public void setOnClickHandler(OnClickHandler handler) { 21041927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn mOnClickHandler = handler; 21051927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn } 21061927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn 2107e261e283eaedd38235fc93b2a5c35758c613b10cSvetoslav Ganov /** 21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inflates the view hierarchy represented by this object and applies 21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * all of the actions. 21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>Caller beware: this may throw</strong> 21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context Default context to use 21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parent Parent that the resulting view hierarchy will be attached to. This method 21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * does <strong>not</strong> attach the hierarchy. The caller should do so when appropriate. 21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The inflated view hierarchy 21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View apply(Context context, ViewGroup parent) { 21191927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn return apply(this, context, parent); 21201927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn } 21211927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn 21221927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn View apply(RemoteViews owner, Context context, ViewGroup parent) { 21235d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen RemoteViews rvToApply = getRemoteViewsToApply(context); 21245d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 2125a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy View result; 21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context c = prepareContext(context); 21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2129a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy LayoutInflater inflater = (LayoutInflater) 2130a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inflater = inflater.cloneInContext(c); 21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inflater.setFilter(this); 21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21355d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen result = inflater.inflate(rvToApply.getLayoutId(), parent, false); 21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21371927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn rvToApply.performApply(owner, result, parent); 21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21415d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Applies all of the actions to the provided view. 21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>Caller beware: this may throw</strong> 21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param v The view to apply the actions to. This should be the result of 21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the {@link #apply(Context,ViewGroup)} call. 21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void reapply(Context context, View v) { 21515d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen RemoteViews rvToApply = getRemoteViewsToApply(context); 21525d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 21535d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // In the case that a view has this RemoteViews applied in one orientation, is persisted 21545d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // across orientation change, and has the RemoteViews re-applied in the new orientation, 21555d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // we throw an exception, since the layouts may be completely unrelated. 21565d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (hasLandscapeAndPortraitLayouts()) { 21575d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (v.getId() != rvToApply.getLayoutId()) { 21585d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen throw new RuntimeException("Attempting to re-apply RemoteViews to a view that" + 21595d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen " that does not share the same root layout id."); 21605d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 21615d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 21625d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project prepareContext(context); 21641927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn rvToApply.performApply(this, v, (ViewGroup) v.getParent()); 21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21671927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn private void performApply(RemoteViews owner, View v, ViewGroup parent) { 21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActions != null) { 21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mActions.size(); 21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Action a = mActions.get(i); 21721927ae8a56a010919a7535231fa0f7db70f7e152Dianne Hackborn a.apply(owner, v, parent); 21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context prepareContext(Context context) { 2178a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy Context c; 21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String packageName = mPackage; 21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (packageName != null) { 21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2183870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy c = context.createPackageContext(packageName, Context.CONTEXT_RESTRICTED); 21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (NameNotFoundException e) { 21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOG_TAG, "Package name " + packageName + " not found"); 21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c = context; 21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c = context; 21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return c; 21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* (non-Javadoc) 21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used to restrict the views which can be inflated 21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.view.LayoutInflater.Filter#onLoadClass(java.lang.Class) 21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2200e6ac8b9aade9443ab8456c8f7a47cdfba3b70266Gilles Debunne public boolean onLoadClass(Class clazz) { 22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return clazz.isAnnotationPresent(RemoteView.class); 22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22035d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen 22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 22095d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (!hasLandscapeAndPortraitLayouts()) { 22105d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeInt(MODE_NORMAL); 22115d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // We only write the bitmap cache if we are the root RemoteViews, as this cache 22125d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // is shared by all children. 22135d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (mIsRoot) { 22145d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmapCache.writeBitmapsToParcel(dest, flags); 22155d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 22165d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeString(mPackage); 22175d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeInt(mLayoutId); 22185d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeInt(mIsWidgetCollectionChild ? 1 : 0); 22195d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen int count; 22205d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (mActions != null) { 22215d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen count = mActions.size(); 22225d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } else { 22235d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen count = 0; 22245d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 22255d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeInt(count); 22265d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen for (int i=0; i<count; i++) { 22275d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen Action a = mActions.get(i); 22285d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen a.writeToParcel(dest, 0); 22295d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 22315d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen dest.writeInt(MODE_HAS_LANDSCAPE_AND_PORTRAIT); 22325d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // We only write the bitmap cache if we are the root RemoteViews, as this cache 22335d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen // is shared by all children. 22345d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen if (mIsRoot) { 22355d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mBitmapCache.writeBitmapsToParcel(dest, flags); 22365d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen } 22375d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mLandscape.writeToParcel(dest, flags); 22385d20064651b9947a4573c9a0eefec90f66eb1b59Adam Cohen mPortrait.writeToParcel(dest, flags); 22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parcelable.Creator that instantiates RemoteViews objects 22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<RemoteViews> CREATOR = new Parcelable.Creator<RemoteViews>() { 22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RemoteViews createFromParcel(Parcel parcel) { 22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RemoteViews(parcel); 22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RemoteViews[] newArray(int size) { 22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RemoteViews[size]; 22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2255