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 com.android.server.am;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19fc46e9b643881b7b2ab76854f3a0ac077e9def8dSudheer Shankaimport android.app.ContentProviderHolder;
20b7bb3b3df6cb3743ee43b71455d9525762e55b45Dianne Hackbornimport android.content.ComponentName;
216ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackbornimport android.content.IContentProvider;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ApplicationInfo;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ProviderInfo;
2425872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganovimport android.os.IBinder;
2525872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganovimport android.os.IBinder.DeathRecipient;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
2725872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganovimport android.os.RemoteException;
28b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackbornimport android.os.UserHandle;
2925872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganovimport android.util.Slog;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
326ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackbornimport java.util.ArrayList;
3325872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganovimport java.util.HashMap;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
350b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onukifinal class ContentProviderRecord implements ComponentName.WithComponentName {
366ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn    final ActivityManagerService service;
376ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn    public final ProviderInfo info;
386ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn    final int uid;
396ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn    final ApplicationInfo appInfo;
406ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn    final ComponentName name;
417d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    final boolean singleton;
426ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn    public IContentProvider provider;
436ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn    public boolean noReleaseNeeded;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // All attached clients
456ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn    final ArrayList<ContentProviderConnection> connections
466ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            = new ArrayList<ContentProviderConnection>();
476ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn    //final HashSet<ProcessRecord> clients = new HashSet<ProcessRecord>();
4825872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov    // Handles for non-framework processes supported by this provider
4925872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov    HashMap<IBinder, ExternalProcessHandle> externalProcessTokenToHandle;
5025872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov    // Count for external process for which we have no handles.
5125872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov    int externalProcessNoHandleCount;
522a6bcda03b7811cbe181ac789e16e779cbedc330Dianne Hackborn    ProcessRecord proc; // if non-null, hosting process.
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ProcessRecord launchingApp; // if non-null, waiting for this app to be launched.
54f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn    String stringName;
556ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn    String shortStringName;
5625872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov
5725872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov    public ContentProviderRecord(ActivityManagerService _service, ProviderInfo _info,
587d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            ApplicationInfo ai, ComponentName _name, boolean _singleton) {
5925872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov        service = _service;
606ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        info = _info;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uid = ai.uid;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        appInfo = ai;
632a6bcda03b7811cbe181ac789e16e779cbedc330Dianne Hackborn        name = _name;
647d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        singleton = _singleton;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        noReleaseNeeded = uid == 0 || uid == Process.SYSTEM_UID;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ContentProviderRecord(ContentProviderRecord cpr) {
696ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        service = cpr.service;
706ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        info = cpr.info;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uid = cpr.uid;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        appInfo = cpr.appInfo;
73b7bb3b3df6cb3743ee43b71455d9525762e55b45Dianne Hackborn        name = cpr.name;
747d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        singleton = cpr.singleton;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        noReleaseNeeded = cpr.noReleaseNeeded;
766ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn    }
776ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn
786ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn    public ContentProviderHolder newHolder(ContentProviderConnection conn) {
796ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        ContentProviderHolder holder = new ContentProviderHolder(info);
806ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        holder.provider = provider;
816ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        holder.noReleaseNeeded = noReleaseNeeded;
826ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        holder.connection = conn;
836ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        return holder;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean canRunHere(ProcessRecord app) {
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (info.multiprocess || info.processName.equals(app.processName))
8811941fd651be468c8ab6c90256616418ecf3a6a8Dianne Hackborn                && uid == app.info.uid;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9125872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov    public void addExternalProcessHandleLocked(IBinder token) {
9225872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov        if (token == null) {
9325872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov            externalProcessNoHandleCount++;
9425872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov        } else {
9525872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov            if (externalProcessTokenToHandle == null) {
9625872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov                externalProcessTokenToHandle = new HashMap<IBinder, ExternalProcessHandle>();
9725872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov            }
9825872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov            ExternalProcessHandle handle = externalProcessTokenToHandle.get(token);
9925872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov            if (handle == null) {
10025872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov                handle = new ExternalProcessHandle(token);
10125872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov                externalProcessTokenToHandle.put(token, handle);
10225872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov            }
10325872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov            handle.mAcquisitionCount++;
10425872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov        }
10525872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov    }
10625872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov
10725872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov    public boolean removeExternalProcessHandleLocked(IBinder token) {
10825872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov        if (hasExternalProcessHandles()) {
10925872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov            boolean hasHandle = false;
11025872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov            if (externalProcessTokenToHandle != null) {
11125872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov                ExternalProcessHandle handle = externalProcessTokenToHandle.get(token);
11225872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov                if (handle != null) {
11325872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov                    hasHandle = true;
11425872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov                    handle.mAcquisitionCount--;
11525872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov                    if (handle.mAcquisitionCount == 0) {
11625872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov                        removeExternalProcessHandleInternalLocked(token);
11725872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov                        return true;
11825872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov                    }
11925872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov                }
12025872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov            }
12125872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov            if (!hasHandle) {
12225872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov                externalProcessNoHandleCount--;
12325872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov                return true;
12425872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov            }
12525872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov        }
12625872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov        return false;
12725872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov    }
12825872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov
12925872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov    private void removeExternalProcessHandleInternalLocked(IBinder token) {
13025872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov        ExternalProcessHandle handle = externalProcessTokenToHandle.get(token);
13125872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov        handle.unlinkFromOwnDeathLocked();
13225872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov        externalProcessTokenToHandle.remove(token);
13325872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov        if (externalProcessTokenToHandle.size() == 0) {
13425872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov            externalProcessTokenToHandle = null;
13525872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov        }
13625872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov    }
13725872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov
13825872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov    public boolean hasExternalProcessHandles() {
13925872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov        return (externalProcessTokenToHandle != null || externalProcessNoHandleCount > 0);
14025872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov    }
14125872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov
142691a1737a34bb3afe6f8405b5fb26f31aaa5b4b2riddle_hsu    public boolean hasConnectionOrHandle() {
143691a1737a34bb3afe6f8405b5fb26f31aaa5b4b2riddle_hsu        return !connections.isEmpty() || hasExternalProcessHandles();
144691a1737a34bb3afe6f8405b5fb26f31aaa5b4b2riddle_hsu    }
145691a1737a34bb3afe6f8405b5fb26f31aaa5b4b2riddle_hsu
1466ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn    void dump(PrintWriter pw, String prefix, boolean full) {
1476ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        if (full) {
1486ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            pw.print(prefix); pw.print("package=");
1496ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn                    pw.print(info.applicationInfo.packageName);
1506ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn                    pw.print(" process="); pw.println(info.processName);
1516ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        }
1522a6bcda03b7811cbe181ac789e16e779cbedc330Dianne Hackborn        pw.print(prefix); pw.print("proc="); pw.println(proc);
1531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        if (launchingApp != null) {
1541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pw.print(prefix); pw.print("launchingApp="); pw.println(launchingApp);
1551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
1566ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        if (full) {
1576ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            pw.print(prefix); pw.print("uid="); pw.print(uid);
1586ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn                    pw.print(" provider="); pw.println(provider);
1591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
1607d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        if (singleton) {
1617d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            pw.print(prefix); pw.print("singleton="); pw.println(singleton);
1627d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        }
1636ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        pw.print(prefix); pw.print("authority="); pw.println(info.authority);
1646ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        if (full) {
1656ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            if (info.isSyncable || info.multiprocess || info.initOrder != 0) {
1666ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn                pw.print(prefix); pw.print("isSyncable="); pw.print(info.isSyncable);
1676ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn                        pw.print(" multiprocess="); pw.print(info.multiprocess);
1686ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn                        pw.print(" initOrder="); pw.println(info.initOrder);
1696ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            }
170d8c98fee02b5498270344727d1289004d98c0e73Dianne Hackborn        }
1716ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        if (full) {
1726ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            if (hasExternalProcessHandles()) {
1733133c401cd34e3c75b25320b50566c93494310a7Dianne Hackborn                pw.print(prefix); pw.print("externals:");
1743133c401cd34e3c75b25320b50566c93494310a7Dianne Hackborn                if (externalProcessTokenToHandle != null) {
1753133c401cd34e3c75b25320b50566c93494310a7Dianne Hackborn                    pw.print(" w/token=");
1763133c401cd34e3c75b25320b50566c93494310a7Dianne Hackborn                    pw.print(externalProcessTokenToHandle.size());
1773133c401cd34e3c75b25320b50566c93494310a7Dianne Hackborn                }
1783133c401cd34e3c75b25320b50566c93494310a7Dianne Hackborn                if (externalProcessNoHandleCount > 0) {
1793133c401cd34e3c75b25320b50566c93494310a7Dianne Hackborn                    pw.print(" notoken=");
1803133c401cd34e3c75b25320b50566c93494310a7Dianne Hackborn                    pw.print(externalProcessNoHandleCount);
1813133c401cd34e3c75b25320b50566c93494310a7Dianne Hackborn                }
1823133c401cd34e3c75b25320b50566c93494310a7Dianne Hackborn                pw.println();
1836ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            }
1846ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        } else {
1856ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            if (connections.size() > 0 || externalProcessNoHandleCount > 0) {
1866ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn                pw.print(prefix); pw.print(connections.size());
1876ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn                        pw.print(" connections, "); pw.print(externalProcessNoHandleCount);
1886ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn                        pw.println(" external handles");
1896ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            }
1906ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        }
1916ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        if (connections.size() > 0) {
1926ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            if (full) {
1936ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn                pw.print(prefix); pw.println("Connections:");
1946ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            }
1956ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            for (int i=0; i<connections.size(); i++) {
1966ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn                ContentProviderConnection conn = connections.get(i);
1976ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn                pw.print(prefix); pw.print("  -> "); pw.println(conn.toClientString());
1986ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn                if (conn.provider != this) {
1996ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn                    pw.print(prefix); pw.print("    *** WRONG PROVIDER: ");
2006ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn                            pw.println(conn.provider);
2016ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn                }
2028ec8d41aa691f901a58d28b89b1395f56bf1d1c3Dianne Hackborn            }
2031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn        }
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20625872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov    @Override
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
208f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn        if (stringName != null) {
209f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn            return stringName;
210f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn        }
211f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn        StringBuilder sb = new StringBuilder(128);
212f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn        sb.append("ContentProviderRecord{");
213f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn        sb.append(Integer.toHexString(System.identityHashCode(this)));
214b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn        sb.append(" u");
215b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn        sb.append(UserHandle.getUserId(uid));
216f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn        sb.append(' ');
2179da2d403344d7e8b67c966db4f064c4c7a2f5901Dianne Hackborn        sb.append(name.flattenToShortString());
218f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn        sb.append('}');
219f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn        return stringName = sb.toString();
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22125872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov
2226ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn    public String toShortString() {
2236ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        if (shortStringName != null) {
2246ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            return shortStringName;
2256ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        }
2266ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        StringBuilder sb = new StringBuilder(128);
2276ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        sb.append(Integer.toHexString(System.identityHashCode(this)));
2286ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        sb.append('/');
2296ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        sb.append(name.flattenToShortString());
2306ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        return shortStringName = sb.toString();
2316ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn    }
2326ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn
23325872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov    // This class represents a handle from an external process to a provider.
23425872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov    private class ExternalProcessHandle implements DeathRecipient {
23525872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov        private static final String LOG_TAG = "ExternalProcessHanldle";
23625872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov
23725872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov        private final IBinder mToken;
23825872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov        private int mAcquisitionCount;
23925872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov
24025872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov        public ExternalProcessHandle(IBinder token) {
24125872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov            mToken = token;
24225872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov            try {
24325872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov                token.linkToDeath(this, 0);
24425872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov            } catch (RemoteException re) {
24525872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov                Slog.e(LOG_TAG, "Couldn't register for death for token: " + mToken, re);
24625872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov            }
24725872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov        }
24825872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov
24925872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov        public void unlinkFromOwnDeathLocked() {
25025872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov            mToken.unlinkToDeath(this, 0);
25125872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov        }
25225872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov
25325872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov        @Override
25425872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov        public void binderDied() {
25525872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov            synchronized (service) {
25625872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov                if (hasExternalProcessHandles() &&
25725872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov                        externalProcessTokenToHandle.get(mToken) != null) {
25825872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov                    removeExternalProcessHandleInternalLocked(mToken);
25925872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov                }
26025872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov            }
26125872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov        }
26225872aa3ef189ae5506a923398af11ce5eb1a9b9Svetoslav Ganov    }
2630b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onuki
2640b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onuki    public ComponentName getComponentName() {
2650b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onuki        return name;
2660b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onuki    }
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
268