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
3540eee61e25fb887f5267686f8a0a7c5bd9f95769Scott Main * <a href="{@docRoot}guide/components/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
52742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    /* mObject is used by native code, do not remove or rename */
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mObject;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IInterface mOwner;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mDescriptor;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the ID of the process that sent you the current transaction
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that is being processed.  This pid can be used with higher-level
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * system services to determine its identity and check permissions.
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the current thread is not currently executing an incoming transaction,
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * then its own pid is returned.
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int getCallingPid();
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6774ee8652e02fc94901177214fc9370659732c921Dianne Hackborn     * Return the Linux uid assigned to the process that sent you the
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * current transaction that is being processed.  This uid can be used with
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * higher-level system services to determine its identity and check
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * permissions.  If the current thread is not currently executing an
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * incoming transaction, then its own uid is returned.
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int getCallingUid();
74742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
75742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    /**
7674ee8652e02fc94901177214fc9370659732c921Dianne Hackborn     * Return the UserHandle assigned to the process that sent you the
7774ee8652e02fc94901177214fc9370659732c921Dianne Hackborn     * current transaction that is being processed.  This is the user
7874ee8652e02fc94901177214fc9370659732c921Dianne Hackborn     * of the caller.  It is distinct from {@link #getCallingUid()} in that a
7974ee8652e02fc94901177214fc9370659732c921Dianne Hackborn     * particular user will have multiple distinct apps running under it each
8074ee8652e02fc94901177214fc9370659732c921Dianne Hackborn     * with their own uid.  If the current thread is not currently executing an
8174ee8652e02fc94901177214fc9370659732c921Dianne Hackborn     * incoming transaction, then its own UserHandle is returned.
8274ee8652e02fc94901177214fc9370659732c921Dianne Hackborn     */
8374ee8652e02fc94901177214fc9370659732c921Dianne Hackborn    public static final UserHandle getCallingUserHandle() {
8474ee8652e02fc94901177214fc9370659732c921Dianne Hackborn        return new UserHandle(UserHandle.getUserId(getCallingUid()));
8574ee8652e02fc94901177214fc9370659732c921Dianne Hackborn    }
8674ee8652e02fc94901177214fc9370659732c921Dianne Hackborn
8774ee8652e02fc94901177214fc9370659732c921Dianne Hackborn    /**
88a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick     * Reset the identity of the incoming IPC on the current thread.  This can
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be useful if, while handling an incoming call, you will be calling
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on interfaces of other objects that may be local to your process and
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * need to do permission checks on the calls coming into them (so they
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will check the permission of your own local process, and not whatever
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * process originally called you).
94a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick     *
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns an opaque token that can be used to restore the
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * original calling identity by passing it to
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #restoreCallingIdentity(long)}.
98a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick     *
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getCallingPid()
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getCallingUid()
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #restoreCallingIdentity(long)
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native long clearCallingIdentity();
104a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
106a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick     * Restore the identity of the incoming IPC on the current thread
107a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick     * back to a previously identity that was returned by {@link
108a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick     * #clearCallingIdentity}.
109a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick     *
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param token The opaque token that was previously returned by
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #clearCallingIdentity}.
112a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick     *
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #clearCallingIdentity
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void restoreCallingIdentity(long token);
116727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick
117727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick    /**
118727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * Sets the native thread-local StrictMode policy mask.
119727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     *
120727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * <p>The StrictMode settings are kept in two places: a Java-level
121727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * threadlocal for libcore/Dalvik, and a native threadlocal (set
122727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * here) for propagation via Binder calls.  This is a little
123727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * unfortunate, but necessary to break otherwise more unfortunate
124727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * dependencies either of Dalvik on Android, or Android
125727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * native-only code on Dalvik.
126727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     *
127727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * @see StrictMode
128727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * @hide
129727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     */
130727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick    public static final native void setThreadStrictModePolicy(int policyMask);
131727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick
132727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick    /**
133727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * Gets the current native thread-local StrictMode policy mask.
134727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     *
135727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * @see #setThreadStrictModePolicy
136727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * @hide
137727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     */
138727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick    public static final native int getThreadStrictModePolicy();
139727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Flush any Binder commands pending in the current thread to the kernel
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * driver.  This can be
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * useful to call before performing an operation that may block for a long
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * time, to ensure that any pending object references have been released
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in order to prevent the process from holding on to objects longer than
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it needs to.
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void flushPendingCommands();
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Add the calling thread to the IPC thread pool.  This function does
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not return until the current process is exiting.
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void joinThreadPool();
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default constructor initializes the object.
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Binder() {
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        init();
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (FIND_POTENTIAL_LEAKS) {
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Class<? extends Binder> klass = getClass();
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (klass.getModifiers() & Modifier.STATIC) == 0) {
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "The following Binder class should be static or leaks might occur: " +
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    klass.getCanonicalName());
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience method for associating a specific interface with the Binder.
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * After calling, queryLocalInterface() will be implemented for you
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to return the given owner IInterface when the corresponding
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * descriptor is requested.
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void attachInterface(IInterface owner, String descriptor) {
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOwner = owner;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDescriptor = descriptor;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation returns an empty interface name.
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getInterfaceDescriptor() {
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDescriptor;
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation always returns true -- if you got here,
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the object is alive.
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean pingBinder() {
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note that if you're calling on a local binder, this always returns true
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * because your process is alive if you're calling it.
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isBinderAlive() {
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use information supplied to attachInterface() to return the
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * associated IInterface if it matches the requested
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * descriptor.
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public IInterface queryLocalInterface(String descriptor) {
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDescriptor.equals(descriptor)) {
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mOwner;
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation is a stub that returns false.  You will want
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to override this to do the appropriate unmarshalling of transactions.
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If you want to call this, call transact().
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean onTransact(int code, Parcel data, Parcel reply,
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) throws RemoteException {
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (code == INTERFACE_TRANSACTION) {
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply.writeString(getInterfaceDescriptor());
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (code == DUMP_TRANSACTION) {
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ParcelFileDescriptor fd = data.readFileDescriptor();
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] args = data.readStringArray();
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (fd != null) {
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    dump(fd.getFileDescriptor(), args);
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } finally {
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        fd.close();
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (IOException e) {
241eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick                        // swallowed, not propagated back to the caller
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
245eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick            // Write the StrictMode header.
246eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick            if (reply != null) {
247eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick                reply.writeNoException();
248eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick            } else {
249eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick                StrictMode.clearGatheredViolations();
250eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick            }
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Implemented to call the more convenient version
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #dump(FileDescriptor, PrintWriter, String[])}.
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dump(FileDescriptor fd, String[] args) {
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileOutputStream fout = new FileOutputStream(fd);
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PrintWriter pw = new PrintWriter(fout);
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dump(fd, pw, args);
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.flush();
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
271e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn     * Like {@link #dump(FileDescriptor, String[])}, but ensures the target
272e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn     * executes asynchronously.
273e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn     */
274e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn    public void dumpAsync(final FileDescriptor fd, final String[] args) {
275e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn        final FileOutputStream fout = new FileOutputStream(fd);
276e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn        final PrintWriter pw = new PrintWriter(fout);
277e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn        Thread thr = new Thread("Binder.dumpAsync") {
278e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn            public void run() {
279e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn                try {
280e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn                    dump(fd, pw, args);
281e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn                } finally {
282e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn                    pw.flush();
283e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn                }
284e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn            }
285e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn        };
286e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn        thr.start();
287e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn    }
288e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn
289e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn    /**
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Print the object's state into the given stream.
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fd The raw file descriptor that the dump is being sent to.
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fout The file to which you should dump your state.  This will be
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * closed for you after you return.
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param args additional arguments to the dump request.
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) {
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation rewinds the parcels and calls onTransact.  On
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the remote side, transact calls into the binder to do the IPC.
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean transact(int code, Parcel data, Parcel reply,
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) throws RemoteException {
30643a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato        if (false) Log.v("Binder", "Transact: " + code + " to " + this);
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (data != null) {
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.setDataPosition(0);
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean r = onTransact(code, data, reply, flags);
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (reply != null) {
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply.setDataPosition(0);
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return r;
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Local implementation is a no-op.
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void linkToDeath(DeathRecipient recipient, int flags) {
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Local implementation is a no-op.
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean unlinkToDeath(DeathRecipient recipient, int flags) {
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() throws Throwable {
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            destroy();
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.finalize();
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native final void init();
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native final void destroy();
3405b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick
3415b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick    // Entry point from android_util_Binder.cpp's onTransact
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean execTransact(int code, int dataObj, int replyObj,
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data = Parcel.obtain(dataObj);
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel reply = Parcel.obtain(replyObj);
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // theoretically, we should call transact, which will call onTransact,
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // but all that does is rewind it, and we just got these from an IPC,
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // so we'll just call it directly.
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean res;
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            res = onTransact(code, data, reply, flags);
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
3537f97e65add29b3887755e998804b013168f773b1Jeff Sharkey            reply.setDataPosition(0);
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply.writeException(e);
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            res = true;
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
3577f97e65add29b3887755e998804b013168f773b1Jeff Sharkey            reply.setDataPosition(0);
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply.writeException(e);
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            res = true;
36019f22745aa0fa2344850bac3234460add9d94c4eMattias Petersson        } catch (OutOfMemoryError e) {
36119f22745aa0fa2344850bac3234460add9d94c4eMattias Petersson            RuntimeException re = new RuntimeException("Out of memory", e);
3627f97e65add29b3887755e998804b013168f773b1Jeff Sharkey            reply.setDataPosition(0);
36319f22745aa0fa2344850bac3234460add9d94c4eMattias Petersson            reply.writeException(re);
36419f22745aa0fa2344850bac3234460add9d94c4eMattias Petersson            res = true;
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        reply.recycle();
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.recycle();
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return res;
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfinal class BinderProxy implements IBinder {
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean pingBinder();
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean isBinderAlive();
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public IInterface queryLocalInterface(String descriptor) {
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native String getInterfaceDescriptor() throws RemoteException;
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean transact(int code, Parcel data, Parcel reply,
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) throws RemoteException;
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void linkToDeath(DeathRecipient recipient, int flags)
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws RemoteException;
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean unlinkToDeath(DeathRecipient recipient, int flags);
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dump(FileDescriptor fd, String[] args) throws RemoteException {
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data = Parcel.obtain();
389eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick        Parcel reply = Parcel.obtain();
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeFileDescriptor(fd);
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeStringArray(args);
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
393eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick            transact(DUMP_TRANSACTION, data, reply, 0);
394eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick            reply.readException();
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.recycle();
397eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick            reply.recycle();
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
401e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn    public void dumpAsync(FileDescriptor fd, String[] args) throws RemoteException {
402e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn        Parcel data = Parcel.obtain();
403e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn        Parcel reply = Parcel.obtain();
404e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn        data.writeFileDescriptor(fd);
405e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn        data.writeStringArray(args);
406e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn        try {
407e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn            transact(DUMP_TRANSACTION, data, reply, FLAG_ONEWAY);
408e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn            reply.readException();
409e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn        } finally {
410e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn            data.recycle();
411e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn            reply.recycle();
412e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn        }
413e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn    }
414e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    BinderProxy() {
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSelf = new WeakReference(this);
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() throws Throwable {
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            destroy();
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.finalize();
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native final void destroy();
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final void sendDeathNotice(DeathRecipient recipient) {
43143a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato        if (false) Log.v("JavaBinder", "sendDeathNotice to " + recipient);
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            recipient.binderDied();
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        catch (RuntimeException exc) {
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w("BinderNative", "Uncaught exception from death notification",
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    exc);
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final private WeakReference mSelf;
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mObject;
443bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate    private int mOrgue;
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
445