RunningState.java revision 728ac35373028b79205a788c526ef4b495518ec1
1728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn/*
2728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * Copyright (C) 2010 The Android Open Source Project
3728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn *
4728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
5728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * you may not use this file except in compliance with the License.
6728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * You may obtain a copy of the License at
7728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn *
8728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
9728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn *
10728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * Unless required by applicable law or agreed to in writing, software
11728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
12728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * See the License for the specific language governing permissions and
14728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * limitations under the License.
15728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn */
16728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
17728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornpackage com.android.settings.applications;
18728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
19728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport com.android.settings.R;
20728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
21728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.app.ActivityManager;
22728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.app.ActivityManagerNative;
23728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.ComponentName;
24728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.Context;
25728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.ApplicationInfo;
26728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.PackageInfo;
27728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.PackageItemInfo;
28728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.PackageManager;
29728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.ServiceInfo;
30728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.res.Resources;
31728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.os.Debug;
32728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.os.RemoteException;
33728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.text.format.Formatter;
34728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.util.Log;
35728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.util.SparseArray;
36728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
37728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport java.util.ArrayList;
38728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport java.util.Collections;
39728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport java.util.Comparator;
40728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport java.util.HashMap;
41728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport java.util.Iterator;
42728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport java.util.List;
43728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
44728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn/**
45728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * Singleton for retrieving and monitoring the state about all running
46728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * applications/processes/services.
47728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn */
48728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornpublic class RunningState {
49728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
50728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    final SparseArray<HashMap<String, ProcessItem>> mProcesses
51728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            = new SparseArray<HashMap<String, ProcessItem>>();
52728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    final SparseArray<ProcessItem> mActiveProcesses
53728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            = new SparseArray<ProcessItem>();
54728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    final ServiceProcessComparator mServiceProcessComparator
55728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            = new ServiceProcessComparator();
56728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
57728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    // Temporary for finding process dependencies.
58728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    final SparseArray<ProcessItem> mRunningProcesses
59728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            = new SparseArray<ProcessItem>();
60728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
61728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    final ArrayList<ProcessItem> mProcessItems = new ArrayList<ProcessItem>();
62728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    final ArrayList<ProcessItem> mAllProcessItems = new ArrayList<ProcessItem>();
63728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
64728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    int mSequence = 0;
65728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
66728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    // ----- following protected by mLock -----
67728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
68728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    // Lock for protecting the state that will be shared between the
69728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    // background update thread and the UI thread.
70728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    final Object mLock = new Object();
71728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
72728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    ArrayList<BaseItem> mItems = new ArrayList<BaseItem>();
73728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    ArrayList<MergedItem> mMergedItems = new ArrayList<MergedItem>();
74728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
75728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    int mNumBackgroundProcesses;
76728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    long mBackgroundProcessMemory;
77728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    int mNumForegroundProcesses;
78728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    long mForegroundProcessMemory;
79728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    int mNumServiceProcesses;
80728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    long mServiceProcessMemory;
81728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
82728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static class BaseItem {
83728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        final boolean mIsProcess;
84728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
85728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        PackageItemInfo mPackageInfo;
86728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        CharSequence mDisplayLabel;
87728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        String mLabel;
88728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        String mDescription;
89728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
90728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        int mCurSeq;
91728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
92728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        long mActiveSince;
93728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        long mSize;
94728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        String mSizeStr;
95728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        String mCurSizeStr;
96728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        boolean mNeedDivider;
97728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
98728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        public BaseItem(boolean isProcess) {
99728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mIsProcess = isProcess;
100728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
101728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
102728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
103728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static class ServiceItem extends BaseItem {
104728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        ActivityManager.RunningServiceInfo mRunningService;
105728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        ServiceInfo mServiceInfo;
106728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        boolean mShownAsStarted;
107728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
108728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        MergedItem mMergedItem;
109728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
110728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        public ServiceItem() {
111728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            super(false);
112728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
113728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
114728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
115728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static class ProcessItem extends BaseItem {
116728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        final HashMap<ComponentName, ServiceItem> mServices
117728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                = new HashMap<ComponentName, ServiceItem>();
118728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        final SparseArray<ProcessItem> mDependentProcesses
119728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                = new SparseArray<ProcessItem>();
120728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
121728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        final int mUid;
122728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        final String mProcessName;
123728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        int mPid;
124728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
125728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        ProcessItem mClient;
126728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        int mLastNumDependentProcesses;
127728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
128728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        int mRunningSeq;
129728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        ActivityManager.RunningAppProcessInfo mRunningProcessInfo;
130728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
131728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        // Purely for sorting.
132728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        boolean mIsSystem;
133728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        boolean mIsStarted;
134728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        long mActiveSince;
135728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
136728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        public ProcessItem(Context context, int uid, String processName) {
137728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            super(true);
138728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mDescription = context.getResources().getString(
139728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    R.string.service_process_name, processName);
140728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mUid = uid;
141728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mProcessName = processName;
142728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
143728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
144728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        void ensureLabel(PackageManager pm) {
145728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (mLabel != null) {
146728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                return;
147728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
148728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
149728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            try {
150728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                ApplicationInfo ai = pm.getApplicationInfo(mProcessName, 0);
151728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                if (ai.uid == mUid) {
152728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    mDisplayLabel = ai.loadLabel(pm);
153728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    mLabel = mDisplayLabel.toString();
154728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    mPackageInfo = ai;
155728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    return;
156728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
157728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            } catch (PackageManager.NameNotFoundException e) {
158728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
159728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
160728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            // If we couldn't get information about the overall
161728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            // process, try to find something about the uid.
162728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            String[] pkgs = pm.getPackagesForUid(mUid);
163728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
164728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            // If there is one package with this uid, that is what we want.
165728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (pkgs.length == 1) {
166728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                try {
167728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    ApplicationInfo ai = pm.getApplicationInfo(pkgs[0], 0);
168728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    mDisplayLabel = ai.loadLabel(pm);
169728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    mLabel = mDisplayLabel.toString();
170728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    mPackageInfo = ai;
171728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    return;
172728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } catch (PackageManager.NameNotFoundException e) {
173728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
174728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
175728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
176728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            // If there are multiple, see if one gives us the official name
177728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            // for this uid.
178728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            for (String name : pkgs) {
179728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                try {
180728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    PackageInfo pi = pm.getPackageInfo(name, 0);
181728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    if (pi.sharedUserLabel != 0) {
182728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        CharSequence nm = pm.getText(name,
183728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                                pi.sharedUserLabel, pi.applicationInfo);
184728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        if (nm != null) {
185728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                            mDisplayLabel = nm;
186728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                            mLabel = nm.toString();
187728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                            mPackageInfo = pi.applicationInfo;
188728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                            return;
189728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        }
190728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    }
191728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } catch (PackageManager.NameNotFoundException e) {
192728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
193728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
194728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
195728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            // If still don't have anything to display, just use the
196728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            // service info.
197728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (mServices.size() > 0) {
198728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mPackageInfo = mServices.values().iterator().next()
199728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        .mServiceInfo.applicationInfo;
200728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mDisplayLabel = mPackageInfo.loadLabel(pm);
201728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mLabel = mDisplayLabel.toString();
202728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                return;
203728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
204728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
205728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            // Finally... whatever, just pick the first package's name.
206728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            try {
207728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                ApplicationInfo ai = pm.getApplicationInfo(pkgs[0], 0);
208728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mDisplayLabel = ai.loadLabel(pm);
209728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mLabel = mDisplayLabel.toString();
210728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mPackageInfo = ai;
211728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                return;
212728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            } catch (PackageManager.NameNotFoundException e) {
213728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
214728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
215728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
216728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        boolean updateService(Context context,
217728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                ActivityManager.RunningServiceInfo service) {
218728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            final PackageManager pm = context.getPackageManager();
219728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
220728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            boolean changed = false;
221728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            ServiceItem si = mServices.get(service.service);
222728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (si == null) {
223728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                changed = true;
224728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                si = new ServiceItem();
225728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                si.mRunningService = service;
226728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                try {
227728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    si.mServiceInfo = pm.getServiceInfo(service.service, 0);
228728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } catch (PackageManager.NameNotFoundException e) {
229728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
230728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                si.mDisplayLabel = makeLabel(pm,
231728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        si.mRunningService.service.getClassName(), si.mServiceInfo);
232728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mLabel = mDisplayLabel != null ? mDisplayLabel.toString() : null;
233728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                si.mPackageInfo = si.mServiceInfo.applicationInfo;
234728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mServices.put(service.service, si);
235728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
236728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            si.mCurSeq = mCurSeq;
237728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            si.mRunningService = service;
238728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            long activeSince = service.restarting == 0 ? service.activeSince : -1;
239728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (si.mActiveSince != activeSince) {
240728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                si.mActiveSince = activeSince;
241728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                changed = true;
242728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
243728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (service.clientPackage != null && service.clientLabel != 0) {
244728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                if (si.mShownAsStarted) {
245728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    si.mShownAsStarted = false;
246728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    changed = true;
247728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
248728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                try {
249728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    Resources clientr = pm.getResourcesForApplication(service.clientPackage);
250728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    String label = clientr.getString(service.clientLabel);
251728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    si.mDescription = context.getResources().getString(
252728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                            R.string.service_client_name, label);
253728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } catch (PackageManager.NameNotFoundException e) {
254728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    si.mDescription = null;
255728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
256728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            } else {
257728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                if (!si.mShownAsStarted) {
258728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    si.mShownAsStarted = true;
259728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    changed = true;
260728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
261728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                si.mDescription = context.getResources().getString(
262728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        R.string.service_started_by_app);
263728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
264728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
265728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            return changed;
266728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
267728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
268728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        boolean updateSize(Context context, Debug.MemoryInfo mem, int curSeq) {
269728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mSize = ((long)mem.getTotalPss()) * 1024;
270728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (mCurSeq == curSeq) {
271728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                String sizeStr = Formatter.formatShortFileSize(
272728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        context, mSize);
273728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                if (!sizeStr.equals(mSizeStr)){
274728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    mSizeStr = sizeStr;
275728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    // We update this on the second tick where we update just
276728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    // the text in the current items, so no need to say we
277728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    // changed here.
278728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    return false;
279728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
280728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
281728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            return false;
282728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
283728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
284728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        boolean buildDependencyChain(Context context, PackageManager pm, int curSeq) {
285728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            final int NP = mDependentProcesses.size();
286728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            boolean changed = false;
287728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            for (int i=0; i<NP; i++) {
288728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                ProcessItem proc = mDependentProcesses.valueAt(i);
289728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                if (proc.mClient != this) {
290728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    changed = true;
291728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    proc.mClient = this;
292728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
293728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                proc.mCurSeq = curSeq;
294728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                proc.ensureLabel(pm);
295728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                changed |= proc.buildDependencyChain(context, pm, curSeq);
296728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
297728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
298728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (mLastNumDependentProcesses != mDependentProcesses.size()) {
299728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                changed = true;
300728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mLastNumDependentProcesses = mDependentProcesses.size();
301728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
302728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
303728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            return changed;
304728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
305728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
306728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        void addDependentProcesses(ArrayList<BaseItem> dest,
307728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                ArrayList<ProcessItem> destProc) {
308728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            final int NP = mDependentProcesses.size();
309728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            for (int i=0; i<NP; i++) {
310728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                ProcessItem proc = mDependentProcesses.valueAt(i);
311728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                proc.addDependentProcesses(dest, destProc);
312728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                dest.add(proc);
313728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                if (proc.mPid > 0) {
314728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    destProc.add(proc);
315728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
316728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
317728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
318728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
319728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
320728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static class MergedItem extends BaseItem {
321728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        ProcessItem mProcess;
322728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        final ArrayList<ProcessItem> mOtherProcesses = new ArrayList<ProcessItem>();
323728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        final ArrayList<ServiceItem> mServices = new ArrayList<ServiceItem>();
324728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
325728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        MergedItem() {
326728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            super(false);
327728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
328728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
329728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        boolean update(Context context) {
330728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mPackageInfo = mProcess.mPackageInfo;
331728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mDisplayLabel = mProcess.mDisplayLabel;
332728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mLabel = mProcess.mLabel;
333728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
334728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            int numProcesses = (mProcess.mPid > 0 ? 1 : 0) + mOtherProcesses.size();
335728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            int numServices = mServices.size();
336728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            int resid = R.string.running_processes_item_description_s_s;
337728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (numProcesses != 1) {
338728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                resid = numServices != 1
339728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        ? R.string.running_processes_item_description_p_p
340728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        : R.string.running_processes_item_description_p_s;
341728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            } else if (numServices != 1) {
342728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                resid = R.string.running_processes_item_description_s_p;
343728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
344728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mDescription = context.getResources().getString(resid, numProcesses, numServices);
345728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
346728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mActiveSince = -1;
347728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            for (int i=0; i<mServices.size(); i++) {
348728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                ServiceItem si = mServices.get(i);
349728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                if (si.mActiveSince >= 0 && mActiveSince < si.mActiveSince) {
350728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    mActiveSince = si.mActiveSince;
351728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
352728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
353728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
354728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            return false;
355728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
356728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
357728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        boolean updateSize(Context context) {
358728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mSize = mProcess.mSize;
359728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            for (int i=0; i<mOtherProcesses.size(); i++) {
360728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSize += mOtherProcesses.get(i).mSize;
361728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
362728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
363728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            String sizeStr = Formatter.formatShortFileSize(
364728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    context, mSize);
365728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (!sizeStr.equals(mSizeStr)){
366728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSizeStr = sizeStr;
367728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // We update this on the second tick where we update just
368728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // the text in the current items, so no need to say we
369728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // changed here.
370728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                return false;
371728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
372728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            return false;
373728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
374728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
375728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
376728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static class ServiceProcessComparator implements Comparator<ProcessItem> {
377728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        public int compare(ProcessItem object1, ProcessItem object2) {
378728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (object1.mIsStarted != object2.mIsStarted) {
379728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // Non-started processes go last.
380728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                return object1.mIsStarted ? -1 : 1;
381728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
382728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (object1.mIsSystem != object2.mIsSystem) {
383728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // System processes go below non-system.
384728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                return object1.mIsSystem ? 1 : -1;
385728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
386728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (object1.mActiveSince != object2.mActiveSince) {
387728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // Remaining ones are sorted with the longest running
388728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // services last.
389728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                return (object1.mActiveSince > object2.mActiveSince) ? -1 : 1;
390728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
391728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            return 0;
392728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
393728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
394728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
395728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static CharSequence makeLabel(PackageManager pm,
396728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            String className, PackageItemInfo item) {
397728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (item != null && (item.labelRes != 0
398728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                || item.nonLocalizedLabel != null)) {
399728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            CharSequence label = item.loadLabel(pm);
400728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (label != null) {
401728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                return label;
402728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
403728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
404728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
405728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        String label = className;
406728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        int tail = label.lastIndexOf('.');
407728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (tail >= 0) {
408728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            label = label.substring(tail+1, label.length());
409728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
410728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        return label;
411728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
412728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
413728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    boolean update(Context context, ActivityManager am) {
414728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        final PackageManager pm = context.getPackageManager();
415728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
416728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mSequence++;
417728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
418728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        boolean changed = false;
419728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
420728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        List<ActivityManager.RunningServiceInfo> services
421728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                = am.getRunningServices(RunningServices.MAX_SERVICES);
422728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        final int NS = services != null ? services.size() : 0;
423728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        for (int i=0; i<NS; i++) {
424728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            ActivityManager.RunningServiceInfo si = services.get(i);
425728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            // We are not interested in services that have not been started
426728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            // and don't have a known client, because
427728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            // there is nothing the user can do about them.
428728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (!si.started && si.clientLabel == 0) {
429728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                continue;
430728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
431728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            // We likewise don't care about services running in a
432728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            // persistent process like the system or phone.
433728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if ((si.flags&ActivityManager.RunningServiceInfo.FLAG_PERSISTENT_PROCESS)
434728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    != 0) {
435728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                continue;
436728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
437728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
438728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            HashMap<String, ProcessItem> procs = mProcesses.get(si.uid);
439728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (procs == null) {
440728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                procs = new HashMap<String, ProcessItem>();
441728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mProcesses.put(si.uid, procs);
442728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
443728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            ProcessItem proc = procs.get(si.process);
444728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (proc == null) {
445728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                changed = true;
446728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                proc = new ProcessItem(context, si.uid, si.process);
447728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                procs.put(si.process, proc);
448728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
449728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
450728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (proc.mCurSeq != mSequence) {
451728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                int pid = si.restarting == 0 ? si.pid : 0;
452728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                if (pid != proc.mPid) {
453728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    changed = true;
454728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    if (proc.mPid != pid) {
455728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        if (proc.mPid != 0) {
456728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                            mActiveProcesses.remove(proc.mPid);
457728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        }
458728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        if (pid != 0) {
459728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                            mActiveProcesses.put(pid, proc);
460728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        }
461728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        proc.mPid = pid;
462728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    }
463728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
464728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                proc.mDependentProcesses.clear();
465728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                proc.mCurSeq = mSequence;
466728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
467728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            changed |= proc.updateService(context, si);
468728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
469728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
470728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        // Now update the map of other processes that are running (but
471728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        // don't have services actively running inside them).
472728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        List<ActivityManager.RunningAppProcessInfo> processes
473728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                = am.getRunningAppProcesses();
474728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        final int NP = processes != null ? processes.size() : 0;
475728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        for (int i=0; i<NP; i++) {
476728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            ActivityManager.RunningAppProcessInfo pi = processes.get(i);
477728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            ProcessItem proc = mActiveProcesses.get(pi.pid);
478728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (proc == null) {
479728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // This process is not one that is a direct container
480728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // of a service, so look for it in the secondary
481728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // running list.
482728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                proc = mRunningProcesses.get(pi.pid);
483728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                if (proc == null) {
484728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    proc = new ProcessItem(context, pi.uid, pi.processName);
485728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    proc.mPid = pi.pid;
486728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    mRunningProcesses.put(pi.pid, proc);
487728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
488728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                proc.mDependentProcesses.clear();
489728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
490728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            proc.mRunningSeq = mSequence;
491728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            proc.mRunningProcessInfo = pi;
492728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
493728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
494728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        // Build the chains from client processes to the process they are
495728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        // dependent on; also remove any old running processes.
496728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        int NRP = mRunningProcesses.size();
497728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        for (int i=0; i<NRP; i++) {
498728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            ProcessItem proc = mRunningProcesses.valueAt(i);
499728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (proc.mRunningSeq == mSequence) {
500728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                int clientPid = proc.mRunningProcessInfo.importanceReasonPid;
501728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                if (clientPid != 0) {
502728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    ProcessItem client = mActiveProcesses.get(clientPid);
503728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    if (client == null) {
504728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        client = mRunningProcesses.get(clientPid);
505728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    }
506728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    if (client != null) {
507728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        client.mDependentProcesses.put(proc.mPid, proc);
508728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    }
509728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } else {
510728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    // In this pass the process doesn't have a client.
511728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    // Clear to make sure if it later gets the same one
512728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    // that we will detect the change.
513728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    proc.mClient = null;
514728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
515728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            } else {
516728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mRunningProcesses.remove(mRunningProcesses.keyAt(i));
517728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
518728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
519728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
520728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        // Follow the tree from all primary service processes to all
521728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        // processes they are dependent on, marking these processes as
522728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        // still being active and determining if anything has changed.
523728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        final int NAP = mActiveProcesses.size();
524728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        for (int i=0; i<NAP; i++) {
525728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            ProcessItem proc = mActiveProcesses.valueAt(i);
526728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (proc.mCurSeq == mSequence) {
527728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                changed |= proc.buildDependencyChain(context, pm, mSequence);
528728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
529728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
530728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
531728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        // Look for services and their primary processes that no longer exist...
532728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        for (int i=0; i<mProcesses.size(); i++) {
533728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            HashMap<String, ProcessItem> procs = mProcesses.valueAt(i);
534728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            Iterator<ProcessItem> pit = procs.values().iterator();
535728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            while (pit.hasNext()) {
536728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                ProcessItem pi = pit.next();
537728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                if (pi.mCurSeq == mSequence) {
538728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    pi.ensureLabel(pm);
539728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    if (pi.mPid == 0) {
540728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        // Sanity: a non-process can't be dependent on
541728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        // anything.
542728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        pi.mDependentProcesses.clear();
543728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    }
544728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } else {
545728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    changed = true;
546728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    pit.remove();
547728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    if (procs.size() == 0) {
548728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        mProcesses.remove(mProcesses.keyAt(i));
549728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    }
550728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    if (pi.mPid != 0) {
551728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        mActiveProcesses.remove(pi.mPid);
552728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    }
553728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    continue;
554728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
555728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                Iterator<ServiceItem> sit = pi.mServices.values().iterator();
556728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                while (sit.hasNext()) {
557728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    ServiceItem si = sit.next();
558728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    if (si.mCurSeq != mSequence) {
559728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        changed = true;
560728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        sit.remove();
561728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    }
562728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
563728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
564728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
565728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
566728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (changed) {
567728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            // First determine an order for the services.
568728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            ArrayList<ProcessItem> sortedProcesses = new ArrayList<ProcessItem>();
569728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            for (int i=0; i<mProcesses.size(); i++) {
570728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                for (ProcessItem pi : mProcesses.valueAt(i).values()) {
571728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    pi.mIsSystem = false;
572728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    pi.mIsStarted = true;
573728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    pi.mActiveSince = Long.MAX_VALUE;
574728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    for (ServiceItem si : pi.mServices.values()) {
575728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        if (si.mServiceInfo != null
576728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                                && (si.mServiceInfo.applicationInfo.flags
577728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                                        & ApplicationInfo.FLAG_SYSTEM) != 0) {
578728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                            pi.mIsSystem = true;
579728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        }
580728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        if (si.mRunningService != null
581728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                                && si.mRunningService.clientLabel != 0) {
582728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                            pi.mIsStarted = false;
583728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                            if (pi.mActiveSince > si.mRunningService.activeSince) {
584728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                                pi.mActiveSince = si.mRunningService.activeSince;
585728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                            }
586728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        }
587728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    }
588728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    sortedProcesses.add(pi);
589728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
590728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
591728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
592728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            Collections.sort(sortedProcesses, mServiceProcessComparator);
593728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
594728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            ArrayList<BaseItem> newItems = new ArrayList<BaseItem>();
595728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            ArrayList<MergedItem> newMergedItems = new ArrayList<MergedItem>();
596728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mProcessItems.clear();
597728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            for (int i=0; i<sortedProcesses.size(); i++) {
598728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                ProcessItem pi = sortedProcesses.get(i);
599728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                pi.mNeedDivider = false;
600728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
601728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                int firstProc = mProcessItems.size();
602728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // First add processes we are dependent on.
603728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                pi.addDependentProcesses(newItems, mProcessItems);
604728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // And add the process itself.
605728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                newItems.add(pi);
606728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                if (pi.mPid > 0) {
607728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    mProcessItems.add(pi);
608728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
609728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
610728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // Now add the services running in it.
611728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                MergedItem mergedItem = null;
612728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                boolean haveAllMerged = false;
613728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                boolean needDivider = false;
614728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                for (ServiceItem si : pi.mServices.values()) {
615728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    si.mNeedDivider = needDivider;
616728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    needDivider = true;
617728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    newItems.add(si);
618728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    if (si.mMergedItem != null) {
619728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        if (mergedItem != null && mergedItem != si.mMergedItem) {
620728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                            haveAllMerged = false;
621728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        }
622728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        mergedItem = si.mMergedItem;
623728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    } else {
624728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        haveAllMerged = false;
625728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    }
626728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
627728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
628728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                if (!haveAllMerged || mergedItem == null
629728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        || mergedItem.mServices.size() != pi.mServices.size()) {
630728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    // Whoops, we need to build a new MergedItem!
631728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    mergedItem = new MergedItem();
632728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    for (ServiceItem si : pi.mServices.values()) {
633728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        mergedItem.mServices.add(si);
634728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        si.mMergedItem = mergedItem;
635728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    }
636728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    mergedItem.mProcess = pi;
637728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    mergedItem.mOtherProcesses.clear();
638728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    for (int mpi=firstProc; mpi<(mProcessItems.size()-1); mpi++) {
639728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        mergedItem.mOtherProcesses.add(mProcessItems.get(mpi));
640728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    }
641728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
642728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
643728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mergedItem.update(context);
644728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                newMergedItems.add(mergedItem);
645728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
646728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            synchronized (mLock) {
647728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mItems = newItems;
648728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mMergedItems = newMergedItems;
649728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
650728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
651728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
652728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        // Count number of interesting other (non-active) processes, and
653728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        // build a list of all processes we will retrieve memory for.
654728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mAllProcessItems.clear();
655728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mAllProcessItems.addAll(mProcessItems);
656728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        int numBackgroundProcesses = 0;
657728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        int numForegroundProcesses = 0;
658728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        int numServiceProcesses = 0;
659728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        NRP = mRunningProcesses.size();
660728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        for (int i=0; i<NRP; i++) {
661728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            ProcessItem proc = mRunningProcesses.valueAt(i);
662728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (proc.mCurSeq != mSequence) {
663728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // We didn't hit this process as a dependency on one
664728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // of our active ones, so add it up if needed.
665728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                if (proc.mRunningProcessInfo.importance >=
666728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {
667728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    numBackgroundProcesses++;
668728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    mAllProcessItems.add(proc);
669728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } else if (proc.mRunningProcessInfo.importance <=
670728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
671728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    numForegroundProcesses++;
672728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    mAllProcessItems.add(proc);
673728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } else {
674728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    Log.i(RunningServices.TAG, "Unknown non-service process: "
675728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                            + proc.mProcessName + " #" + proc.mPid);
676728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
677728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            } else {
678728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                numServiceProcesses++;
679728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
680728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
681728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
682728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        long backgroundProcessMemory = 0;
683728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        long foregroundProcessMemory = 0;
684728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        long serviceProcessMemory = 0;
685728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        try {
686728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            final int numProc = mAllProcessItems.size();
687728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            int[] pids = new int[numProc];
688728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            for (int i=0; i<numProc; i++) {
689728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                pids[i] = mAllProcessItems.get(i).mPid;
690728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
691728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            Debug.MemoryInfo[] mem = ActivityManagerNative.getDefault()
692728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    .getProcessMemoryInfo(pids);
693728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            for (int i=pids.length-1; i>=0; i--) {
694728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                ProcessItem proc = mAllProcessItems.get(i);
695728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                changed |= proc.updateSize(context, mem[i], mSequence);
696728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                if (proc.mCurSeq == mSequence) {
697728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    serviceProcessMemory += proc.mSize;
698728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } else if (proc.mRunningProcessInfo.importance >=
699728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {
700728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    backgroundProcessMemory += proc.mSize;
701728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } else if (proc.mRunningProcessInfo.importance <=
702728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
703728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    foregroundProcessMemory += proc.mSize;
704728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
705728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
706728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        } catch (RemoteException e) {
707728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
708728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
709728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        for (int i=0; i<mMergedItems.size(); i++) {
710728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mMergedItems.get(i).updateSize(context);
711728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
712728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
713728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        synchronized (mLock) {
714728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mNumBackgroundProcesses = numBackgroundProcesses;
715728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mNumForegroundProcesses = numForegroundProcesses;
716728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mNumServiceProcesses = numServiceProcesses;
717728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mBackgroundProcessMemory = backgroundProcessMemory;
718728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mForegroundProcessMemory = foregroundProcessMemory;
719728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mServiceProcessMemory = serviceProcessMemory;
720728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
721728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
722728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        return changed;
723728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
724728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
725728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    ArrayList<BaseItem> getCurrentItems() {
726728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        synchronized (mLock) {
727728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            return mItems;
728728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
729728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
730728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
731728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    ArrayList<MergedItem> getCurrentMergedItems() {
732728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        synchronized (mLock) {
733728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            return mMergedItems;
734728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
735728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
736728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn}
737