1742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani/*
2742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * Copyright (C) 2011 The Android Open Source Project
3742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani *
4742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * Licensed under the Apache License, Version 2.0 (the "License");
5742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * you may not use this file except in compliance with the License.
6742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * You may obtain a copy of the License at
7742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani *
8742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani *      http://www.apache.org/licenses/LICENSE-2.0
9742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani *
10742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * Unless required by applicable law or agreed to in writing, software
11742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * distributed under the License is distributed on an "AS IS" BASIS,
12742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * See the License for the specific language governing permissions and
14742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * limitations under the License.
15742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani */
16742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
17742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasanipackage com.android.server.am;
18742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
19742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.content.ComponentName;
200b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onukiimport android.content.ComponentName.WithComponentName;
21742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.os.Binder;
22de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissenimport android.os.RemoteException;
23f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle;
24742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.util.Slog;
25742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.util.SparseArray;
26cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport com.android.internal.os.TransferPipe;
270b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onukiimport com.android.internal.util.CollectionUtils;
280b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onukiimport com.android.internal.util.DumpUtils;
29742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
30de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissenimport java.io.FileDescriptor;
31de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissenimport java.io.IOException;
32742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport java.io.PrintWriter;
33de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissenimport java.util.ArrayList;
34fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotiusimport java.util.Arrays;
350b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onukiimport java.util.Collections;
360b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onukiimport java.util.Comparator;
37742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport java.util.HashMap;
38742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport java.util.Iterator;
39742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport java.util.Map;
40540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwaleimport java.util.Set;
410b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onukiimport java.util.function.Predicate;
42742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
43742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani/**
44742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * Keeps track of content providers by authority (name) and class. It separates the mapping by
45742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani * user and ones that are not user-specific (system providers).
46742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani */
47be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackbornpublic final class ProviderMap {
48742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
49742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    private static final String TAG = "ProviderMap";
50742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
51742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    private static final boolean DBG = false;
52742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
532d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn    private final ActivityManagerService mAm;
542d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn
557d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    private final HashMap<String, ContentProviderRecord> mSingletonByName
56742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            = new HashMap<String, ContentProviderRecord>();
577d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn    private final HashMap<ComponentName, ContentProviderRecord> mSingletonByClass
58742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            = new HashMap<ComponentName, ContentProviderRecord>();
59742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
60742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    private final SparseArray<HashMap<String, ContentProviderRecord>> mProvidersByNamePerUser
61742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            = new SparseArray<HashMap<String, ContentProviderRecord>>();
62742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    private final SparseArray<HashMap<ComponentName, ContentProviderRecord>> mProvidersByClassPerUser
63742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            = new SparseArray<HashMap<ComponentName, ContentProviderRecord>>();
64742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
652d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn    ProviderMap(ActivityManagerService am) {
662d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn        mAm = am;
672d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn    }
682d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn
69742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    ContentProviderRecord getProviderByName(String name) {
70742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        return getProviderByName(name, -1);
71742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    }
72742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
73742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    ContentProviderRecord getProviderByName(String name, int userId) {
74742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        if (DBG) {
75742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            Slog.i(TAG, "getProviderByName: " + name + " , callingUid = " + Binder.getCallingUid());
76742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        }
77742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        // Try to find it in the global list
787d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        ContentProviderRecord record = mSingletonByName.get(name);
79742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        if (record != null) {
80742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            return record;
81742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        }
82742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
83742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        // Check the current user's list
84742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        return getProvidersByName(userId).get(name);
85742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    }
86742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
87742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    ContentProviderRecord getProviderByClass(ComponentName name) {
88742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        return getProviderByClass(name, -1);
89742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    }
90742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
91742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    ContentProviderRecord getProviderByClass(ComponentName name, int userId) {
92742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        if (DBG) {
93742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            Slog.i(TAG, "getProviderByClass: " + name + ", callingUid = " + Binder.getCallingUid());
94742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        }
95742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        // Try to find it in the global list
967d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        ContentProviderRecord record = mSingletonByClass.get(name);
97742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        if (record != null) {
98742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            return record;
99742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        }
100742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
101742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        // Check the current user's list
102742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        return getProvidersByClass(userId).get(name);
103742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    }
104742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
105742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    void putProviderByName(String name, ContentProviderRecord record) {
106742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        if (DBG) {
107742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            Slog.i(TAG, "putProviderByName: " + name + " , callingUid = " + Binder.getCallingUid()
108742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                + ", record uid = " + record.appInfo.uid);
109742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        }
1107d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        if (record.singleton) {
1117d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            mSingletonByName.put(name, record);
112742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        } else {
113f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn            final int userId = UserHandle.getUserId(record.appInfo.uid);
114742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            getProvidersByName(userId).put(name, record);
115742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        }
116742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    }
117742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
118742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    void putProviderByClass(ComponentName name, ContentProviderRecord record) {
119742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        if (DBG) {
120742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            Slog.i(TAG, "putProviderByClass: " + name + " , callingUid = " + Binder.getCallingUid()
121742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                + ", record uid = " + record.appInfo.uid);
122742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        }
1237d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        if (record.singleton) {
1247d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            mSingletonByClass.put(name, record);
125742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        } else {
126f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn            final int userId = UserHandle.getUserId(record.appInfo.uid);
127742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            getProvidersByClass(userId).put(name, record);
128742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        }
129742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    }
130742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
1314120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn    void removeProviderByName(String name, int userId) {
1327d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        if (mSingletonByName.containsKey(name)) {
133742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            if (DBG)
134742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Slog.i(TAG, "Removing from globalByName name=" + name);
1357d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            mSingletonByName.remove(name);
136742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        } else {
1374120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn            if (userId < 0) throw new IllegalArgumentException("Bad user " + userId);
138742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            if (DBG)
139742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Slog.i(TAG,
1404120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn                        "Removing from providersByName name=" + name + " user=" + userId);
1414120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn            HashMap<String, ContentProviderRecord> map = getProvidersByName(userId);
1428809004bc5125d48a1bbfc292509514374cc4fceVairavan Srinivasan            // map returned by getProvidersByName wouldn't be null
1438809004bc5125d48a1bbfc292509514374cc4fceVairavan Srinivasan            map.remove(name);
1448809004bc5125d48a1bbfc292509514374cc4fceVairavan Srinivasan            if (map.size() == 0) {
1454120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn                mProvidersByNamePerUser.remove(userId);
1468809004bc5125d48a1bbfc292509514374cc4fceVairavan Srinivasan            }
147742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        }
148742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    }
149742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
1504120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn    void removeProviderByClass(ComponentName name, int userId) {
1517d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        if (mSingletonByClass.containsKey(name)) {
152742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            if (DBG)
153742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Slog.i(TAG, "Removing from globalByClass name=" + name);
1547d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            mSingletonByClass.remove(name);
155742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        } else {
1564120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn            if (userId < 0) throw new IllegalArgumentException("Bad user " + userId);
157742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            if (DBG)
158742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                Slog.i(TAG,
1594120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn                        "Removing from providersByClass name=" + name + " user=" + userId);
1604120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn            HashMap<ComponentName, ContentProviderRecord> map = getProvidersByClass(userId);
1618809004bc5125d48a1bbfc292509514374cc4fceVairavan Srinivasan            // map returned by getProvidersByClass wouldn't be null
1628809004bc5125d48a1bbfc292509514374cc4fceVairavan Srinivasan            map.remove(name);
1638809004bc5125d48a1bbfc292509514374cc4fceVairavan Srinivasan            if (map.size() == 0) {
1644120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn                mProvidersByClassPerUser.remove(userId);
1658809004bc5125d48a1bbfc292509514374cc4fceVairavan Srinivasan            }
166742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        }
167742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    }
168742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
1694120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn    private HashMap<String, ContentProviderRecord> getProvidersByName(int userId) {
1704120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn        if (userId < 0) throw new IllegalArgumentException("Bad user " + userId);
171742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        final HashMap<String, ContentProviderRecord> map = mProvidersByNamePerUser.get(userId);
172742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        if (map == null) {
173742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            HashMap<String, ContentProviderRecord> newMap = new HashMap<String, ContentProviderRecord>();
174742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            mProvidersByNamePerUser.put(userId, newMap);
175742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            return newMap;
176742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        } else {
177742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            return map;
178742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        }
179742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    }
180742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
1814120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn    HashMap<ComponentName, ContentProviderRecord> getProvidersByClass(int userId) {
1824120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn        if (userId < 0) throw new IllegalArgumentException("Bad user " + userId);
1834120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn        final HashMap<ComponentName, ContentProviderRecord> map
1844120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn                = mProvidersByClassPerUser.get(userId);
185742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        if (map == null) {
1864120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn            HashMap<ComponentName, ContentProviderRecord> newMap
1874120375d46091df8527bb701882e056fbb0e6b06Dianne Hackborn                    = new HashMap<ComponentName, ContentProviderRecord>();
188742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            mProvidersByClassPerUser.put(userId, newMap);
189742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            return newMap;
190742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        } else {
191742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            return map;
192742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        }
193742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    }
194742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
195540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale    private boolean collectPackageProvidersLocked(String packageName,
196540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale            Set<String> filterByClasses, boolean doit, boolean evenPersistent,
1975e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn            HashMap<ComponentName, ContentProviderRecord> providers,
1985e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn            ArrayList<ContentProviderRecord> result) {
1995e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn        boolean didSomething = false;
2005e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn        for (ContentProviderRecord provider : providers.values()) {
201540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale            final boolean sameComponent = packageName == null
202540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale                    || (provider.info.packageName.equals(packageName)
203540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale                        && (filterByClasses == null
204540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale                            || filterByClasses.contains(provider.name.getClassName())));
205540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale            if (sameComponent
2065e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn                    && (provider.proc == null || evenPersistent || !provider.proc.persistent)) {
2075e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn                if (!doit) {
2085e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn                    return true;
2095e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn                }
2105e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn                didSomething = true;
2115e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn                result.add(provider);
2125e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn            }
2135e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn        }
2145e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn        return didSomething;
2155e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn    }
2165e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn
217540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale    boolean collectPackageProvidersLocked(String packageName, Set<String> filterByClasses,
2185e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn            boolean doit, boolean evenPersistent, int userId,
2195e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn            ArrayList<ContentProviderRecord> result) {
2205ff8ba7ace9b748892a2406995fe3eca87f682d4riddle_hsu        boolean didSomething = false;
2217c69636c9a406265e1da368f3edfd8fb9651132cXiaohui Chen        if (userId == UserHandle.USER_ALL || userId == UserHandle.USER_SYSTEM) {
2225ff8ba7ace9b748892a2406995fe3eca87f682d4riddle_hsu            didSomething = collectPackageProvidersLocked(packageName, filterByClasses,
2235ff8ba7ace9b748892a2406995fe3eca87f682d4riddle_hsu                    doit, evenPersistent, mSingletonByClass, result);
2245ff8ba7ace9b748892a2406995fe3eca87f682d4riddle_hsu        }
2255e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn        if (!doit && didSomething) {
2265e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn            return true;
2275e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn        }
2285e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn        if (userId == UserHandle.USER_ALL) {
229540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale            for (int i = 0; i < mProvidersByClassPerUser.size(); i++) {
230540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale                if (collectPackageProvidersLocked(packageName, filterByClasses,
231540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale                        doit, evenPersistent, mProvidersByClassPerUser.valueAt(i), result)) {
2325e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn                    if (!doit) {
2335e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn                        return true;
2345e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn                    }
2355e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn                    didSomething = true;
2365e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn                }
2375e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn            }
2385e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn        } else {
2392d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn            HashMap<ComponentName, ContentProviderRecord> items
2402d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn                    = getProvidersByClass(userId);
2412d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn            if (items != null) {
242540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale                didSomething |= collectPackageProvidersLocked(packageName, filterByClasses,
243540e123b14ef71f0bfda325e11773c1c510fb8baWale Ogunwale                        doit, evenPersistent, items, result);
2442d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn            }
2455e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn        }
2465e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn        return didSomething;
2475e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn    }
2485e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn
249390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn    private boolean dumpProvidersByClassLocked(PrintWriter pw, boolean dumpAll, String dumpPackage,
250390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            String header, boolean needSep, HashMap<ComponentName, ContentProviderRecord> map) {
251742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        Iterator<Map.Entry<ComponentName, ContentProviderRecord>> it = map.entrySet().iterator();
252390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        boolean written = false;
253742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        while (it.hasNext()) {
254742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            Map.Entry<ComponentName, ContentProviderRecord> e = it.next();
255742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            ContentProviderRecord r = e.getValue();
256390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) {
257390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                continue;
258390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            }
259390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            if (needSep) {
260390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                pw.println("");
261390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                needSep = false;
262390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            }
263390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            if (header != null) {
264390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                pw.println(header);
265390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                header = null;
266390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            }
267390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            written = true;
2686ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            pw.print("  * ");
2696ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            pw.println(r);
2706ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            r.dump(pw, "    ", dumpAll);
271742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        }
272390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        return written;
273742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    }
274742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
275390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn    private boolean dumpProvidersByNameLocked(PrintWriter pw, String dumpPackage,
276390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            String header, boolean needSep, HashMap<String, ContentProviderRecord> map) {
277742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        Iterator<Map.Entry<String, ContentProviderRecord>> it = map.entrySet().iterator();
278390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        boolean written = false;
279742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        while (it.hasNext()) {
280742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            Map.Entry<String, ContentProviderRecord> e = it.next();
281742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            ContentProviderRecord r = e.getValue();
282390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) {
283390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                continue;
284390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            }
285390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            if (needSep) {
286390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                pw.println("");
287390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                needSep = false;
288390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            }
289390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            if (header != null) {
290390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                pw.println(header);
291390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                header = null;
292390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            }
293390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            written = true;
294742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            pw.print("  ");
295742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            pw.print(e.getKey());
296742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            pw.print(": ");
2976ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            pw.println(r.toShortString());
298742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        }
299390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        return written;
300742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    }
301742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
302390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn    boolean dumpProvidersLocked(PrintWriter pw, boolean dumpAll, String dumpPackage) {
303390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        boolean needSep = false;
304390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn
3057d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        if (mSingletonByClass.size() > 0) {
3067ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            needSep |= dumpProvidersByClassLocked(pw, dumpAll, dumpPackage,
307390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                    "  Published single-user content providers (by class):", needSep,
308390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                    mSingletonByClass);
309742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        }
310742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
3117d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn        for (int i = 0; i < mProvidersByClassPerUser.size(); i++) {
3127d19e0242faac8017033dabb872cdf1542fa184cDianne Hackborn            HashMap<ComponentName, ContentProviderRecord> map = mProvidersByClassPerUser.valueAt(i);
313390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            needSep |= dumpProvidersByClassLocked(pw, dumpAll, dumpPackage,
314390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                    "  Published user " + mProvidersByClassPerUser.keyAt(i)
315390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                            + " content providers (by class):", needSep, map);
316742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        }
317742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
318742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        if (dumpAll) {
319390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            needSep |= dumpProvidersByNameLocked(pw, dumpPackage,
320390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                    "  Single-user authority to provider mappings:", needSep, mSingletonByName);
321742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
322742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            for (int i = 0; i < mProvidersByNamePerUser.size(); i++) {
323390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                needSep |= dumpProvidersByNameLocked(pw, dumpPackage,
324390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                        "  User " + mProvidersByNamePerUser.keyAt(i)
325390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                                + " authority to provider mappings:", needSep,
326390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                        mProvidersByNamePerUser.valueAt(i));
327742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            }
328742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        }
329390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        return needSep;
330742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    }
331de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen
332fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius    private ArrayList<ContentProviderRecord> getProvidersForName(String name) {
3332d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn        ArrayList<ContentProviderRecord> allProviders = new ArrayList<ContentProviderRecord>();
3340b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onuki        final ArrayList<ContentProviderRecord> ret = new ArrayList<>();
3350b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onuki
3360b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onuki        final Predicate<ContentProviderRecord> filter = DumpUtils.filterRecord(name);
337de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen
3382d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn        synchronized (mAm) {
3392d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn            allProviders.addAll(mSingletonByClass.values());
3402d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn            for (int i=0; i<mProvidersByClassPerUser.size(); i++) {
3412d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn                allProviders.addAll(mProvidersByClassPerUser.valueAt(i).values());
342de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen            }
3432d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn
3440b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onuki            CollectionUtils.addIf(allProviders, ret, filter);
345de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen        }
3460b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onuki        // Sort by component name.
3470b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onuki        ret.sort(Comparator.comparing(WithComponentName::getComponentName));
3480b575a3cdfce8cd5394044c4c6a7092487ba93cbMakoto Onuki        return ret;
349fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius    }
350fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius
351fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius    protected boolean dumpProvider(FileDescriptor fd, PrintWriter pw, String name, String[] args,
352fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius            int opti, boolean dumpAll) {
353fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius        ArrayList<ContentProviderRecord> providers = getProvidersForName(name);
354de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen
355de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen        if (providers.size() <= 0) {
356de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen            return false;
357de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen        }
358de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen
359de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen        boolean needSep = false;
360de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen        for (int i=0; i<providers.size(); i++) {
361de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen            if (needSep) {
362de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen                pw.println();
363de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen            }
364de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen            needSep = true;
365de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen            dumpProvider("", fd, pw, providers.get(i), args, dumpAll);
366de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen        }
367de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen        return true;
368de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen    }
369de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen
370de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen    /**
3719d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song     * Before invoking IApplicationThread.dumpProvider(), print meta information to the print
3729d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song     * writer and handle passed flags.
373de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen     */
374de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen    private void dumpProvider(String prefix, FileDescriptor fd, PrintWriter pw,
375de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen            final ContentProviderRecord r, String[] args, boolean dumpAll) {
3769d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song        for (String s: args) {
3779d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song            if (!dumpAll && s.contains("--proto")) {
3789d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song                if (r.proc != null && r.proc.thread != null) {
3799d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song                    dumpToTransferPipe(null , fd, pw, r, args);
3809d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song                }
3819d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song                return;
3829d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song            }
3839d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song        }
384de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen        String innerPrefix = prefix + "  ";
3852d1b37819112274f538d1886c379ff337eb0d9edDianne Hackborn        synchronized (mAm) {
386de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen            pw.print(prefix); pw.print("PROVIDER ");
3879d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song            pw.print(r);
3889d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song            pw.print(" pid=");
3899d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song            if (r.proc != null) {
3909d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song                pw.println(r.proc.pid);
3919d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song            } else {
3929d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song                pw.println("(not running)");
3939d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song            }
394de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen            if (dumpAll) {
3956ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn                r.dump(pw, innerPrefix, true);
396de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen            }
397de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen        }
398de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen        if (r.proc != null && r.proc.thread != null) {
399de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen            pw.println("    Client:");
400de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen            pw.flush();
4019d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song            dumpToTransferPipe("      ", fd, pw, r, args);
4029d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song        }
4039d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song    }
4049d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song
4059d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song    /**
406fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius     * Similar to the dumpProvider, but only dumps the first matching provider.
407fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius     * The provider is responsible for dumping as proto.
408fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius     */
409fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius    protected boolean dumpProviderProto(FileDescriptor fd, PrintWriter pw, String name,
410fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius            String[] args) {
411fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius        //add back the --proto arg, which was stripped out by PriorityDump
412fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius        String[] newArgs = Arrays.copyOf(args, args.length + 1);
413fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius        newArgs[args.length] = "--proto";
414fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius
415fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius        ArrayList<ContentProviderRecord> providers = getProvidersForName(name);
416fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius
417fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius        if (providers.size() <= 0) {
418fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius            return false;
419fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius        }
420fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius
421fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius        // Only dump the first provider, since we are dumping in proto format
422fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius        for (int i = 0; i < providers.size(); i++) {
423fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius            final ContentProviderRecord r = providers.get(i);
424fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius            if (r.proc != null && r.proc.thread != null) {
425fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius                dumpToTransferPipe(null, fd, pw, r, newArgs);
426fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius                return true;
427fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius            }
428fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius        }
429fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius        return false;
430fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius    }
431fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius
432fd55a9405e3df7a4006712651adb8b33a4b449f3Steven Timotius    /**
4339d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song     * Invokes IApplicationThread.dumpProvider() on the thread of the specified provider without
4349d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song     * any meta string (e.g., provider info, indentation) written to the file descriptor.
4359d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song     */
4369d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song    private void dumpToTransferPipe(String prefix, FileDescriptor fd, PrintWriter pw,
4379d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song            final ContentProviderRecord r, String[] args) {
4389d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song        try {
4399d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song            TransferPipe tp = new TransferPipe();
440de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen            try {
4419d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song                r.proc.thread.dumpProvider(
4429d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song                    tp.getWriteFd(), r.provider.asBinder(), args);
4439d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song                tp.setBufferPrefix(prefix);
4449d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song                // Short timeout, since blocking here can
4459d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song                // deadlock with the application.
4469d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song                tp.go(fd, 2000);
4479d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song            } finally {
4489d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song                tp.kill();
449de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen            }
4509d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song        } catch (IOException ex) {
4519d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song            pw.println("      Failure while dumping the provider: " + ex);
4529d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song        } catch (RemoteException ex) {
4539d56bc1218759d1077b4a4014492381adc766d09Hyunyoung Song            pw.println("      Got a RemoteException while dumping the service");
454de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen        }
455de7408c94e09a34fe0779ee894c64b4315aec17cMarco Nelissen    }
456742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani}
457