RunningServiceDetails.java revision 9fae74f6c37b60d10a2bddb214c28e7f9f7484f3
1728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornpackage com.android.settings.applications;
2728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
3728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport com.android.settings.R;
4728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
525bda17a57321c8cf599673248d2e35d692ad51eDianne Hackbornimport android.app.Activity;
6728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.app.ActivityManager;
7b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackbornimport android.app.AlertDialog;
84d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.app.ApplicationErrorReport;
9b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackbornimport android.app.Dialog;
10ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornimport android.app.DialogFragment;
11ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornimport android.app.Fragment;
12728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.app.PendingIntent;
13728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.ActivityNotFoundException;
14728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.ComponentName;
15728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.Context;
16b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackbornimport android.content.DialogInterface;
17728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.Intent;
18728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.IntentSender;
194d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.content.pm.ApplicationInfo;
20728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.PackageManager;
21728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.ProviderInfo;
22728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.ServiceInfo;
23728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.PackageManager.NameNotFoundException;
24728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.res.Resources;
25728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.os.Bundle;
264d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.os.Debug;
2725bda17a57321c8cf599673248d2e35d692ad51eDianne Hackbornimport android.os.Handler;
284d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.os.SystemClock;
29271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackbornimport android.os.UserHandle;
304d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.provider.Settings;
31728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.util.Log;
32728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.view.LayoutInflater;
33728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.view.View;
34728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.view.ViewGroup;
354d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.widget.Button;
36728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.widget.TextView;
37728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
384d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.File;
394d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.FileInputStream;
404d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.FileOutputStream;
414d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.IOException;
42728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport java.util.ArrayList;
43271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackbornimport java.util.Collections;
44728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
45ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornpublic class RunningServiceDetails extends Fragment
46508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        implements RunningState.OnRefreshUiListener {
47728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static final String TAG = "RunningServicesDetails";
48271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
49728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static final String KEY_UID = "uid";
50271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn    static final String KEY_USER_ID = "user_id";
51728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static final String KEY_PROCESS = "process";
521337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn    static final String KEY_BACKGROUND = "background";
53271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
54b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    static final int DIALOG_CONFIRM_STOP = 1;
55271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
56728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    ActivityManager mAm;
57728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    LayoutInflater mInflater;
58271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
59728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    RunningState mState;
60b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    boolean mHaveData;
61271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
62728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    int mUid;
63271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn    int mUserId;
64728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    String mProcessName;
651337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn    boolean mShowBackground;
66271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
67728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    RunningState.MergedItem mMergedItem;
68271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
69ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    View mRootView;
70728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    ViewGroup mAllDetails;
71728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    ViewGroup mSnippet;
72728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    RunningProcessesView.ActiveItem mSnippetActiveItem;
73728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    RunningProcessesView.ViewHolder mSnippetViewHolder;
74271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
75c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    int mNumServices, mNumProcesses;
76c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
77728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    TextView mServicesHeader;
78728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    TextView mProcessesHeader;
79728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    final ArrayList<ActiveDetail> mActiveDetails = new ArrayList<ActiveDetail>();
80728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
81728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    class ActiveDetail implements View.OnClickListener {
82728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        View mRootView;
834d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        Button mStopButton;
844d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        Button mReportButton;
854d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        RunningState.ServiceItem mServiceItem;
86728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        RunningProcessesView.ActiveItem mActiveItem;
87728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        RunningProcessesView.ViewHolder mViewHolder;
88728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        PendingIntent mManageIntent;
894d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        ComponentName mInstaller;
90728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
91b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        void stopActiveService(boolean confirmed) {
92b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            RunningState.ServiceItem si = mServiceItem;
93b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            if (!confirmed) {
94b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                if ((si.mServiceInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) != 0) {
95ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    showConfirmStopDialog(si.mRunningService.service);
96b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                    return;
97b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                }
98b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            }
99ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            getActivity().stopService(new Intent().setComponent(si.mRunningService.service));
1001337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn            if (mMergedItem == null) {
1011337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                // If this is gone, we are gone.
1021337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                mState.updateNow();
1031337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                finish();
1041337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn            } else if (!mShowBackground && mMergedItem.mServices.size() <= 1) {
105b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                // If there was only one service, we are finishing it,
106b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                // so no reason for the UI to stick around.
1071337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                mState.updateNow();
108b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                finish();
109b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            } else {
110b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                mState.updateNow();
111b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            }
112b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        }
113b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
114728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        public void onClick(View v) {
1154d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn            if (v == mReportButton) {
1164d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                ApplicationErrorReport report = new ApplicationErrorReport();
1174d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.type = ApplicationErrorReport.TYPE_RUNNING_SERVICE;
1184d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.packageName = mServiceItem.mServiceInfo.packageName;
1194d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.installerPackageName = mInstaller.getPackageName();
1204d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.processName = mServiceItem.mRunningService.process;
1214d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.time = System.currentTimeMillis();
1224d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.systemApp = (mServiceItem.mServiceInfo.applicationInfo.flags
1234d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                        & ApplicationInfo.FLAG_SYSTEM) != 0;
1244d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                ApplicationErrorReport.RunningServiceInfo info
1254d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                        = new ApplicationErrorReport.RunningServiceInfo();
126be5994d20152c7194aac79eb8152240655fd3373Dianne Hackborn                if (mActiveItem.mFirstRunTime >= 0) {
127be5994d20152c7194aac79eb8152240655fd3373Dianne Hackborn                    info.durationMillis = SystemClock.elapsedRealtime()-mActiveItem.mFirstRunTime;
1284d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                } else {
1294d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    info.durationMillis = -1;
1304d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                }
1314d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                ComponentName comp = new ComponentName(mServiceItem.mServiceInfo.packageName,
1324d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                        mServiceItem.mServiceInfo.name);
133ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                File filename = getActivity().getFileStreamPath("service_dump.txt");
1344d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                FileOutputStream output = null;
1354d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                try {
1364d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    output = new FileOutputStream(filename);
1374d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    Debug.dumpService("activity", output.getFD(),
1384d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                            new String[] { "-a", "service", comp.flattenToString() });
1394d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                } catch (IOException e) {
1404d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    Log.w(TAG, "Can't dump service: " + comp, e);
1414d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                } finally {
1424d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    if (output != null) try { output.close(); } catch (IOException e) {}
1434d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                }
1444d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                FileInputStream input = null;
1454d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                try {
1464d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    input = new FileInputStream(filename);
1474d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    byte[] buffer = new byte[(int) filename.length()];
1484d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    input.read(buffer);
1494d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    info.serviceDetails = new String(buffer);
1504d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                } catch (IOException e) {
1514d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    Log.w(TAG, "Can't read service dump: " + comp, e);
1524d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                } finally {
1534d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    if (input != null) try { input.close(); } catch (IOException e) {}
1544d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                }
1554d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                filename.delete();
1564d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                Log.i(TAG, "Details: " + info.serviceDetails);
1574d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.runningServiceInfo = info;
1584d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                Intent result = new Intent(Intent.ACTION_APP_ERROR);
1594d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                result.setComponent(mInstaller);
1604d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                result.putExtra(Intent.EXTRA_BUG_REPORT, report);
1614d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                result.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
1624d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                startActivity(result);
1634d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                return;
1644d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn            }
1654d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn
166728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (mManageIntent != null) {
167728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                try {
168ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    getActivity().startIntentSender(mManageIntent.getIntentSender(), null,
169728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                            Intent.FLAG_ACTIVITY_NEW_TASK
170728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                                    | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET,
171728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                            Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET, 0);
172728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } catch (IntentSender.SendIntentException e) {
173728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    Log.w(TAG, e);
174728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } catch (IllegalArgumentException e) {
175728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    Log.w(TAG, e);
176728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } catch (ActivityNotFoundException e) {
177728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    Log.w(TAG, e);
178728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
179b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            } else if (mServiceItem != null) {
180b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                stopActiveService(false);
1811337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn            } else if (mActiveItem.mItem.mBackground) {
1821337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                // Background process.  Just kill it.
1831337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                mAm.killBackgroundProcesses(mActiveItem.mItem.mPackageInfo.packageName);
1841337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                finish();
185c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            } else {
186c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                // Heavy-weight process.  We'll do a force-stop on it.
187c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                mAm.forceStopPackage(mActiveItem.mItem.mPackageInfo.packageName);
188c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                finish();
189728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
190728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
191728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
192728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
193728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    StringBuilder mBuilder = new StringBuilder(128);
194728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
195728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    boolean findMergedItem() {
196728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        RunningState.MergedItem item = null;
1971337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        ArrayList<RunningState.MergedItem> newItems = mShowBackground
1981337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                ? mState.getCurrentBackgroundItems() : mState.getCurrentMergedItems();
199728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (newItems != null) {
200728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            for (int i=0; i<newItems.size(); i++) {
201728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                RunningState.MergedItem mi = newItems.get(i);
202271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                if (mi.mUserId != mUserId) {
203271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    continue;
204271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                }
205271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                if (mUid >= 0 && mi.mProcess != null && mi.mProcess.mUid != mUid) {
206271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    continue;
207271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                }
208271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                if (mProcessName == null || (mi.mProcess != null
209271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                        && mProcessName.equals(mi.mProcess.mProcessName))) {
210728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    item = mi;
211728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    break;
212728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
213728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
214728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
2151337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn
216728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (mMergedItem != item) {
217728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mMergedItem = item;
218728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            return true;
219728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
220728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        return false;
221728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
222271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
223271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn    void addServicesHeader() {
224c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        if (mNumServices == 0) {
225c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mServicesHeader = (TextView)mInflater.inflate(R.layout.separator_label,
226c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    mAllDetails, false);
227c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mServicesHeader.setText(R.string.runningservicedetails_services_title);
228c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mAllDetails.addView(mServicesHeader);
229c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
230c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mNumServices++;
231271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn    }
232271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
233271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn    void addProcessesHeader() {
234271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        if (mNumProcesses == 0) {
235271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            mProcessesHeader = (TextView)mInflater.inflate(R.layout.separator_label,
236271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    mAllDetails, false);
237271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            mProcessesHeader.setText(R.string.runningservicedetails_processes_title);
238271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            mAllDetails.addView(mProcessesHeader);
239271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        }
240271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        mNumProcesses++;
241271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn    }
242271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
243271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn    void addServiceDetailsView(RunningState.ServiceItem si, RunningState.MergedItem mi,
244271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            boolean isService, boolean inclDetails) {
245271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        if (isService) {
246271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            addServicesHeader();
247271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        } else if (mi.mUserId != UserHandle.myUserId()) {
248271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            // This is being called for another user, and is not a service...
249271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            // That is, it is a background processes, being added for the
250271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            // details of a user.  In this case we want a header for processes,
251271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            // since the top subject line is for the user.
252271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            addProcessesHeader();
253271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        }
254271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
255c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        RunningState.BaseItem bi = si != null ? si : mi;
256c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
257c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        ActiveDetail detail = new ActiveDetail();
258c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        View root = mInflater.inflate(R.layout.running_service_details_service,
259c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                mAllDetails, false);
260c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mAllDetails.addView(root);
261c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mRootView = root;
2624d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        detail.mServiceItem = si;
263c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mViewHolder = new RunningProcessesView.ViewHolder(root);
264c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mActiveItem = detail.mViewHolder.bind(mState, bi, mBuilder);
265271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
266271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        if (!inclDetails) {
267271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            root.findViewById(R.id.service).setVisibility(View.GONE);
268271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        }
269271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
270c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        if (si != null && si.mRunningService.clientLabel != 0) {
271c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            detail.mManageIntent = mAm.getRunningServiceControlPanel(
272c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    si.mRunningService.service);
273c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
274c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
275c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        TextView description = (TextView)root.findViewById(R.id.comp_description);
276271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        detail.mStopButton = (Button)root.findViewById(R.id.left_button);
277271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        detail.mReportButton = (Button)root.findViewById(R.id.right_button);
278271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
279271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        if (isService && mi.mUserId != UserHandle.myUserId()) {
280271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            // For services from other users, we don't show any description or
281271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            // controls, because the current user can not perform
282271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            // actions on them.
283271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            description.setVisibility(View.GONE);
284271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            root.findViewById(R.id.control_buttons_panel).setVisibility(View.GONE);
285c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        } else {
286271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            if (si != null && si.mServiceInfo.descriptionRes != 0) {
287271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                description.setText(getActivity().getPackageManager().getText(
288271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                        si.mServiceInfo.packageName, si.mServiceInfo.descriptionRes,
289271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                        si.mServiceInfo.applicationInfo));
290271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            } else {
291271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                if (mi.mBackground) {
292271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    description.setText(R.string.background_process_stop_description);
293271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                } else if (detail.mManageIntent != null) {
294271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    try {
295271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                        Resources clientr = getActivity().getPackageManager().getResourcesForApplication(
296271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                                si.mRunningService.clientPackage);
297271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                        String label = clientr.getString(si.mRunningService.clientLabel);
298271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                        description.setText(getActivity().getString(R.string.service_manage_description,
299271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                                label));
300271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    } catch (PackageManager.NameNotFoundException e) {
301271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    }
302271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                } else {
303271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    description.setText(getActivity().getText(si != null
304271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                            ? R.string.service_stop_description
305271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                            : R.string.heavy_weight_stop_description));
306c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                }
307271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            }
308271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
309271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            detail.mStopButton.setOnClickListener(detail);
310271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            detail.mStopButton.setText(getActivity().getText(detail.mManageIntent != null
311271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    ? R.string.service_manage : R.string.service_stop));
312271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            detail.mReportButton.setOnClickListener(detail);
313271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            detail.mReportButton.setText(com.android.internal.R.string.report);
314271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            // check if error reporting is enabled in secure settings
315271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            int enabled = Settings.Secure.getInt(getActivity().getContentResolver(),
316271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    Settings.Secure.SEND_ACTION_APP_ERROR, 0);
317271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            if (enabled != 0 && si != null) {
318271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                detail.mInstaller = ApplicationErrorReport.getErrorReportReceiver(
319271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                        getActivity(), si.mServiceInfo.packageName,
320271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                        si.mServiceInfo.applicationInfo.flags);
321271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                detail.mReportButton.setEnabled(detail.mInstaller != null);
322c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            } else {
323271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                detail.mReportButton.setEnabled(false);
324c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            }
325c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
3264d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn
327c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mActiveDetails.add(detail);
328c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    }
329271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
330c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    void addProcessDetailsView(RunningState.ProcessItem pi, boolean isMain) {
331271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        addProcessesHeader();
332271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
333c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        ActiveDetail detail = new ActiveDetail();
334c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        View root = mInflater.inflate(R.layout.running_service_details_process,
335c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                mAllDetails, false);
336c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mAllDetails.addView(root);
337c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mRootView = root;
338c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mViewHolder = new RunningProcessesView.ViewHolder(root);
339c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mActiveItem = detail.mViewHolder.bind(mState, pi, mBuilder);
340c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
341c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        TextView description = (TextView)root.findViewById(R.id.comp_description);
342271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        if (pi.mUserId != UserHandle.myUserId()) {
343271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            // Processes for another user are all shown batched together; there is
344271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            // no reason to have a description.
345271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            description.setVisibility(View.GONE);
346271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        } else if (isMain) {
347c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            description.setText(R.string.main_running_process_description);
348c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        } else {
349c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            int textid = 0;
350c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            CharSequence label = null;
351c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            ActivityManager.RunningAppProcessInfo rpi = pi.mRunningProcessInfo;
352c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            final ComponentName comp = rpi.importanceReasonComponent;
353c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            //Log.i(TAG, "Secondary proc: code=" + rpi.importanceReasonCode
354c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            //        + " pid=" + rpi.importanceReasonPid + " comp=" + comp);
355c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            switch (rpi.importanceReasonCode) {
356c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                case ActivityManager.RunningAppProcessInfo.REASON_PROVIDER_IN_USE:
357c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    textid = R.string.process_provider_in_use_description;
3585774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn                    if (rpi.importanceReasonComponent != null) {
3595774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn                        try {
360ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            ProviderInfo prov = getActivity().getPackageManager().getProviderInfo(
3615774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn                                    rpi.importanceReasonComponent, 0);
362ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            label = RunningState.makeLabel(getActivity().getPackageManager(),
3635774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn                                    prov.name, prov);
3645774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn                        } catch (NameNotFoundException e) {
365c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        }
366c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    }
367c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    break;
368c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                case ActivityManager.RunningAppProcessInfo.REASON_SERVICE_IN_USE:
369c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    textid = R.string.process_service_in_use_description;
370c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    if (rpi.importanceReasonComponent != null) {
371c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        try {
372ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            ServiceInfo serv = getActivity().getPackageManager().getServiceInfo(
373c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                                    rpi.importanceReasonComponent, 0);
374ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            label = RunningState.makeLabel(getActivity().getPackageManager(),
375c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                                    serv.name, serv);
376c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        } catch (NameNotFoundException e) {
377c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        }
378c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    }
379c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    break;
380c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            }
381c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            if (textid != 0 && label != null) {
382ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                description.setText(getActivity().getString(textid, label));
383c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            }
384c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
385c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
386c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mActiveDetails.add(detail);
387c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    }
388271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
389271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn    void addDetailsViews(RunningState.MergedItem item, boolean inclServices,
390271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            boolean inclProcesses) {
391271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        if (item != null) {
392271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            if (inclServices) {
393271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                for (int i=0; i<item.mServices.size(); i++) {
394271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    addServiceDetailsView(item.mServices.get(i), item, true, true);
395271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                }
396271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            }
397271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
398271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            if (inclProcesses) {
399271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                if (item.mServices.size() <= 0) {
400271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    // This item does not have any services, so it must be
401271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    // another interesting process...  we will put a fake service
402271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    // entry for it, to allow the user to "stop" it.
403271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    addServiceDetailsView(null, item, false, item.mUserId != UserHandle.myUserId());
404271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                } else {
405271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    // This screen is actually showing services, so also show
406271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    // the process details.
407271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    for (int i=-1; i<item.mOtherProcesses.size(); i++) {
408271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                        RunningState.ProcessItem pi = i < 0 ? item.mProcess
409271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                                : item.mOtherProcesses.get(i);
410271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                        if (pi != null && pi.mPid <= 0) {
411271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                            continue;
412271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                        }
413c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
414271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                        addProcessDetailsView(pi, i < 0);
415271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                    }
416271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn                }
417271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            }
418271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        }
419271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn    }
420271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
421728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    void addDetailViews() {
422728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        for (int i=mActiveDetails.size()-1; i>=0; i--) {
423728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mAllDetails.removeView(mActiveDetails.get(i).mRootView);
424728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
425728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mActiveDetails.clear();
426728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
427728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (mServicesHeader != null) {
428728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mAllDetails.removeView(mServicesHeader);
429728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mServicesHeader = null;
430728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
431728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
432728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (mProcessesHeader != null) {
433728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mAllDetails.removeView(mProcessesHeader);
434728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mProcessesHeader = null;
435728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
436271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
437c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mNumServices = mNumProcesses = 0;
438271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn
4399fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn        if (mMergedItem != null) {
4409fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn            if (mMergedItem.mUser != null) {
4419fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                ArrayList<RunningState.MergedItem> items;
4429fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                if (mShowBackground) {
4439fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                    items = new ArrayList<RunningState.MergedItem>(mMergedItem.mChildren);
4449fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                    Collections.sort(items, mState.mBackgroundComparator);
4459fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                } else {
4469fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                    items = mMergedItem.mChildren;
4479fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                }
4489fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                for (int i=0; i<items.size(); i++) {
4499fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                    addDetailsViews(items.get(i), true, false);
4509fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                }
4519fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                for (int i=0; i<items.size(); i++) {
4529fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                    addDetailsViews(items.get(i), false, true);
4539fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                }
454271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn            } else {
4559fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn                addDetailsViews(mMergedItem, true, true);
456c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            }
457728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
458728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
459728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
460728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    void refreshUi(boolean dataChanged) {
461728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (findMergedItem()) {
462728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            dataChanged = true;
463728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
464728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (dataChanged) {
465728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (mMergedItem != null) {
466728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSnippetActiveItem = mSnippetViewHolder.bind(mState,
467728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        mMergedItem, mBuilder);
468728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            } else if (mSnippetActiveItem != null) {
469728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // Clear whatever is currently being shown.
470728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSnippetActiveItem.mHolder.size.setText("");
471728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSnippetActiveItem.mHolder.uptime.setText("");
472728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSnippetActiveItem.mHolder.description.setText(R.string.no_services);
473728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            } else {
474728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // No merged item, never had one.  Nothing to do.
475728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                finish();
476728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                return;
477728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
478728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            addDetailViews();
479728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
480728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
481728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
482ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    private void finish() {
48325bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn        (new Handler()).post(new Runnable() {
48425bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn            @Override
48525bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn            public void run() {
48625bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn                Activity a = getActivity();
48725bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn                if (a != null) {
48825bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn                    a.onBackPressed();
48925bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn                }
49025bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn            }
49125bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn        });
492ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    }
493ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
494728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
495ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    public void onCreate(Bundle savedInstanceState) {
496728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onCreate(savedInstanceState);
497728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
498271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        mUid = getArguments().getInt(KEY_UID, -1);
499271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        mUserId = getArguments().getInt(KEY_USER_ID, 0);
500271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn        mProcessName = getArguments().getString(KEY_PROCESS, null);
501ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mShowBackground = getArguments().getBoolean(KEY_BACKGROUND, false);
502728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
503ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mAm = (ActivityManager)getActivity().getSystemService(Context.ACTIVITY_SERVICE);
504ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mInflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
505728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
506ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mState = RunningState.getInstance(getActivity());
507ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    }
508ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
509ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    @Override
510ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
511ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        View view = mRootView = inflater.inflate(R.layout.running_service_details, null);
512728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
513ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mAllDetails = (ViewGroup)view.findViewById(R.id.all_details);
514ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mSnippet = (ViewGroup)view.findViewById(R.id.snippet);
515728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mSnippet.setPadding(0, mSnippet.getPaddingTop(), 0, mSnippet.getPaddingBottom());
516728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mSnippetViewHolder = new RunningProcessesView.ViewHolder(mSnippet);
517b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
518b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        // We want to retrieve the data right now, so any active managed
519b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        // dialog that gets created can find it.
520b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        ensureData();
521ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
522ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        return view;
523728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
524728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
525728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
526ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    public void onPause() {
527728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onPause();
528b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        mHaveData = false;
529508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        mState.pause();
530728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
531728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
532728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
533ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    public void onResume() {
534728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onResume();
535b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        ensureData();
536728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
537728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
538b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    ActiveDetail activeDetailForService(ComponentName comp) {
539b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        for (int i=0; i<mActiveDetails.size(); i++) {
540b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            ActiveDetail ad = mActiveDetails.get(i);
541b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            if (ad.mServiceItem != null && ad.mServiceItem.mRunningService != null
542b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                    && comp.equals(ad.mServiceItem.mRunningService.service)) {
543b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                return ad;
544b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            }
545b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        }
546b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        return null;
547b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    }
548b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
549ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    private void showConfirmStopDialog(ComponentName comp) {
550ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        DialogFragment newFragment = MyAlertDialogFragment.newConfirmStop(
551ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                DIALOG_CONFIRM_STOP, comp);
552ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        newFragment.setTargetFragment(this, 0);
553ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        newFragment.show(getFragmentManager(), "confirmstop");
554ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    }
555ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
556ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    public static class MyAlertDialogFragment extends DialogFragment {
557ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
558ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        public static MyAlertDialogFragment newConfirmStop(int id, ComponentName comp) {
559ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            MyAlertDialogFragment frag = new MyAlertDialogFragment();
560ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            Bundle args = new Bundle();
561ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            args.putInt("id", id);
562ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            args.putParcelable("comp", comp);
563ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            frag.setArguments(args);
564ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            return frag;
565ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        }
566ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
567ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        RunningServiceDetails getOwner() {
568ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            return (RunningServiceDetails)getTargetFragment();
569ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        }
570ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
571ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        @Override
572ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        public Dialog onCreateDialog(Bundle savedInstanceState) {
573ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            int id = getArguments().getInt("id");
574ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            switch (id) {
575ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                case DIALOG_CONFIRM_STOP: {
576ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    final ComponentName comp = (ComponentName)getArguments().getParcelable("comp");
577ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    if (getOwner().activeDetailForService(comp) == null) {
578ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                        return null;
579ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    }
580ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
581ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    return new AlertDialog.Builder(getActivity())
582ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            .setTitle(getActivity().getString(R.string.runningservicedetails_stop_dlg_title))
583e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                            .setIconAttribute(android.R.attr.alertDialogIcon)
584ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            .setMessage(getActivity().getString(R.string.runningservicedetails_stop_dlg_text))
585ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            .setPositiveButton(R.string.dlg_ok,
586ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                                    new DialogInterface.OnClickListener() {
587ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                                public void onClick(DialogInterface dialog, int which) {
588ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                                    ActiveDetail ad = getOwner().activeDetailForService(comp);
589ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                                    if (ad != null) {
590ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                                        ad.stopActiveService(true);
591ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                                    }
592b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                                }
593ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            })
594ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            .setNegativeButton(R.string.dlg_cancel, null)
595ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            .create();
596ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                }
597b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            }
598ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            throw new IllegalArgumentException("unknown id " + id);
599b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        }
600b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    }
601b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
602b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    void ensureData() {
603b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        if (!mHaveData) {
604b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            mHaveData = true;
605b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            mState.resume(this);
606b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
607b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            // We want to go away if the service being shown no longer exists,
608b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            // so we need to ensure we have done the initial data retrieval before
609b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            // showing our ui.
610b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            mState.waitForData();
611508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn
612b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            // And since we know we have the data, let's show the UI right away
613b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            // to avoid flicker.
614b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            refreshUi(true);
615b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        }
616b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    }
617b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
618508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn    void updateTimes() {
619508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        if (mSnippetActiveItem != null) {
620ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mSnippetActiveItem.updateTime(getActivity(), mBuilder);
621508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        }
622508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        for (int i=0; i<mActiveDetails.size(); i++) {
623ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mActiveDetails.get(i).mActiveItem.updateTime(getActivity(), mBuilder);
624508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        }
625508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn    }
626508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn
627508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn    @Override
628508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn    public void onRefreshUi(int what) {
6298fda756e698c21f08992b9606dd3791c4755122cAmith Yamasani        if (getActivity() == null) return;
630508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        switch (what) {
631508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn            case REFRESH_TIME:
632508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                updateTimes();
633508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                break;
634508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn            case REFRESH_DATA:
635508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                refreshUi(false);
636508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                updateTimes();
637508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                break;
638508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn            case REFRESH_STRUCTURE:
639508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                refreshUi(true);
640508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                updateTimes();
641508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                break;
642508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        }
643508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn    }
644728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn}
645