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