1728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornpackage com.android.settings.applications;
2728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
325bda17a57321c8cf599673248d2e35d692ad51eDianne Hackbornimport android.app.Activity;
4728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.app.ActivityManager;
5b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackbornimport android.app.AlertDialog;
64d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.app.ApplicationErrorReport;
7b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackbornimport android.app.Dialog;
8ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornimport android.app.DialogFragment;
9728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.app.PendingIntent;
10728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.ActivityNotFoundException;
11728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.ComponentName;
12728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.Context;
13b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackbornimport android.content.DialogInterface;
14728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.Intent;
15728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.IntentSender;
164d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.content.pm.ApplicationInfo;
17728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.PackageManager;
1897d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkeyimport android.content.pm.PackageManager.NameNotFoundException;
19728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.ProviderInfo;
20728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.ServiceInfo;
21728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.res.Resources;
22728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.os.Bundle;
234d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.os.Debug;
2425bda17a57321c8cf599673248d2e35d692ad51eDianne Hackbornimport android.os.Handler;
254d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.os.SystemClock;
26271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackbornimport android.os.UserHandle;
274d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.provider.Settings;
28728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.util.Log;
29728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.view.LayoutInflater;
30728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.view.View;
31728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.view.ViewGroup;
324d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.widget.Button;
33728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.widget.TextView;
34728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
359d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wrenimport com.android.internal.logging.MetricsProto.MetricsEvent;
368a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenimport com.android.settings.InstrumentedFragment;
3797d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkeyimport com.android.settings.R;
3897d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkeyimport com.android.settings.Utils;
3997d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey
404d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.File;
414d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.FileInputStream;
424d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.FileOutputStream;
434d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.IOException;
44728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport java.util.ArrayList;
45271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackbornimport java.util.Collections;
46728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
478a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenpublic class RunningServiceDetails extends InstrumentedFragment
48508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        implements RunningState.OnRefreshUiListener {
49728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static final String TAG = "RunningServicesDetails";
50271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
51728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static final String KEY_UID = "uid";
52271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn    static final String KEY_USER_ID = "user_id";
53728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static final String KEY_PROCESS = "process";
541337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn    static final String KEY_BACKGROUND = "background";
55271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
56b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    static final int DIALOG_CONFIRM_STOP = 1;
57271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
58728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    ActivityManager mAm;
59728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    LayoutInflater mInflater;
60271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
61728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    RunningState mState;
62b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    boolean mHaveData;
63271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
64728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    int mUid;
65271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn    int mUserId;
66728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    String mProcessName;
671337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn    boolean mShowBackground;
68271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
69728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    RunningState.MergedItem mMergedItem;
70271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
71ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    View mRootView;
72728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    ViewGroup mAllDetails;
73728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    ViewGroup mSnippet;
74728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    RunningProcessesView.ActiveItem mSnippetActiveItem;
75728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    RunningProcessesView.ViewHolder mSnippetViewHolder;
76271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
77c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    int mNumServices, mNumProcesses;
78c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
79728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    TextView mServicesHeader;
80728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    TextView mProcessesHeader;
81728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    final ArrayList<ActiveDetail> mActiveDetails = new ArrayList<ActiveDetail>();
82728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
83728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    class ActiveDetail implements View.OnClickListener {
84728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        View mRootView;
854d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        Button mStopButton;
864d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        Button mReportButton;
874d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        RunningState.ServiceItem mServiceItem;
88728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        RunningProcessesView.ActiveItem mActiveItem;
89728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        RunningProcessesView.ViewHolder mViewHolder;
90728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        PendingIntent mManageIntent;
914d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        ComponentName mInstaller;
92728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
93b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        void stopActiveService(boolean confirmed) {
94b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            RunningState.ServiceItem si = mServiceItem;
95b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            if (!confirmed) {
96b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                if ((si.mServiceInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) != 0) {
97ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    showConfirmStopDialog(si.mRunningService.service);
98b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                    return;
99b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                }
100b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            }
101ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            getActivity().stopService(new Intent().setComponent(si.mRunningService.service));
1021337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn            if (mMergedItem == null) {
1031337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                // If this is gone, we are gone.
1041337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                mState.updateNow();
1051337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                finish();
1061337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn            } else if (!mShowBackground && mMergedItem.mServices.size() <= 1) {
107b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                // If there was only one service, we are finishing it,
108b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                // so no reason for the UI to stick around.
1091337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                mState.updateNow();
110b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                finish();
111b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            } else {
112b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                mState.updateNow();
113b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            }
114b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        }
115b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
116728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        public void onClick(View v) {
1174d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn            if (v == mReportButton) {
1184d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                ApplicationErrorReport report = new ApplicationErrorReport();
1194d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.type = ApplicationErrorReport.TYPE_RUNNING_SERVICE;
1204d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.packageName = mServiceItem.mServiceInfo.packageName;
1214d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.installerPackageName = mInstaller.getPackageName();
1224d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.processName = mServiceItem.mRunningService.process;
1234d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.time = System.currentTimeMillis();
1244d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.systemApp = (mServiceItem.mServiceInfo.applicationInfo.flags
1254d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                        & ApplicationInfo.FLAG_SYSTEM) != 0;
1264d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                ApplicationErrorReport.RunningServiceInfo info
1274d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                        = new ApplicationErrorReport.RunningServiceInfo();
128be5994d20152c7194aac79eb8152240655fd3373Dianne Hackborn                if (mActiveItem.mFirstRunTime >= 0) {
129be5994d20152c7194aac79eb8152240655fd3373Dianne Hackborn                    info.durationMillis = SystemClock.elapsedRealtime()-mActiveItem.mFirstRunTime;
1304d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                } else {
1314d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    info.durationMillis = -1;
1324d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                }
1334d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                ComponentName comp = new ComponentName(mServiceItem.mServiceInfo.packageName,
1344d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                        mServiceItem.mServiceInfo.name);
135ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                File filename = getActivity().getFileStreamPath("service_dump.txt");
1364d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                FileOutputStream output = null;
1374d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                try {
1384d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    output = new FileOutputStream(filename);
1394d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    Debug.dumpService("activity", output.getFD(),
1404d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                            new String[] { "-a", "service", comp.flattenToString() });
1414d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                } catch (IOException e) {
1424d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    Log.w(TAG, "Can't dump service: " + comp, e);
1434d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                } finally {
1444d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    if (output != null) try { output.close(); } catch (IOException e) {}
1454d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                }
1464d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                FileInputStream input = null;
1474d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                try {
1484d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    input = new FileInputStream(filename);
1494d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    byte[] buffer = new byte[(int) filename.length()];
1504d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    input.read(buffer);
1514d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    info.serviceDetails = new String(buffer);
1524d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                } catch (IOException e) {
1534d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    Log.w(TAG, "Can't read service dump: " + comp, e);
1544d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                } finally {
1554d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    if (input != null) try { input.close(); } catch (IOException e) {}
1564d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                }
1574d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                filename.delete();
1584d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                Log.i(TAG, "Details: " + info.serviceDetails);
1594d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.runningServiceInfo = info;
1604d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                Intent result = new Intent(Intent.ACTION_APP_ERROR);
1614d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                result.setComponent(mInstaller);
1624d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                result.putExtra(Intent.EXTRA_BUG_REPORT, report);
1634d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                result.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
1644d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                startActivity(result);
1654d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                return;
1664d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn            }
1674d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn
168728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (mManageIntent != null) {
169728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                try {
170ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    getActivity().startIntentSender(mManageIntent.getIntentSender(), null,
171728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                            Intent.FLAG_ACTIVITY_NEW_TASK
172728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                                    | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET,
173728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                            Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET, 0);
174728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } catch (IntentSender.SendIntentException e) {
175728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    Log.w(TAG, e);
176728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } catch (IllegalArgumentException e) {
177728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    Log.w(TAG, e);
178728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } catch (ActivityNotFoundException e) {
179728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    Log.w(TAG, e);
180728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
181b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            } else if (mServiceItem != null) {
182b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                stopActiveService(false);
1831337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn            } else if (mActiveItem.mItem.mBackground) {
1841337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                // Background process.  Just kill it.
1851337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                mAm.killBackgroundProcesses(mActiveItem.mItem.mPackageInfo.packageName);
1861337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                finish();
187c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            } else {
188c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                // Heavy-weight process.  We'll do a force-stop on it.
189c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                mAm.forceStopPackage(mActiveItem.mItem.mPackageInfo.packageName);
190c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                finish();
191728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
192728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
193728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
194728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
195728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    StringBuilder mBuilder = new StringBuilder(128);
196728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
197728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    boolean findMergedItem() {
198728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        RunningState.MergedItem item = null;
1991337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        ArrayList<RunningState.MergedItem> newItems = mShowBackground
2001337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                ? mState.getCurrentBackgroundItems() : mState.getCurrentMergedItems();
201728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (newItems != null) {
202728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            for (int i=0; i<newItems.size(); i++) {
203728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                RunningState.MergedItem mi = newItems.get(i);
204271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                if (mi.mUserId != mUserId) {
205271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    continue;
206271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                }
207271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                if (mUid >= 0 && mi.mProcess != null && mi.mProcess.mUid != mUid) {
208271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    continue;
209271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                }
210271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                if (mProcessName == null || (mi.mProcess != null
211271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                        && mProcessName.equals(mi.mProcess.mProcessName))) {
212728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    item = mi;
213728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    break;
214728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
215728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
216728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
2171337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn
218728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (mMergedItem != item) {
219728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mMergedItem = item;
220728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            return true;
221728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
222728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        return false;
223728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
224271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
225271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn    void addServicesHeader() {
226c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        if (mNumServices == 0) {
227c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mServicesHeader = (TextView)mInflater.inflate(R.layout.separator_label,
228c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    mAllDetails, false);
229c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mServicesHeader.setText(R.string.runningservicedetails_services_title);
230c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mAllDetails.addView(mServicesHeader);
231c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
232c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mNumServices++;
233271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn    }
234271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
235271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn    void addProcessesHeader() {
236271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        if (mNumProcesses == 0) {
237271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            mProcessesHeader = (TextView)mInflater.inflate(R.layout.separator_label,
238271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    mAllDetails, false);
239271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            mProcessesHeader.setText(R.string.runningservicedetails_processes_title);
240271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            mAllDetails.addView(mProcessesHeader);
241271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        }
242271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        mNumProcesses++;
243271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn    }
244271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
245271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn    void addServiceDetailsView(RunningState.ServiceItem si, RunningState.MergedItem mi,
246271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            boolean isService, boolean inclDetails) {
247271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        if (isService) {
248271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            addServicesHeader();
249271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        } else if (mi.mUserId != UserHandle.myUserId()) {
250271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            // This is being called for another user, and is not a service...
251271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            // That is, it is a background processes, being added for the
252271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            // details of a user.  In this case we want a header for processes,
253271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            // since the top subject line is for the user.
254271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            addProcessesHeader();
255271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        }
256271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
257c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        RunningState.BaseItem bi = si != null ? si : mi;
258c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
259c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        ActiveDetail detail = new ActiveDetail();
260c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        View root = mInflater.inflate(R.layout.running_service_details_service,
261c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                mAllDetails, false);
262c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mAllDetails.addView(root);
263c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mRootView = root;
2644d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        detail.mServiceItem = si;
265c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mViewHolder = new RunningProcessesView.ViewHolder(root);
266c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mActiveItem = detail.mViewHolder.bind(mState, bi, mBuilder);
267271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
268271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        if (!inclDetails) {
269271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            root.findViewById(R.id.service).setVisibility(View.GONE);
270271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        }
271271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
272c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        if (si != null && si.mRunningService.clientLabel != 0) {
273c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            detail.mManageIntent = mAm.getRunningServiceControlPanel(
274c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    si.mRunningService.service);
275c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
276c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
277c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        TextView description = (TextView)root.findViewById(R.id.comp_description);
278271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        detail.mStopButton = (Button)root.findViewById(R.id.left_button);
279271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        detail.mReportButton = (Button)root.findViewById(R.id.right_button);
280271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
281271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        if (isService && mi.mUserId != UserHandle.myUserId()) {
282271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            // For services from other users, we don't show any description or
283271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            // controls, because the current user can not perform
284271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            // actions on them.
285271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            description.setVisibility(View.GONE);
286271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            root.findViewById(R.id.control_buttons_panel).setVisibility(View.GONE);
287c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        } else {
288271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            if (si != null && si.mServiceInfo.descriptionRes != 0) {
289271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                description.setText(getActivity().getPackageManager().getText(
290271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                        si.mServiceInfo.packageName, si.mServiceInfo.descriptionRes,
291271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                        si.mServiceInfo.applicationInfo));
292271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            } else {
293271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                if (mi.mBackground) {
294271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    description.setText(R.string.background_process_stop_description);
295271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                } else if (detail.mManageIntent != null) {
296271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    try {
297271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                        Resources clientr = getActivity().getPackageManager().getResourcesForApplication(
298271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                                si.mRunningService.clientPackage);
299271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                        String label = clientr.getString(si.mRunningService.clientLabel);
300271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                        description.setText(getActivity().getString(R.string.service_manage_description,
301271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                                label));
302271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    } catch (PackageManager.NameNotFoundException e) {
303271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    }
304271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                } else {
305271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    description.setText(getActivity().getText(si != null
306271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                            ? R.string.service_stop_description
307271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                            : R.string.heavy_weight_stop_description));
308c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                }
309271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            }
310271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
311271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            detail.mStopButton.setOnClickListener(detail);
312271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            detail.mStopButton.setText(getActivity().getText(detail.mManageIntent != null
313271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    ? R.string.service_manage : R.string.service_stop));
314271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            detail.mReportButton.setOnClickListener(detail);
315271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            detail.mReportButton.setText(com.android.internal.R.string.report);
316271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            // check if error reporting is enabled in secure settings
3175246e7f76d5fe62f7ffd99e889d90116b37b7f35Jeff Sharkey            int enabled = Settings.Global.getInt(getActivity().getContentResolver(),
3185246e7f76d5fe62f7ffd99e889d90116b37b7f35Jeff Sharkey                    Settings.Global.SEND_ACTION_APP_ERROR, 0);
319271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            if (enabled != 0 && si != null) {
320271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                detail.mInstaller = ApplicationErrorReport.getErrorReportReceiver(
321271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                        getActivity(), si.mServiceInfo.packageName,
322271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                        si.mServiceInfo.applicationInfo.flags);
323271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                detail.mReportButton.setEnabled(detail.mInstaller != null);
324c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            } else {
325271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                detail.mReportButton.setEnabled(false);
326c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            }
327c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
3284d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn
329c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mActiveDetails.add(detail);
330c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    }
331271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
332c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    void addProcessDetailsView(RunningState.ProcessItem pi, boolean isMain) {
333271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        addProcessesHeader();
334271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
335c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        ActiveDetail detail = new ActiveDetail();
336c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        View root = mInflater.inflate(R.layout.running_service_details_process,
337c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                mAllDetails, false);
338c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mAllDetails.addView(root);
339c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mRootView = root;
340c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mViewHolder = new RunningProcessesView.ViewHolder(root);
341c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mActiveItem = detail.mViewHolder.bind(mState, pi, mBuilder);
342c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
343c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        TextView description = (TextView)root.findViewById(R.id.comp_description);
344271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        if (pi.mUserId != UserHandle.myUserId()) {
345271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            // Processes for another user are all shown batched together; there is
346271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            // no reason to have a description.
347271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            description.setVisibility(View.GONE);
348271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        } else if (isMain) {
349c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            description.setText(R.string.main_running_process_description);
350c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        } else {
351c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            int textid = 0;
352c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            CharSequence label = null;
353c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            ActivityManager.RunningAppProcessInfo rpi = pi.mRunningProcessInfo;
354c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            final ComponentName comp = rpi.importanceReasonComponent;
355c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            //Log.i(TAG, "Secondary proc: code=" + rpi.importanceReasonCode
356c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            //        + " pid=" + rpi.importanceReasonPid + " comp=" + comp);
357c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            switch (rpi.importanceReasonCode) {
358c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                case ActivityManager.RunningAppProcessInfo.REASON_PROVIDER_IN_USE:
359c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    textid = R.string.process_provider_in_use_description;
3605774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn                    if (rpi.importanceReasonComponent != null) {
3615774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn                        try {
362ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            ProviderInfo prov = getActivity().getPackageManager().getProviderInfo(
3635774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn                                    rpi.importanceReasonComponent, 0);
364ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            label = RunningState.makeLabel(getActivity().getPackageManager(),
3655774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn                                    prov.name, prov);
3665774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn                        } catch (NameNotFoundException e) {
367c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        }
368c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    }
369c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    break;
370c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                case ActivityManager.RunningAppProcessInfo.REASON_SERVICE_IN_USE:
371c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    textid = R.string.process_service_in_use_description;
372c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    if (rpi.importanceReasonComponent != null) {
373c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        try {
374ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            ServiceInfo serv = getActivity().getPackageManager().getServiceInfo(
375c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                                    rpi.importanceReasonComponent, 0);
376ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            label = RunningState.makeLabel(getActivity().getPackageManager(),
377c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                                    serv.name, serv);
378c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        } catch (NameNotFoundException e) {
379c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        }
380c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    }
381c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    break;
382c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            }
383c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            if (textid != 0 && label != null) {
384ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                description.setText(getActivity().getString(textid, label));
385c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            }
386c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
387c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
388c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mActiveDetails.add(detail);
389c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    }
390271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
391271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn    void addDetailsViews(RunningState.MergedItem item, boolean inclServices,
392271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            boolean inclProcesses) {
393271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        if (item != null) {
394271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            if (inclServices) {
395271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                for (int i=0; i<item.mServices.size(); i++) {
396271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    addServiceDetailsView(item.mServices.get(i), item, true, true);
397271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                }
398271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            }
399271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
400271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            if (inclProcesses) {
401271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                if (item.mServices.size() <= 0) {
402271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    // This item does not have any services, so it must be
403271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    // another interesting process...  we will put a fake service
404271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    // entry for it, to allow the user to "stop" it.
405271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    addServiceDetailsView(null, item, false, item.mUserId != UserHandle.myUserId());
406271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                } else {
407271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    // This screen is actually showing services, so also show
408271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    // the process details.
409271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    for (int i=-1; i<item.mOtherProcesses.size(); i++) {
410271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                        RunningState.ProcessItem pi = i < 0 ? item.mProcess
411271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                                : item.mOtherProcesses.get(i);
412271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                        if (pi != null && pi.mPid <= 0) {
413271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                            continue;
414271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                        }
415c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
416271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                        addProcessDetailsView(pi, i < 0);
417271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    }
418271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                }
419271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            }
420271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        }
421271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn    }
422271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
423728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    void addDetailViews() {
424728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        for (int i=mActiveDetails.size()-1; i>=0; i--) {
425728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mAllDetails.removeView(mActiveDetails.get(i).mRootView);
426728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
427728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mActiveDetails.clear();
428728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
429728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (mServicesHeader != null) {
430728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mAllDetails.removeView(mServicesHeader);
431728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mServicesHeader = null;
432728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
433728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
434728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (mProcessesHeader != null) {
435728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mAllDetails.removeView(mProcessesHeader);
436728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mProcessesHeader = null;
437728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
438271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
439c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mNumServices = mNumProcesses = 0;
440271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
4419fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn        if (mMergedItem != null) {
4429fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn            if (mMergedItem.mUser != null) {
4439fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                ArrayList<RunningState.MergedItem> items;
4449fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                if (mShowBackground) {
4459fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                    items = new ArrayList<RunningState.MergedItem>(mMergedItem.mChildren);
4469fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                    Collections.sort(items, mState.mBackgroundComparator);
4479fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                } else {
4489fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                    items = mMergedItem.mChildren;
4499fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                }
4509fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                for (int i=0; i<items.size(); i++) {
4519fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                    addDetailsViews(items.get(i), true, false);
4529fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                }
4539fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                for (int i=0; i<items.size(); i++) {
4549fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                    addDetailsViews(items.get(i), false, true);
4559fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                }
456271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            } else {
4579fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                addDetailsViews(mMergedItem, true, true);
458c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            }
459728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
460728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
461728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
462728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    void refreshUi(boolean dataChanged) {
463728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (findMergedItem()) {
464728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            dataChanged = true;
465728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
466728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (dataChanged) {
467728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (mMergedItem != null) {
468728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSnippetActiveItem = mSnippetViewHolder.bind(mState,
469728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        mMergedItem, mBuilder);
470728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            } else if (mSnippetActiveItem != null) {
471728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // Clear whatever is currently being shown.
472728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSnippetActiveItem.mHolder.size.setText("");
473728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSnippetActiveItem.mHolder.uptime.setText("");
474728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSnippetActiveItem.mHolder.description.setText(R.string.no_services);
475728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            } else {
476728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // No merged item, never had one.  Nothing to do.
477728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                finish();
478728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                return;
479728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
480728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            addDetailViews();
481728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
482728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
483728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
484ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    private void finish() {
48525bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn        (new Handler()).post(new Runnable() {
48625bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn            @Override
48725bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn            public void run() {
48825bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn                Activity a = getActivity();
48925bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn                if (a != null) {
49025bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn                    a.onBackPressed();
49125bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn                }
49225bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn            }
49325bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn        });
494ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    }
495ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
496728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
497ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    public void onCreate(Bundle savedInstanceState) {
498728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onCreate(savedInstanceState);
499728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
500271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        mUid = getArguments().getInt(KEY_UID, -1);
501271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        mUserId = getArguments().getInt(KEY_USER_ID, 0);
502271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        mProcessName = getArguments().getString(KEY_PROCESS, null);
503ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mShowBackground = getArguments().getBoolean(KEY_BACKGROUND, false);
504728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
505ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mAm = (ActivityManager)getActivity().getSystemService(Context.ACTIVITY_SERVICE);
506ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mInflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
507728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
508ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mState = RunningState.getInstance(getActivity());
509ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    }
510ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
511ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    @Override
51297d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey    public View onCreateView(
51397d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey            LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
51497d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey        final View view = inflater.inflate(R.layout.running_service_details, container, false);
51597d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey        Utils.prepareCustomPreferencesList(container, view, view, false);
51697d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey
51797d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey        mRootView = view;
518ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mAllDetails = (ViewGroup)view.findViewById(R.id.all_details);
519ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mSnippet = (ViewGroup)view.findViewById(R.id.snippet);
520728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mSnippetViewHolder = new RunningProcessesView.ViewHolder(mSnippet);
521b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
522b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        // We want to retrieve the data right now, so any active managed
523b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        // dialog that gets created can find it.
524b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        ensureData();
525ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
526ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        return view;
527728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
528728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
529728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
530ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    public void onPause() {
531728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onPause();
532b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        mHaveData = false;
533508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        mState.pause();
534728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
535728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
536728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
5378a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    protected int getMetricsCategory() {
5389d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren        return MetricsEvent.RUNNING_SERVICE_DETAILS;
5398a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    }
5408a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren
5418a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren    @Override
542ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    public void onResume() {
543728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onResume();
544b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        ensureData();
545728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
546728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
547b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    ActiveDetail activeDetailForService(ComponentName comp) {
548b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        for (int i=0; i<mActiveDetails.size(); i++) {
549b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            ActiveDetail ad = mActiveDetails.get(i);
550b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            if (ad.mServiceItem != null && ad.mServiceItem.mRunningService != null
551b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                    && comp.equals(ad.mServiceItem.mRunningService.service)) {
552b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                return ad;
553b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            }
554b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        }
555b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        return null;
556b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    }
557b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
558ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    private void showConfirmStopDialog(ComponentName comp) {
559ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        DialogFragment newFragment = MyAlertDialogFragment.newConfirmStop(
560ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                DIALOG_CONFIRM_STOP, comp);
561ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        newFragment.setTargetFragment(this, 0);
562ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        newFragment.show(getFragmentManager(), "confirmstop");
563ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    }
564ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
565ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    public static class MyAlertDialogFragment extends DialogFragment {
566ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
567ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        public static MyAlertDialogFragment newConfirmStop(int id, ComponentName comp) {
568ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            MyAlertDialogFragment frag = new MyAlertDialogFragment();
569ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            Bundle args = new Bundle();
570ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            args.putInt("id", id);
571ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            args.putParcelable("comp", comp);
572ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            frag.setArguments(args);
573ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            return frag;
574ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        }
575ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
576ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        RunningServiceDetails getOwner() {
577ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            return (RunningServiceDetails)getTargetFragment();
578ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        }
579ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
580ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        @Override
581ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        public Dialog onCreateDialog(Bundle savedInstanceState) {
582ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            int id = getArguments().getInt("id");
583ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            switch (id) {
584ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                case DIALOG_CONFIRM_STOP: {
585ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    final ComponentName comp = (ComponentName)getArguments().getParcelable("comp");
586ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    if (getOwner().activeDetailForService(comp) == null) {
587ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                        return null;
588ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    }
589ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
590ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    return new AlertDialog.Builder(getActivity())
591ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            .setTitle(getActivity().getString(R.string.runningservicedetails_stop_dlg_title))
592ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            .setMessage(getActivity().getString(R.string.runningservicedetails_stop_dlg_text))
593ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            .setPositiveButton(R.string.dlg_ok,
594ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                                    new DialogInterface.OnClickListener() {
595ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                                public void onClick(DialogInterface dialog, int which) {
596ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                                    ActiveDetail ad = getOwner().activeDetailForService(comp);
597ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                                    if (ad != null) {
598ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                                        ad.stopActiveService(true);
599ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                                    }
600b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                                }
601ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            })
602ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            .setNegativeButton(R.string.dlg_cancel, null)
603ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            .create();
604ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                }
605b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            }
606ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            throw new IllegalArgumentException("unknown id " + id);
607b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        }
608b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    }
609b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
610b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    void ensureData() {
611b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        if (!mHaveData) {
612b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            mHaveData = true;
613b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            mState.resume(this);
614b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
615b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            // We want to go away if the service being shown no longer exists,
616b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            // so we need to ensure we have done the initial data retrieval before
617b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            // showing our ui.
618b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            mState.waitForData();
619508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn
620b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            // And since we know we have the data, let's show the UI right away
621b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            // to avoid flicker.
622b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            refreshUi(true);
623b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        }
624b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    }
625b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
626508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn    void updateTimes() {
627508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        if (mSnippetActiveItem != null) {
628ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mSnippetActiveItem.updateTime(getActivity(), mBuilder);
629508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        }
630508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        for (int i=0; i<mActiveDetails.size(); i++) {
631ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mActiveDetails.get(i).mActiveItem.updateTime(getActivity(), mBuilder);
632508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        }
633508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn    }
634508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn
635508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn    @Override
636508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn    public void onRefreshUi(int what) {
6378fda756e698c21f08992b9606dd3791c4755122cAmith Yamasani        if (getActivity() == null) return;
638508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        switch (what) {
639508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn            case REFRESH_TIME:
640508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                updateTimes();
641508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                break;
642508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn            case REFRESH_DATA:
643508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                refreshUi(false);
644508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                updateTimes();
645508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                break;
646508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn            case REFRESH_STRUCTURE:
647508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                refreshUi(true);
648508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                updateTimes();
649508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                break;
650508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        }
651508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn    }
652728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn}
653