RemoteViews.java revision 1480fddea874a42adb43b4bcdac6704e4c3e110b
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 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.PendingIntent; 201480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohenimport android.appwidget.AppWidgetHostView; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 22fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackbornimport android.content.Intent; 23fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackbornimport android.content.IntentSender; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PorterDuff; 277597065d6b0877ffc460b443fdb1595965ccd7b2Joe Onoratoimport android.graphics.Rect; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 30d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringertimport android.os.Bundle; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.RemotableViewMethod; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater.Filter; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View.OnClickListener; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.annotation.ElementType; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.annotation.Retention; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.annotation.RetentionPolicy; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.annotation.Target; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.reflect.Method; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A class that describes a view hierarchy that can be displayed in 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * another process. The hierarchy is inflated from a layout resource 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * file, and this class provides some basic operations for modifying 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the content of the inflated hierarchy. 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class RemoteViews implements Parcelable, Filter { 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String LOG_TAG = "RemoteViews"; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The package name of the package containing the layout 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resource. (Added to the parcel) 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 643030193dc179b3010f2dd3bffe9c1dec54da38fcGilles Debunne private final String mPackage; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The resource ID of the layout file. (Added to the parcel) 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 693030193dc179b3010f2dd3bffe9c1dec54da38fcGilles Debunne private final int mLayoutId; 70a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An array of actions to perform on the view tree once it has been 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inflated 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ArrayList<Action> mActions; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This annotation indicates that a subclass of View is alllowed to be used 80a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy * with the {@link RemoteViews} mechanism. 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Target({ ElementType.TYPE }) 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Retention(RetentionPolicy.RUNTIME) 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public @interface RemoteView { 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Exception to send when something goes wrong executing an action 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class ActionException extends RuntimeException { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ActionException(Exception ex) { 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(ex); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ActionException(String message) { 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(message); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class for all actions that can be performed on an 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * inflated view. 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10418e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato * SUBCLASSES MUST BE IMMUTABLE SO CLONE WORKS!!!!! 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private abstract static class Action implements Parcelable { 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract void apply(View root) throws ActionException; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 112a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy } 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1141480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen private class SetEmptyView extends Action { 1151480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen int viewId; 1161480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen int emptyViewId; 1171480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 1181480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen public final static int TAG = 6; 1191480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 1201480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen SetEmptyView(int viewId, int emptyViewId) { 1211480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen this.viewId = viewId; 1221480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen this.emptyViewId = emptyViewId; 1231480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 1241480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 1251480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen SetEmptyView(Parcel in) { 1261480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen this.viewId = in.readInt(); 1271480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen this.emptyViewId = in.readInt(); 1281480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 1291480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 1301480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen public void writeToParcel(Parcel out, int flags) { 1311480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen out.writeInt(TAG); 1321480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen out.writeInt(this.viewId); 1331480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen out.writeInt(this.emptyViewId); 1341480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 1351480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 1361480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen @Override 1371480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen public void apply(View root) { 1381480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen final View view = root.findViewById(viewId); 1391480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen if (!(view instanceof AdapterView<?>)) return; 1401480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 1411480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen AdapterView<?> adapterView = (AdapterView<?>) view; 1421480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 1431480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen final View emptyView = root.findViewById(emptyViewId); 1441480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen if (emptyView == null) return; 1451480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 1461480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen adapterView.setEmptyView(emptyView); 1471480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 1481480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 1491480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.View#setOnClickListener(android.view.View.OnClickListener)} 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to launch the provided {@link PendingIntent}. 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class SetOnClickPendingIntent extends Action { 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SetOnClickPendingIntent(int id, PendingIntent pendingIntent) { 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.viewId = id; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.pendingIntent = pendingIntent; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SetOnClickPendingIntent(Parcel parcel) { 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project viewId = parcel.readInt(); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pendingIntent = PendingIntent.readPendingIntentOrNullFromParcel(parcel); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(TAG); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(viewId); 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pendingIntent.writeToParcel(dest, 0 /* no flags */); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void apply(View root) { 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View target = root.findViewById(viewId); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target != null && pendingIntent != null) { 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OnClickListener listener = new OnClickListener() { 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onClick(View v) { 178a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey // Find target view location in screen coordinates and 179a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey // fill into PendingIntent before sending. 180a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey final float appScale = v.getContext().getResources() 181a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey .getCompatibilityInfo().applicationScale; 182a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey final int[] pos = new int[2]; 1837597065d6b0877ffc460b443fdb1595965ccd7b2Joe Onorato v.getLocationOnScreen(pos); 184a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey 185a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey final Rect rect = new Rect(); 186a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey rect.left = (int) (pos[0] * appScale + 0.5f); 187a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey rect.top = (int) (pos[1] * appScale + 0.5f); 188a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey rect.right = (int) ((pos[0] + v.getWidth()) * appScale + 0.5f); 189a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey rect.bottom = (int) ((pos[1] + v.getHeight()) * appScale + 0.5f); 190a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey 191a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey final Intent intent = new Intent(); 192a503f6f7cf09c64bde708e3bcfb7103378ddfcffJeff Sharkey intent.setSourceBounds(rect); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: Unregister this handler if PendingIntent.FLAG_ONE_SHOT? 195fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn v.getContext().startIntentSender( 1967597065d6b0877ffc460b443fdb1595965ccd7b2Joe Onorato pendingIntent.getIntentSender(), intent, 197fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn Intent.FLAG_ACTIVITY_NEW_TASK, 198fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn Intent.FLAG_ACTIVITY_NEW_TASK, 0); 199fa82f22f1d8c4c828bdf9b670006be4f4fec772eDianne Hackborn } catch (IntentSender.SendIntentException e) { 200995d8561a6f6dee9f7b032bb2c3d78d885ba1e56Romain Guy android.util.Log.e(LOG_TAG, "Cannot send pending intent: ", e); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project target.setOnClickListener(listener); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int viewId; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PendingIntent pendingIntent; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static int TAG = 1; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling a combination of {@link Drawable#setAlpha(int)}, 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Drawable#setColorFilter(int, android.graphics.PorterDuff.Mode)}, 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and/or {@link Drawable#setLevel(int)} on the {@link Drawable} of a given view. 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These operations will be performed on the {@link Drawable} returned by the 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * target {@link View#getBackground()} by default. If targetBackground is false, 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * we assume the target is an {@link ImageView} and try applying the operations 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to {@link ImageView#getDrawable()}. 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You can omit specific calls by marking their values with null or -1. 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class SetDrawableParameters extends Action { 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SetDrawableParameters(int id, boolean targetBackground, int alpha, 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int colorFilter, PorterDuff.Mode mode, int level) { 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.viewId = id; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.targetBackground = targetBackground; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.alpha = alpha; 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.colorFilter = colorFilter; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.filterMode = mode; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.level = level; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SetDrawableParameters(Parcel parcel) { 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project viewId = parcel.readInt(); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetBackground = parcel.readInt() != 0; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project alpha = parcel.readInt(); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project colorFilter = parcel.readInt(); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasMode = parcel.readInt() != 0; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasMode) { 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filterMode = PorterDuff.Mode.valueOf(parcel.readString()); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filterMode = null; 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project level = parcel.readInt(); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(TAG); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(viewId); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(targetBackground ? 1 : 0); 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(alpha); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(colorFilter); 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (filterMode != null) { 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(1); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(filterMode.toString()); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(0); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(level); 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void apply(View root) { 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View target = root.findViewById(viewId); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == null) { 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Pick the correct drawable to modify for this view 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Drawable targetDrawable = null; 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (targetBackground) { 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetDrawable = target.getBackground(); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (target instanceof ImageView) { 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ImageView imageView = (ImageView) target; 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetDrawable = imageView.getDrawable(); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 282a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy if (targetDrawable != null) { 283a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy // Perform modifications only if values are set correctly 284a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy if (alpha != -1) { 285a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy targetDrawable.setAlpha(alpha); 286a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy } 287a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy if (colorFilter != -1 && filterMode != null) { 288a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy targetDrawable.setColorFilter(colorFilter, filterMode); 289a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy } 290a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy if (level != -1) { 291a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy targetDrawable.setLevel(level); 292a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy } 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int viewId; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean targetBackground; 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int alpha; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int colorFilter; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PorterDuff.Mode filterMode; 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int level; 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static int TAG = 3; 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3062dd2197805edb4d9547b143deef2226413218f4cAdam Cohen private class ReflectionActionWithoutParams extends Action { 3072dd2197805edb4d9547b143deef2226413218f4cAdam Cohen int viewId; 3082dd2197805edb4d9547b143deef2226413218f4cAdam Cohen String methodName; 3092dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 3102dd2197805edb4d9547b143deef2226413218f4cAdam Cohen public final static int TAG = 5; 3112dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 3122dd2197805edb4d9547b143deef2226413218f4cAdam Cohen ReflectionActionWithoutParams(int viewId, String methodName) { 3132dd2197805edb4d9547b143deef2226413218f4cAdam Cohen this.viewId = viewId; 3142dd2197805edb4d9547b143deef2226413218f4cAdam Cohen this.methodName = methodName; 3152dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 3162dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 3172dd2197805edb4d9547b143deef2226413218f4cAdam Cohen ReflectionActionWithoutParams(Parcel in) { 3182dd2197805edb4d9547b143deef2226413218f4cAdam Cohen this.viewId = in.readInt(); 3192dd2197805edb4d9547b143deef2226413218f4cAdam Cohen this.methodName = in.readString(); 3202dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 3212dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 3222dd2197805edb4d9547b143deef2226413218f4cAdam Cohen public void writeToParcel(Parcel out, int flags) { 3232dd2197805edb4d9547b143deef2226413218f4cAdam Cohen out.writeInt(TAG); 3242dd2197805edb4d9547b143deef2226413218f4cAdam Cohen out.writeInt(this.viewId); 3252dd2197805edb4d9547b143deef2226413218f4cAdam Cohen out.writeString(this.methodName); 3262dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 3272dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 3282dd2197805edb4d9547b143deef2226413218f4cAdam Cohen @Override 3292dd2197805edb4d9547b143deef2226413218f4cAdam Cohen public void apply(View root) { 3302dd2197805edb4d9547b143deef2226413218f4cAdam Cohen final View view = root.findViewById(viewId); 3312dd2197805edb4d9547b143deef2226413218f4cAdam Cohen if (view == null) { 3322dd2197805edb4d9547b143deef2226413218f4cAdam Cohen throw new ActionException("can't find view: 0x" + Integer.toHexString(viewId)); 3332dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 3342dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 3352dd2197805edb4d9547b143deef2226413218f4cAdam Cohen Class klass = view.getClass(); 3362dd2197805edb4d9547b143deef2226413218f4cAdam Cohen Method method; 3372dd2197805edb4d9547b143deef2226413218f4cAdam Cohen try { 3382dd2197805edb4d9547b143deef2226413218f4cAdam Cohen method = klass.getMethod(this.methodName); 3392dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } catch (NoSuchMethodException ex) { 3402dd2197805edb4d9547b143deef2226413218f4cAdam Cohen throw new ActionException("view: " + klass.getName() + " doesn't have method: " 3412dd2197805edb4d9547b143deef2226413218f4cAdam Cohen + this.methodName + "()"); 3422dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 3432dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 3442dd2197805edb4d9547b143deef2226413218f4cAdam Cohen if (!method.isAnnotationPresent(RemotableViewMethod.class)) { 3452dd2197805edb4d9547b143deef2226413218f4cAdam Cohen throw new ActionException("view: " + klass.getName() 3462dd2197805edb4d9547b143deef2226413218f4cAdam Cohen + " can't use method with RemoteViews: " 3472dd2197805edb4d9547b143deef2226413218f4cAdam Cohen + this.methodName + "()"); 3482dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 3492dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 3502dd2197805edb4d9547b143deef2226413218f4cAdam Cohen try { 3512dd2197805edb4d9547b143deef2226413218f4cAdam Cohen //noinspection ConstantIfStatement 3522dd2197805edb4d9547b143deef2226413218f4cAdam Cohen if (false) { 3532dd2197805edb4d9547b143deef2226413218f4cAdam Cohen Log.d("RemoteViews", "view: " + klass.getName() + " calling method: " 3542dd2197805edb4d9547b143deef2226413218f4cAdam Cohen + this.methodName + "()"); 3552dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 3562dd2197805edb4d9547b143deef2226413218f4cAdam Cohen method.invoke(view); 3572dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } catch (Exception ex) { 3582dd2197805edb4d9547b143deef2226413218f4cAdam Cohen throw new ActionException(ex); 3592dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 3602dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 3612dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 3622dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class for the reflection actions. 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class ReflectionAction extends Action { 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int TAG = 2; 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int BOOLEAN = 1; 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int BYTE = 2; 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int SHORT = 3; 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int INT = 4; 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int LONG = 5; 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int FLOAT = 6; 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int DOUBLE = 7; 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int CHAR = 8; 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int STRING = 9; 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int CHAR_SEQUENCE = 10; 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int URI = 11; 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int BITMAP = 12; 381d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert static final int BUNDLE = 13; 382499cb9f516062b654952d282f211bee44c31a3c2Winson Chung static final int INTENT = 14; 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int viewId; 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String methodName; 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object value; 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ReflectionAction(int viewId, String methodName, int type, Object value) { 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.viewId = viewId; 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.methodName = methodName; 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.type = type; 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = value; 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ReflectionAction(Parcel in) { 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.viewId = in.readInt(); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.methodName = in.readString(); 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.type = in.readInt(); 400a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy //noinspection ConstantIfStatement 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d("RemoteViews", "read viewId=0x" + Integer.toHexString(this.viewId) 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " methodName=" + this.methodName + " type=" + this.type); 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (this.type) { 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BOOLEAN: 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readInt() != 0; 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BYTE: 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readByte(); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SHORT: 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = (short)in.readInt(); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INT: 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readInt(); 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LONG: 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readLong(); 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FLOAT: 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readFloat(); 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DOUBLE: 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readDouble(); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR: 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = (char)in.readInt(); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STRING: 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = in.readString(); 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR_SEQUENCE: 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case URI: 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = Uri.CREATOR.createFromParcel(in); 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BITMAP: 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.value = Bitmap.CREATOR.createFromParcel(in); 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 442d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert case BUNDLE: 443d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert this.value = in.readBundle(); 444d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert break; 445499cb9f516062b654952d282f211bee44c31a3c2Winson Chung case INTENT: 446499cb9f516062b654952d282f211bee44c31a3c2Winson Chung this.value = Intent.CREATOR.createFromParcel(in); 447499cb9f516062b654952d282f211bee44c31a3c2Winson Chung break; 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, int flags) { 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(TAG); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(this.viewId); 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(this.methodName); 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(this.type); 458a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy //noinspection ConstantIfStatement 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d("RemoteViews", "write viewId=0x" + Integer.toHexString(this.viewId) 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " methodName=" + this.methodName + " type=" + this.type); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (this.type) { 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BOOLEAN: 465a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeInt((Boolean) this.value ? 1 : 0); 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BYTE: 468a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeByte((Byte) this.value); 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SHORT: 471a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeInt((Short) this.value); 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INT: 474a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeInt((Integer) this.value); 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LONG: 477a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeLong((Long) this.value); 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FLOAT: 480a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeFloat((Float) this.value); 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DOUBLE: 483a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy out.writeDouble((Double) this.value); 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR: 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt((int)((Character)this.value).charValue()); 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STRING: 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString((String)this.value); 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR_SEQUENCE: 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextUtils.writeToParcel((CharSequence)this.value, out, flags); 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case URI: 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((Uri)this.value).writeToParcel(out, flags); 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BITMAP: 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((Bitmap)this.value).writeToParcel(out, flags); 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 500d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert case BUNDLE: 501d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert out.writeBundle((Bundle) this.value); 502d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert break; 503499cb9f516062b654952d282f211bee44c31a3c2Winson Chung case INTENT: 504499cb9f516062b654952d282f211bee44c31a3c2Winson Chung ((Intent)this.value).writeToParcel(out, flags); 505499cb9f516062b654952d282f211bee44c31a3c2Winson Chung break; 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Class getParameterType() { 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (this.type) { 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BOOLEAN: 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return boolean.class; 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BYTE: 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return byte.class; 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SHORT: 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return short.class; 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INT: 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return int.class; 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LONG: 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return long.class; 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FLOAT: 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return float.class; 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DOUBLE: 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return double.class; 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR: 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return char.class; 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STRING: 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return String.class; 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHAR_SEQUENCE: 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return CharSequence.class; 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case URI: 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Uri.class; 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BITMAP: 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Bitmap.class; 537d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert case BUNDLE: 538d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert return Bundle.class; 539499cb9f516062b654952d282f211bee44c31a3c2Winson Chung case INTENT: 540499cb9f516062b654952d282f211bee44c31a3c2Winson Chung return Intent.class; 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void apply(View root) { 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View view = root.findViewById(viewId); 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (view == null) { 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ActionException("can't find view: 0x" + Integer.toHexString(viewId)); 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Class param = getParameterType(); 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (param == null) { 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ActionException("bad type: " + this.type); 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Class klass = view.getClass(); 559a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy Method method; 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method = klass.getMethod(this.methodName, getParameterType()); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (NoSuchMethodException ex) { 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ActionException("view: " + klass.getName() + " doesn't have method: " 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + this.methodName + "(" + param.getName() + ")"); 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!method.isAnnotationPresent(RemotableViewMethod.class)) { 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ActionException("view: " + klass.getName() 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " can't use method with RemoteViews: " 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + this.methodName + "(" + param.getName() + ")"); 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 575a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy //noinspection ConstantIfStatement 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d("RemoteViews", "view: " + klass.getName() + " calling method: " 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + this.methodName + "(" + param.getName() + ") with " 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (this.value == null ? "null" : this.value.getClass().getName())); 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project method.invoke(view, this.value); 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (Exception ex) { 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ActionException(ex); 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5891162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey /** 5901162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * Equivalent to calling {@link ViewGroup#addView(View)} after inflating the 5911162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * given {@link RemoteViews}, or calling {@link ViewGroup#removeAllViews()} 5921162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * when null. This allows users to build "nested" {@link RemoteViews}. 5931162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey */ 5941162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey private class ViewGroupAction extends Action { 5951162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public ViewGroupAction(int viewId, RemoteViews nestedViews) { 5961162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey this.viewId = viewId; 5971162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey this.nestedViews = nestedViews; 5981162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 5991162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 6001162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public ViewGroupAction(Parcel parcel) { 6011162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey viewId = parcel.readInt(); 6021162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey nestedViews = parcel.readParcelable(null); 6031162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 6041162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 6051162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public void writeToParcel(Parcel dest, int flags) { 6061162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey dest.writeInt(TAG); 6071162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey dest.writeInt(viewId); 6081162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey dest.writeParcelable(nestedViews, 0 /* no flags */); 6091162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 6101162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 6111162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey @Override 6121162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public void apply(View root) { 6131162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey final Context context = root.getContext(); 6141162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey final ViewGroup target = (ViewGroup) root.findViewById(viewId); 6151162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey if (nestedViews != null) { 6161162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey // Inflate nested views and add as children 6171162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey target.addView(nestedViews.apply(context, target)); 6181162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } else if (target != null) { 6191162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey // Clear all children when nested views omitted 6201162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey target.removeAllViews(); 6211162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 6221162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 6231162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 6241162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey int viewId; 6251162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey RemoteViews nestedViews; 6261162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 6271162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public final static int TAG = 4; 6281162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a new RemoteViews object that will display the views contained 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the specified layout file. 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param packageName Name of the package that contains the layout resource 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param layoutId The id of the layout resource 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RemoteViews(String packageName, int layoutId) { 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackage = packageName; 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutId = layoutId; 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reads a RemoteViews object from a parcel. 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parcel 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RemoteViews(Parcel parcel) { 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackage = parcel.readString(); 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutId = parcel.readInt(); 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = parcel.readInt(); 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (count > 0) { 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActions = new ArrayList<Action>(count); 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<count; i++) { 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int tag = parcel.readInt(); 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (tag) { 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SetOnClickPendingIntent.TAG: 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActions.add(new SetOnClickPendingIntent(parcel)); 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SetDrawableParameters.TAG: 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActions.add(new SetDrawableParameters(parcel)); 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ReflectionAction.TAG: 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActions.add(new ReflectionAction(parcel)); 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6651162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey case ViewGroupAction.TAG: 6661162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey mActions.add(new ViewGroupAction(parcel)); 6671162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey break; 6682dd2197805edb4d9547b143deef2226413218f4cAdam Cohen case ReflectionActionWithoutParams.TAG: 6692dd2197805edb4d9547b143deef2226413218f4cAdam Cohen mActions.add(new ReflectionActionWithoutParams(parcel)); 6702dd2197805edb4d9547b143deef2226413218f4cAdam Cohen break; 6711480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen case SetEmptyView.TAG: 6721480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen mActions.add(new SetEmptyView(parcel)); 6731480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen break; 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ActionException("Tag " + tag + " not found"); 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6813030193dc179b3010f2dd3bffe9c1dec54da38fcGilles Debunne @Override 68218e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato public RemoteViews clone() { 68318e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato final RemoteViews that = new RemoteViews(mPackage, mLayoutId); 68418e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato if (mActions != null) { 68518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato that.mActions = (ArrayList<Action>)mActions.clone(); 68618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato } 68718e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato return that; 68818e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato } 68918e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getPackage() { 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackage; 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getLayoutId() { 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLayoutId; 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add an action to be executed on the remote side when apply is called. 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param a The action to add 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void addAction(Action a) { 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActions == null) { 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActions = new ArrayList<Action>(); 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mActions.add(a); 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7091162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 7101162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey /** 7111162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * Equivalent to calling {@link ViewGroup#addView(View)} after inflating the 7121162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * given {@link RemoteViews}. This allows users to build "nested" 7131162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * {@link RemoteViews}. In cases where consumers of {@link RemoteViews} may 7141162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * recycle layouts, use {@link #removeAllViews(int)} to clear any existing 7151162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * children. 7161162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * 7171162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * @param viewId The id of the parent {@link ViewGroup} to add child into. 7181162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * @param nestedView {@link RemoteViews} that describes the child. 7191162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey */ 7201162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public void addView(int viewId, RemoteViews nestedView) { 7211162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey addAction(new ViewGroupAction(viewId, nestedView)); 7221162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 7231162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 7241162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey /** 7251162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * Equivalent to calling {@link ViewGroup#removeAllViews()}. 7261162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * 7271162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * @param viewId The id of the parent {@link ViewGroup} to remove all 7281162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey * children from. 7291162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey */ 7301162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey public void removeAllViews(int viewId) { 7311162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey addAction(new ViewGroupAction(viewId, null)); 7321162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey } 7331162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7352dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * Equivalent to calling {@link AdapterViewFlipper#showNext()} 7362dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * 7372dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * @param viewId The id of the view on which to call {@link AdapterViewFlipper#showNext()} 7382dd2197805edb4d9547b143deef2226413218f4cAdam Cohen */ 7392dd2197805edb4d9547b143deef2226413218f4cAdam Cohen public void showNext(int viewId) { 7402dd2197805edb4d9547b143deef2226413218f4cAdam Cohen addAction(new ReflectionActionWithoutParams(viewId, "showNext")); 7412dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 7422dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 7432dd2197805edb4d9547b143deef2226413218f4cAdam Cohen /** 7442dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * Equivalent to calling {@link AdapterViewFlipper#showPrevious()} 7452dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * 7462dd2197805edb4d9547b143deef2226413218f4cAdam Cohen * @param viewId The id of the view on which to call {@link AdapterViewFlipper#showPrevious()} 7472dd2197805edb4d9547b143deef2226413218f4cAdam Cohen */ 7482dd2197805edb4d9547b143deef2226413218f4cAdam Cohen public void showPrevious(int viewId) { 7492dd2197805edb4d9547b143deef2226413218f4cAdam Cohen addAction(new ReflectionActionWithoutParams(viewId, "showPrevious")); 7502dd2197805edb4d9547b143deef2226413218f4cAdam Cohen } 7512dd2197805edb4d9547b143deef2226413218f4cAdam Cohen 7522dd2197805edb4d9547b143deef2226413218f4cAdam Cohen /** 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling View.setVisibility 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose visibility should change 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param visibility The new visibility for the view 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setViewVisibility(int viewId, int visibility) { 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInt(viewId, "setVisibility", visibility); 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling TextView.setText 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose text should change 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param text The new text for the view 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTextViewText(int viewId, CharSequence text) { 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setCharSequence(viewId, "setText", text); 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling ImageView.setImageResource 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose drawable should change 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param srcId The new resource id for the drawable 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setImageViewResource(int viewId, int srcId) { 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInt(viewId, "setImageResource", srcId); 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling ImageView.setImageURI 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose drawable should change 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param uri The Uri for the image 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setImageViewUri(int viewId, Uri uri) { 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setUri(viewId, "setImageURI", uri); 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling ImageView.setImageBitmap 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose drawable should change 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bitmap The new Bitmap for the drawable 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setImageViewBitmap(int viewId, Bitmap bitmap) { 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBitmap(viewId, "setImageBitmap", bitmap); 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8031480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen * Equivalent to calling AdapterView.setEmptyView 8041480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen * 8051480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen * @param viewId The id of the view on which to set the empty view 8061480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen * @param emptyViewId The view id of the empty view 8071480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen */ 8081480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen public void setEmptyView(int viewId, int emptyViewId) { 8091480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen addAction(new SetEmptyView(viewId, emptyViewId)); 8101480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen } 8111480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen 8121480fddea874a42adb43b4bcdac6704e4c3e110bAdam Cohen /** 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling {@link Chronometer#setBase Chronometer.setBase}, 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Chronometer#setFormat Chronometer.setFormat}, 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and {@link Chronometer#start Chronometer.start()} or 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Chronometer#stop Chronometer.stop()}. 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose text should change 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param base The time at which the timer would have read 0:00. This 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * time should be based off of 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.os.SystemClock#elapsedRealtime SystemClock.elapsedRealtime()}. 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param format The Chronometer format string, or null to 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * simply display the timer value. 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param started True if you want the clock to be started, false if not. 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setChronometer(int viewId, long base, String format, boolean started) { 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setLong(viewId, "setBase", base); 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setString(viewId, "setFormat", format); 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBoolean(viewId, "setStarted", started); 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling {@link ProgressBar#setMax ProgressBar.setMax}, 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ProgressBar#setProgress ProgressBar.setProgress}, and 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ProgressBar#setIndeterminate ProgressBar.setIndeterminate} 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If indeterminate is true, then the values for max and progress are ignored. 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose text should change 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param max The 100% value for the progress bar 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param progress The current value of the progress bar. 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param indeterminate True if the progress bar is indeterminate, 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * false if not. 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setProgressBar(int viewId, int max, int progress, 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean indeterminate) { 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBoolean(viewId, "setIndeterminate", indeterminate); 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!indeterminate) { 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInt(viewId, "setMax", max); 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInt(viewId, "setProgress", progress); 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.View#setOnClickListener(android.view.View.OnClickListener)} 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to launch the provided {@link PendingIntent}. 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view that will trigger the {@link PendingIntent} when clicked 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pendingIntent The {@link PendingIntent} to send when user clicks 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnClickPendingIntent(int viewId, PendingIntent pendingIntent) { 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new SetOnClickPendingIntent(viewId, pendingIntent)); 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling a combination of {@link Drawable#setAlpha(int)}, 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Drawable#setColorFilter(int, android.graphics.PorterDuff.Mode)}, 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and/or {@link Drawable#setLevel(int)} on the {@link Drawable} of a given 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * view. 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You can omit specific calls by marking their values with null or -1. 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view that contains the target 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Drawable} 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param targetBackground If true, apply these parameters to the 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Drawable} returned by 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.View#getBackground()}. Otherwise, assume 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the target view is an {@link ImageView} and apply them to 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ImageView#getDrawable()}. 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param alpha Specify an alpha value for the drawable, or -1 to leave 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unchanged. 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param colorFilter Specify a color for a 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.graphics.ColorFilter} for this drawable, or -1 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to leave unchanged. 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param mode Specify a PorterDuff mode for this drawable, or null to leave 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unchanged. 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param level Specify the level for the drawable, or -1 to leave 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unchanged. 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDrawableParameters(int viewId, boolean targetBackground, int alpha, 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int colorFilter, PorterDuff.Mode mode, int level) { 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new SetDrawableParameters(viewId, targetBackground, alpha, 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project colorFilter, mode, level)); 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Equivalent to calling {@link android.widget.TextView#setTextColor(int)}. 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param viewId The id of the view whose text should change 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param color Sets the text color for all the states (normal, selected, 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * focused) to be this color. 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setTextColor(int viewId, int color) { 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setInt(viewId, "setTextColor", color); 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 910499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * Equivalent to calling {@link android.widget.AbsListView#setRemoteViewsAdapter(Intent)}. 911499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * 912499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * @param viewId The id of the view whose text should change 913499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * @param intent The intent of the service which will be 914499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * providing data to the RemoteViewsAdapter 915499cb9f516062b654952d282f211bee44c31a3c2Winson Chung */ 916499cb9f516062b654952d282f211bee44c31a3c2Winson Chung public void setRemoteAdapter(int viewId, Intent intent) { 917499cb9f516062b654952d282f211bee44c31a3c2Winson Chung setIntent(viewId, "setRemoteViewsAdapter", intent); 918499cb9f516062b654952d282f211bee44c31a3c2Winson Chung } 919499cb9f516062b654952d282f211bee44c31a3c2Winson Chung 920499cb9f516062b654952d282f211bee44c31a3c2Winson Chung /** 921499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * Equivalent to calling {@link android.widget.AbsListView#smoothScrollToPosition(int, int)}. 922499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * 923499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * @param viewId The id of the view whose text should change 924499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * @param position Scroll to this adapter position 925499cb9f516062b654952d282f211bee44c31a3c2Winson Chung */ 926499cb9f516062b654952d282f211bee44c31a3c2Winson Chung public void setScrollPosition(int viewId, int position) { 927499cb9f516062b654952d282f211bee44c31a3c2Winson Chung setInt(viewId, "smoothScrollToPosition", position); 928499cb9f516062b654952d282f211bee44c31a3c2Winson Chung } 929499cb9f516062b654952d282f211bee44c31a3c2Winson Chung 930499cb9f516062b654952d282f211bee44c31a3c2Winson Chung /** 931499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * Equivalent to calling {@link android.widget.AbsListView#smoothScrollToPosition(int, int)}. 932499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * 933499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * @param viewId The id of the view whose text should change 93495362595ed4a42aec87b4d166092b30c8139d220Winson Chung * @param offset Scroll by this adapter position offset 935499cb9f516062b654952d282f211bee44c31a3c2Winson Chung */ 936499cb9f516062b654952d282f211bee44c31a3c2Winson Chung public void setRelativeScrollPosition(int viewId, int offset) { 937499cb9f516062b654952d282f211bee44c31a3c2Winson Chung setInt(viewId, "smoothScrollByOffset", offset); 938499cb9f516062b654952d282f211bee44c31a3c2Winson Chung } 939499cb9f516062b654952d282f211bee44c31a3c2Winson Chung 940499cb9f516062b654952d282f211bee44c31a3c2Winson Chung /** 941592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one boolean on a view in the layout for this RemoteViews. 942592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 943592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param viewId The id of the view whose text should change 944592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 945592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 946592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setBoolean(int viewId, String methodName, boolean value) { 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.BOOLEAN, value)); 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 951592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 952592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one byte on a view in the layout for this RemoteViews. 953592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 954592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param viewId The id of the view whose text should change 955592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 956592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 957592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setByte(int viewId, String methodName, byte value) { 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.BYTE, value)); 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 962592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 963592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one short on a view in the layout for this RemoteViews. 964592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 965592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param viewId The id of the view whose text should change 966592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 967592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 968592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setShort(int viewId, String methodName, short value) { 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.SHORT, value)); 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 973592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 974592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one int on a view in the layout for this RemoteViews. 975592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 976592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param viewId The id of the view whose text should change 977592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 978592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 979592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setInt(int viewId, String methodName, int value) { 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.INT, value)); 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 984592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 985592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one long on a view in the layout for this RemoteViews. 986592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 987592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param viewId The id of the view whose text should change 988592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 989592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 990592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setLong(int viewId, String methodName, long value) { 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.LONG, value)); 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 995592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 996592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one float on a view in the layout for this RemoteViews. 997592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 998592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param viewId The id of the view whose text should change 999592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1000592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1001592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFloat(int viewId, String methodName, float value) { 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.FLOAT, value)); 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1006592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1007592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one double on a view in the layout for this RemoteViews. 1008592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 1009592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param viewId The id of the view whose text should change 1010592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1011592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1012592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDouble(int viewId, String methodName, double value) { 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.DOUBLE, value)); 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1017592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1018592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one char on a view in the layout for this RemoteViews. 1019592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 1020592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param viewId The id of the view whose text should change 1021592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1022592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1023592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setChar(int viewId, String methodName, char value) { 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.CHAR, value)); 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1028592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1029592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one String on a view in the layout for this RemoteViews. 1030592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 1031592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param viewId The id of the view whose text should change 1032592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1033592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1034592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setString(int viewId, String methodName, String value) { 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.STRING, value)); 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1040592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one CharSequence on a view in the layout for this RemoteViews. 1041592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 1042592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param viewId The id of the view whose text should change 1043592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1044592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1045592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setCharSequence(int viewId, String methodName, CharSequence value) { 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.CHAR_SEQUENCE, value)); 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1050592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1051592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one Uri on a view in the layout for this RemoteViews. 1052592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 1053592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param viewId The id of the view whose text should change 1054592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1055592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1056592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setUri(int viewId, String methodName, Uri value) { 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.URI, value)); 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1061592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato /** 1062592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * Call a method taking one Bitmap on a view in the layout for this RemoteViews. 1063592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @more 1064592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * <p class="note">The bitmap will be flattened into the parcel if this object is 1065592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * sent across processes, so it may end up using a lot of memory, and may be fairly slow.</p> 1066592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * 1067592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param viewId The id of the view whose text should change 1068592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param methodName The name of the method to call. 1069592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato * @param value The value to pass to the method. 1070592d0650d5bfc673082c4e58ac8ba2dc3103c842Joe Onorato */ 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setBitmap(int viewId, String methodName, Bitmap value) { 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addAction(new ReflectionAction(viewId, methodName, ReflectionAction.BITMAP, value)); 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1076d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert * Call a method taking one Bundle on a view in the layout for this RemoteViews. 1077d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert * 1078d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert * @param viewId The id of the view whose text should change 1079d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert * @param methodName The name of the method to call. 1080d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert * @param value The value to pass to the method. 1081d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert */ 1082d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert public void setBundle(int viewId, String methodName, Bundle value) { 1083d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert addAction(new ReflectionAction(viewId, methodName, ReflectionAction.BUNDLE, value)); 1084d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert } 1085d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert 1086d755b06805dd3ed4dc6c08ff1750e28543901854Bjorn Bringert /** 1087499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * 1088499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * @param viewId 1089499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * @param methodName 1090499cb9f516062b654952d282f211bee44c31a3c2Winson Chung * @param value 1091499cb9f516062b654952d282f211bee44c31a3c2Winson Chung */ 1092499cb9f516062b654952d282f211bee44c31a3c2Winson Chung public void setIntent(int viewId, String methodName, Intent value) { 1093499cb9f516062b654952d282f211bee44c31a3c2Winson Chung addAction(new ReflectionAction(viewId, methodName, ReflectionAction.INTENT, value)); 1094499cb9f516062b654952d282f211bee44c31a3c2Winson Chung } 1095499cb9f516062b654952d282f211bee44c31a3c2Winson Chung 1096499cb9f516062b654952d282f211bee44c31a3c2Winson Chung /** 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Inflates the view hierarchy represented by this object and applies 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * all of the actions. 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>Caller beware: this may throw</strong> 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context Default context to use 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parent Parent that the resulting view hierarchy will be attached to. This method 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * does <strong>not</strong> attach the hierarchy. The caller should do so when appropriate. 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The inflated view hierarchy 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View apply(Context context, ViewGroup parent) { 1108a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy View result; 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context c = prepareContext(context); 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1112a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy LayoutInflater inflater = (LayoutInflater) 1113a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inflater = inflater.cloneInContext(c); 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inflater.setFilter(this); 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = inflater.inflate(mLayoutId, parent, false); 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performApply(result); 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Applies all of the actions to the provided view. 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><strong>Caller beware: this may throw</strong> 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param v The view to apply the actions to. This should be the result of 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the {@link #apply(Context,ViewGroup)} call. 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void reapply(Context context, View v) { 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project prepareContext(context); 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project performApply(v); 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void performApply(View v) { 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActions != null) { 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mActions.size(); 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Action a = mActions.get(i); 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.apply(v); 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context prepareContext(Context context) { 1149a54755962ca7725d1e2b6cacbbaece6f1cbf5af4Romain Guy Context c; 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String packageName = mPackage; 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (packageName != null) { 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1154870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy c = context.createPackageContext(packageName, Context.CONTEXT_RESTRICTED); 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (NameNotFoundException e) { 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(LOG_TAG, "Package name " + packageName + " not found"); 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c = context; 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c = context; 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return c; 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* (non-Javadoc) 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used to restrict the views which can be inflated 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.view.LayoutInflater.Filter#onLoadClass(java.lang.Class) 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1171e6ac8b9aade9443ab8456c8f7a47cdfba3b70266Gilles Debunne public boolean onLoadClass(Class clazz) { 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return clazz.isAnnotationPresent(RemoteView.class); 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel dest, int flags) { 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeString(mPackage); 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(mLayoutId); 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count; 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mActions != null) { 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count = mActions.size(); 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count = 0; 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeInt(count); 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<count; i++) { 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Action a = mActions.get(i); 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.writeToParcel(dest, 0); 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parcelable.Creator that instantiates RemoteViews objects 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<RemoteViews> CREATOR = new Parcelable.Creator<RemoteViews>() { 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RemoteViews createFromParcel(Parcel parcel) { 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RemoteViews(parcel); 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RemoteViews[] newArray(int size) { 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new RemoteViews[size]; 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1208