19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 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.os; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.reflect.Modifier; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class for a remotable object, the core part of a lightweight 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * remote procedure call mechanism defined by {@link IBinder}. 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class is an implementation of IBinder that provides 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the standard support creating a local implementation of such an object. 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Most developers will not implement this class directly, instead using the 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="{@docRoot}guide/developing/tools/aidl.html">aidl</a> tool to describe the desired 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interface, having it generate the appropriate Binder subclass. You can, 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * however, derive directly from Binder to implement your own custom RPC 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * protocol or simply instantiate a raw Binder object directly to use as a 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * token that can be shared across processes. 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see IBinder 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Binder implements IBinder { 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set this flag to true to detect anonymous, local or member classes 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that extend this Binder class and that are not static. These kind 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of classes can potentially create leaks. 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean FIND_POTENTIAL_LEAKS = false; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "Binder"; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mObject; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private IInterface mOwner; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mDescriptor; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the ID of the process that sent you the current transaction 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that is being processed. This pid can be used with higher-level 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * system services to determine its identity and check permissions. 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If the current thread is not currently executing an incoming transaction, 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then its own pid is returned. 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final native int getCallingPid(); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the ID of the user assigned to the process that sent you the 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current transaction that is being processed. This uid can be used with 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * higher-level system services to determine its identity and check 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * permissions. If the current thread is not currently executing an 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * incoming transaction, then its own uid is returned. 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final native int getCallingUid(); 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 75a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick * Reset the identity of the incoming IPC on the current thread. This can 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be useful if, while handling an incoming call, you will be calling 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on interfaces of other objects that may be local to your process and 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * need to do permission checks on the calls coming into them (so they 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will check the permission of your own local process, and not whatever 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * process originally called you). 81a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick * 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns an opaque token that can be used to restore the 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * original calling identity by passing it to 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #restoreCallingIdentity(long)}. 85a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick * 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getCallingPid() 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getCallingUid() 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #restoreCallingIdentity(long) 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final native long clearCallingIdentity(); 91a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 93a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick * Restore the identity of the incoming IPC on the current thread 94a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick * back to a previously identity that was returned by {@link 95a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick * #clearCallingIdentity}. 96a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick * 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param token The opaque token that was previously returned by 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #clearCallingIdentity}. 99a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick * 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #clearCallingIdentity 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final native void restoreCallingIdentity(long token); 103727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 104727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick /** 105727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * Sets the native thread-local StrictMode policy mask. 106727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * 107727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * <p>The StrictMode settings are kept in two places: a Java-level 108727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * threadlocal for libcore/Dalvik, and a native threadlocal (set 109727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * here) for propagation via Binder calls. This is a little 110727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * unfortunate, but necessary to break otherwise more unfortunate 111727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * dependencies either of Dalvik on Android, or Android 112727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * native-only code on Dalvik. 113727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * 114727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * @see StrictMode 115727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * @hide 116727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick */ 117727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick public static final native void setThreadStrictModePolicy(int policyMask); 118727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 119727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick /** 120727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * Gets the current native thread-local StrictMode policy mask. 121727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * 122727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * @see #setThreadStrictModePolicy 123727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick * @hide 124727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick */ 125727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick public static final native int getThreadStrictModePolicy(); 126727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flush any Binder commands pending in the current thread to the kernel 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * driver. This can be 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * useful to call before performing an operation that may block for a long 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * time, to ensure that any pending object references have been released 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in order to prevent the process from holding on to objects longer than 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it needs to. 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final native void flushPendingCommands(); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add the calling thread to the IPC thread pool. This function does 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not return until the current process is exiting. 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final native void joinThreadPool(); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Default constructor initializes the object. 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Binder() { 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init(); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (FIND_POTENTIAL_LEAKS) { 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Class<? extends Binder> klass = getClass(); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) && 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (klass.getModifiers() & Modifier.STATIC) == 0) { 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "The following Binder class should be static or leaks might occur: " + 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project klass.getCanonicalName()); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Convenience method for associating a specific interface with the Binder. 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * After calling, queryLocalInterface() will be implemented for you 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to return the given owner IInterface when the corresponding 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * descriptor is requested. 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void attachInterface(IInterface owner, String descriptor) { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOwner = owner; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDescriptor = descriptor; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Default implementation returns an empty interface name. 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getInterfaceDescriptor() { 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mDescriptor; 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Default implementation always returns true -- if you got here, 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the object is alive. 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean pingBinder() { 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note that if you're calling on a local binder, this always returns true 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * because your process is alive if you're calling it. 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isBinderAlive() { 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Use information supplied to attachInterface() to return the 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * associated IInterface if it matches the requested 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * descriptor. 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public IInterface queryLocalInterface(String descriptor) { 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDescriptor.equals(descriptor)) { 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOwner; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Default implementation is a stub that returns false. You will want 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to override this to do the appropriate unmarshalling of transactions. 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>If you want to call this, call transact(). 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean onTransact(int code, Parcel data, Parcel reply, 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) throws RemoteException { 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code == INTERFACE_TRANSACTION) { 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.writeString(getInterfaceDescriptor()); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (code == DUMP_TRANSACTION) { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ParcelFileDescriptor fd = data.readFileDescriptor(); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] args = data.readStringArray(); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd != null) { 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dump(fd.getFileDescriptor(), args); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fd.close(); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 228eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick // swallowed, not propagated back to the caller 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 232eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick // Write the StrictMode header. 233eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick if (reply != null) { 234eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick reply.writeNoException(); 235eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick } else { 236eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick StrictMode.clearGatheredViolations(); 237eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick } 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Implemented to call the more convenient version 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #dump(FileDescriptor, PrintWriter, String[])}. 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dump(FileDescriptor fd, String[] args) { 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileOutputStream fout = new FileOutputStream(fd); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PrintWriter pw = new PrintWriter(fout); 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dump(fd, pw, args); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.flush(); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 258e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn * Like {@link #dump(FileDescriptor, String[])}, but ensures the target 259e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn * executes asynchronously. 260e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn */ 261e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn public void dumpAsync(final FileDescriptor fd, final String[] args) { 262e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn final FileOutputStream fout = new FileOutputStream(fd); 263e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn final PrintWriter pw = new PrintWriter(fout); 264e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn Thread thr = new Thread("Binder.dumpAsync") { 265e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn public void run() { 266e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn try { 267e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn dump(fd, pw, args); 268e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn } finally { 269e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn pw.flush(); 270e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn } 271e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn } 272e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn }; 273e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn thr.start(); 274e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn } 275e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn 276e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn /** 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Print the object's state into the given stream. 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fd The raw file descriptor that the dump is being sent to. 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fout The file to which you should dump your state. This will be 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * closed for you after you return. 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param args additional arguments to the dump request. 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) { 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Default implementation rewinds the parcels and calls onTransact. On 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the remote side, transact calls into the binder to do the IPC. 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean transact(int code, Parcel data, Parcel reply, 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) throws RemoteException { 29343a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato if (false) Log.v("Binder", "Transact: " + code + " to " + this); 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (data != null) { 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.setDataPosition(0); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean r = onTransact(code, data, reply, flags); 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (reply != null) { 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.setDataPosition(0); 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return r; 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Local implementation is a no-op. 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void linkToDeath(DeathRecipient recipient, int flags) { 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Local implementation is a no-op. 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean unlinkToDeath(DeathRecipient recipient, int flags) { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project destroy(); 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.finalize(); 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final void init(); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final void destroy(); 3275b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick 3285b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // Entry point from android_util_Binder.cpp's onTransact 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean execTransact(int code, int dataObj, int replyObj, 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) { 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data = Parcel.obtain(dataObj); 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel reply = Parcel.obtain(replyObj); 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // theoretically, we should call transact, which will call onTransact, 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // but all that does is rewind it, and we just got these from an IPC, 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // so we'll just call it directly. 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean res; 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = onTransact(code, data, reply, flags); 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.writeException(e); 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = true; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.writeException(e); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = true; 34519f22745aa0fa2344850bac3234460add9d94c4eMattias Petersson } catch (OutOfMemoryError e) { 34619f22745aa0fa2344850bac3234460add9d94c4eMattias Petersson RuntimeException re = new RuntimeException("Out of memory", e); 34719f22745aa0fa2344850bac3234460add9d94c4eMattias Petersson reply.writeException(re); 34819f22745aa0fa2344850bac3234460add9d94c4eMattias Petersson res = true; 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply.recycle(); 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.recycle(); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfinal class BinderProxy implements IBinder { 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean pingBinder(); 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean isBinderAlive(); 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public IInterface queryLocalInterface(String descriptor) { 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native String getInterfaceDescriptor() throws RemoteException; 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean transact(int code, Parcel data, Parcel reply, 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) throws RemoteException; 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void linkToDeath(DeathRecipient recipient, int flags) 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws RemoteException; 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native boolean unlinkToDeath(DeathRecipient recipient, int flags); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dump(FileDescriptor fd, String[] args) throws RemoteException { 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data = Parcel.obtain(); 373eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick Parcel reply = Parcel.obtain(); 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeFileDescriptor(fd); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeStringArray(args); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 377eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick transact(DUMP_TRANSACTION, data, reply, 0); 378eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick reply.readException(); 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.recycle(); 381eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick reply.recycle(); 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 385e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn public void dumpAsync(FileDescriptor fd, String[] args) throws RemoteException { 386e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn Parcel data = Parcel.obtain(); 387e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn Parcel reply = Parcel.obtain(); 388e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn data.writeFileDescriptor(fd); 389e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn data.writeStringArray(args); 390e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn try { 391e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn transact(DUMP_TRANSACTION, data, reply, FLAG_ONEWAY); 392e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn reply.readException(); 393e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn } finally { 394e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn data.recycle(); 395e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn reply.recycle(); 396e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn } 397e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn } 398e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BinderProxy() { 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSelf = new WeakReference(this); 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project destroy(); 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.finalize(); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native final void destroy(); 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final void sendDeathNotice(DeathRecipient recipient) { 41543a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato if (false) Log.v("JavaBinder", "sendDeathNotice to " + recipient); 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project recipient.binderDied(); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (RuntimeException exc) { 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("BinderNative", "Uncaught exception from death notification", 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project exc); 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final private WeakReference mSelf; 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mObject; 427bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate private int mOrgue; 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 429