RunningServiceDetails.java revision b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3b
1728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornpackage com.android.settings.applications;
2728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
3728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport com.android.settings.R;
4728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
5728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.app.Activity;
6728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.app.ActivityManager;
7b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackbornimport android.app.AlertDialog;
84d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.app.ApplicationErrorReport;
9b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackbornimport android.app.Dialog;
10728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.app.PendingIntent;
11728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.ActivityNotFoundException;
12728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.ComponentName;
13728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.Context;
14b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackbornimport android.content.DialogInterface;
15728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.Intent;
16728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.IntentSender;
174d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.content.pm.ApplicationInfo;
18728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.PackageManager;
19728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.ProviderInfo;
20728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.ServiceInfo;
21728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.PackageManager.NameNotFoundException;
22728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.res.Resources;
23728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.os.Bundle;
244d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.os.Debug;
254d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.os.SystemClock;
264d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.provider.Settings;
27728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.util.Log;
28728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.view.LayoutInflater;
29728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.view.View;
30728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.view.ViewGroup;
314d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.widget.Button;
32728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.widget.TextView;
33728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
344d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.File;
354d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.FileInputStream;
364d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.FileOutputStream;
374d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.IOException;
38728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport java.util.ArrayList;
39728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
40508fedc4102790dcd7004e4962e2b540967b714bDianne Hackbornpublic class RunningServiceDetails extends Activity
41508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        implements RunningState.OnRefreshUiListener {
42728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static final String TAG = "RunningServicesDetails";
43728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
44728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static final String KEY_UID = "uid";
45728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static final String KEY_PROCESS = "process";
46728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
47b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    static final int DIALOG_CONFIRM_STOP = 1;
48b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
49728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    ActivityManager mAm;
50728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    LayoutInflater mInflater;
51728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
52728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    RunningState mState;
53b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    boolean mHaveData;
54728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
55728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    int mUid;
56728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    String mProcessName;
57728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
58728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    RunningState.MergedItem mMergedItem;
59728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
60728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    ViewGroup mAllDetails;
61728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    ViewGroup mSnippet;
62728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    RunningProcessesView.ActiveItem mSnippetActiveItem;
63728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    RunningProcessesView.ViewHolder mSnippetViewHolder;
64728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
65c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    int mNumServices, mNumProcesses;
66c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
67728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    TextView mServicesHeader;
68728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    TextView mProcessesHeader;
69728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    final ArrayList<ActiveDetail> mActiveDetails = new ArrayList<ActiveDetail>();
70728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
71728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    class ActiveDetail implements View.OnClickListener {
72728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        View mRootView;
734d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        Button mStopButton;
744d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        Button mReportButton;
754d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        RunningState.ServiceItem mServiceItem;
76728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        RunningProcessesView.ActiveItem mActiveItem;
77728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        RunningProcessesView.ViewHolder mViewHolder;
78728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        PendingIntent mManageIntent;
794d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        ComponentName mInstaller;
80728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
81b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        void stopActiveService(boolean confirmed) {
82b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            RunningState.ServiceItem si = mServiceItem;
83b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            if (!confirmed) {
84b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                if ((si.mServiceInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) != 0) {
85b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                    Bundle args = new Bundle();
86b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                    args.putParcelable("comp", si.mRunningService.service);
87b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                    removeDialog(DIALOG_CONFIRM_STOP);
88b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                    showDialog(DIALOG_CONFIRM_STOP, args);
89b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                    return;
90b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                }
91b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            }
92b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            stopService(new Intent().setComponent(si.mRunningService.service));
93b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            if (mMergedItem == null || mMergedItem.mServices.size() <= 1) {
94b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                // If there was only one service, we are finishing it,
95b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                // so no reason for the UI to stick around.
96b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                finish();
97b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            } else {
98b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                mState.updateNow();
99b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            }
100b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        }
101b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
102728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        public void onClick(View v) {
1034d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn            if (v == mReportButton) {
1044d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                ApplicationErrorReport report = new ApplicationErrorReport();
1054d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.type = ApplicationErrorReport.TYPE_RUNNING_SERVICE;
1064d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.packageName = mServiceItem.mServiceInfo.packageName;
1074d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.installerPackageName = mInstaller.getPackageName();
1084d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.processName = mServiceItem.mRunningService.process;
1094d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.time = System.currentTimeMillis();
1104d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.systemApp = (mServiceItem.mServiceInfo.applicationInfo.flags
1114d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                        & ApplicationInfo.FLAG_SYSTEM) != 0;
1124d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                ApplicationErrorReport.RunningServiceInfo info
1134d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                        = new ApplicationErrorReport.RunningServiceInfo();
114be5994d20152c7194aac79eb8152240655fd3373Dianne Hackborn                if (mActiveItem.mFirstRunTime >= 0) {
115be5994d20152c7194aac79eb8152240655fd3373Dianne Hackborn                    info.durationMillis = SystemClock.elapsedRealtime()-mActiveItem.mFirstRunTime;
1164d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                } else {
1174d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    info.durationMillis = -1;
1184d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                }
1194d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                ComponentName comp = new ComponentName(mServiceItem.mServiceInfo.packageName,
1204d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                        mServiceItem.mServiceInfo.name);
1214d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                File filename = getFileStreamPath("service_dump.txt");
1224d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                FileOutputStream output = null;
1234d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                try {
1244d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    output = new FileOutputStream(filename);
1254d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    Debug.dumpService("activity", output.getFD(),
1264d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                            new String[] { "-a", "service", comp.flattenToString() });
1274d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                } catch (IOException e) {
1284d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    Log.w(TAG, "Can't dump service: " + comp, e);
1294d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                } finally {
1304d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    if (output != null) try { output.close(); } catch (IOException e) {}
1314d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                }
1324d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                FileInputStream input = null;
1334d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                try {
1344d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    input = new FileInputStream(filename);
1354d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    byte[] buffer = new byte[(int) filename.length()];
1364d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    input.read(buffer);
1374d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    info.serviceDetails = new String(buffer);
1384d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                } catch (IOException e) {
1394d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    Log.w(TAG, "Can't read service dump: " + comp, e);
1404d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                } finally {
1414d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    if (input != null) try { input.close(); } catch (IOException e) {}
1424d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                }
1434d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                filename.delete();
1444d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                Log.i(TAG, "Details: " + info.serviceDetails);
1454d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.runningServiceInfo = info;
1464d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                Intent result = new Intent(Intent.ACTION_APP_ERROR);
1474d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                result.setComponent(mInstaller);
1484d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                result.putExtra(Intent.EXTRA_BUG_REPORT, report);
1494d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                result.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
1504d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                startActivity(result);
1514d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                return;
1524d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn            }
1534d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn
154728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (mManageIntent != null) {
155728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                try {
156728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    startIntentSender(mManageIntent.getIntentSender(), null,
157728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                            Intent.FLAG_ACTIVITY_NEW_TASK
158728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                                    | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET,
159728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                            Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET, 0);
160728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } catch (IntentSender.SendIntentException e) {
161728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    Log.w(TAG, e);
162728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } catch (IllegalArgumentException e) {
163728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    Log.w(TAG, e);
164728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } catch (ActivityNotFoundException e) {
165728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    Log.w(TAG, e);
166728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
167b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            } else if (mServiceItem != null) {
168b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                stopActiveService(false);
169c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            } else {
170c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                // Heavy-weight process.  We'll do a force-stop on it.
171c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                mAm.forceStopPackage(mActiveItem.mItem.mPackageInfo.packageName);
172c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                finish();
173728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
174728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
175728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
176728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
177728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    StringBuilder mBuilder = new StringBuilder(128);
178728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
179728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    boolean findMergedItem() {
180728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        RunningState.MergedItem item = null;
181728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        ArrayList<RunningState.MergedItem> newItems = mState.getCurrentMergedItems();
182728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (newItems != null) {
183728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            for (int i=0; i<newItems.size(); i++) {
184728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                RunningState.MergedItem mi = newItems.get(i);
185728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                if (mi.mProcess.mUid == mUid
186728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        && mi.mProcess.mProcessName.equals(mProcessName)) {
187728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    item = mi;
188728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    break;
189728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
190728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
191728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
192728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (mMergedItem != item) {
193728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mMergedItem = item;
194728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            return true;
195728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
196728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        return false;
197728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
198728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
199c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    void addServiceDetailsView(RunningState.ServiceItem si, RunningState.MergedItem mi) {
200c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        if (mNumServices == 0) {
201c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mServicesHeader = (TextView)mInflater.inflate(R.layout.separator_label,
202c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    mAllDetails, false);
203c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mServicesHeader.setText(R.string.runningservicedetails_services_title);
204c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mAllDetails.addView(mServicesHeader);
205c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
206c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mNumServices++;
207c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
208c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        RunningState.BaseItem bi = si != null ? si : mi;
209c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
210c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        ActiveDetail detail = new ActiveDetail();
211c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        View root = mInflater.inflate(R.layout.running_service_details_service,
212c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                mAllDetails, false);
213c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mAllDetails.addView(root);
214c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mRootView = root;
2154d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        detail.mServiceItem = si;
216c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mViewHolder = new RunningProcessesView.ViewHolder(root);
217c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mActiveItem = detail.mViewHolder.bind(mState, bi, mBuilder);
218c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
219c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        if (si != null && si.mRunningService.clientLabel != 0) {
220c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            detail.mManageIntent = mAm.getRunningServiceControlPanel(
221c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    si.mRunningService.service);
222c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
223c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
224c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        TextView description = (TextView)root.findViewById(R.id.comp_description);
225c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        if (si != null && si.mServiceInfo.descriptionRes != 0) {
226c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            description.setText(getPackageManager().getText(
227c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    si.mServiceInfo.packageName, si.mServiceInfo.descriptionRes,
228c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    si.mServiceInfo.applicationInfo));
229c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        } else {
230c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            if (detail.mManageIntent != null) {
231c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                try {
232c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    Resources clientr = getPackageManager().getResourcesForApplication(
233c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                            si.mRunningService.clientPackage);
234c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    String label = clientr.getString(si.mRunningService.clientLabel);
235c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    description.setText(getString(R.string.service_manage_description,
236c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                            label));
237c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                } catch (PackageManager.NameNotFoundException e) {
238c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                }
239c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            } else {
240c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                description.setText(getText(si != null
241c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        ? R.string.service_stop_description
242c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        : R.string.heavy_weight_stop_description));
243c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            }
244c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
245c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
2464d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        detail.mStopButton = (Button)root.findViewById(R.id.left_button);
2474d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        detail.mStopButton.setOnClickListener(detail);
2484d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        detail.mStopButton.setText(getText(detail.mManageIntent != null
249c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                ? R.string.service_manage : R.string.service_stop));
2504d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn
2514d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        detail.mReportButton = (Button)root.findViewById(R.id.right_button);
2524d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        detail.mReportButton.setOnClickListener(detail);
2534d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        detail.mReportButton.setText(com.android.internal.R.string.report);
2544d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        // check if error reporting is enabled in secure settings
2554d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        int enabled = Settings.Secure.getInt(getContentResolver(),
2564d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                Settings.Secure.SEND_ACTION_APP_ERROR, 0);
2574d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        if (enabled != 0) {
2584d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn            detail.mInstaller = ApplicationErrorReport.getErrorReportReceiver(
2594d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    this, si.mServiceInfo.packageName, si.mServiceInfo.applicationInfo.flags);
2604d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn            detail.mReportButton.setEnabled(detail.mInstaller != null);
2614d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        } else {
2624d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn            detail.mReportButton.setEnabled(false);
2634d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        }
264c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
265c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mActiveDetails.add(detail);
266c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    }
267c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
268c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    void addProcessDetailsView(RunningState.ProcessItem pi, boolean isMain) {
269c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        if (mNumProcesses == 0) {
270c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mProcessesHeader = (TextView)mInflater.inflate(R.layout.separator_label,
271c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    mAllDetails, false);
272c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mProcessesHeader.setText(R.string.runningservicedetails_processes_title);
273c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mAllDetails.addView(mProcessesHeader);
274c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
275c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mNumProcesses++;
276c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
277c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        ActiveDetail detail = new ActiveDetail();
278c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        View root = mInflater.inflate(R.layout.running_service_details_process,
279c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                mAllDetails, false);
280c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mAllDetails.addView(root);
281c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mRootView = root;
282c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mViewHolder = new RunningProcessesView.ViewHolder(root);
283c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mActiveItem = detail.mViewHolder.bind(mState, pi, mBuilder);
284c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
285c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        TextView description = (TextView)root.findViewById(R.id.comp_description);
286c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        if (isMain) {
287c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            description.setText(R.string.main_running_process_description);
288c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        } else {
289c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            int textid = 0;
290c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            CharSequence label = null;
291c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            ActivityManager.RunningAppProcessInfo rpi = pi.mRunningProcessInfo;
292c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            final ComponentName comp = rpi.importanceReasonComponent;
293c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            //Log.i(TAG, "Secondary proc: code=" + rpi.importanceReasonCode
294c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            //        + " pid=" + rpi.importanceReasonPid + " comp=" + comp);
295c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            switch (rpi.importanceReasonCode) {
296c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                case ActivityManager.RunningAppProcessInfo.REASON_PROVIDER_IN_USE:
297c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    textid = R.string.process_provider_in_use_description;
2985774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn                    if (rpi.importanceReasonComponent != null) {
2995774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn                        try {
3005774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn                            ProviderInfo prov = getPackageManager().getProviderInfo(
3015774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn                                    rpi.importanceReasonComponent, 0);
3025774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn                            label = RunningState.makeLabel(getPackageManager(),
3035774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn                                    prov.name, prov);
3045774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn                        } catch (NameNotFoundException e) {
305c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        }
306c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    }
307c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    break;
308c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                case ActivityManager.RunningAppProcessInfo.REASON_SERVICE_IN_USE:
309c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    textid = R.string.process_service_in_use_description;
310c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    if (rpi.importanceReasonComponent != null) {
311c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        try {
312c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                            ServiceInfo serv = getPackageManager().getServiceInfo(
313c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                                    rpi.importanceReasonComponent, 0);
314c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                            label = RunningState.makeLabel(getPackageManager(),
315c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                                    serv.name, serv);
316c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        } catch (NameNotFoundException e) {
317c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        }
318c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    }
319c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    break;
320c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            }
321c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            if (textid != 0 && label != null) {
322c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                description.setText(getString(textid, label));
323c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            }
324c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
325c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
326c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mActiveDetails.add(detail);
327c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    }
328c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
329728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    void addDetailViews() {
330728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        for (int i=mActiveDetails.size()-1; i>=0; i--) {
331728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mAllDetails.removeView(mActiveDetails.get(i).mRootView);
332728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
333728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mActiveDetails.clear();
334728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
335728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (mServicesHeader != null) {
336728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mAllDetails.removeView(mServicesHeader);
337728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mServicesHeader = null;
338728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
339728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
340728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (mProcessesHeader != null) {
341728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mAllDetails.removeView(mProcessesHeader);
342728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mProcessesHeader = null;
343728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
344728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
345c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mNumServices = mNumProcesses = 0;
346c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
347728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (mMergedItem != null) {
348728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            for (int i=0; i<mMergedItem.mServices.size(); i++) {
349c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                addServiceDetailsView(mMergedItem.mServices.get(i), mMergedItem);
350c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            }
351c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
352c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            if (mMergedItem.mServices.size() <= 0) {
353c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                // This item does not have any services, so it must be
354c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                // a heavy-weight process...  we will put a fake service
355c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                // entry for it, to allow the user to "stop" it.
356c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                addServiceDetailsView(null, mMergedItem);
357728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
358728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
359728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            for (int i=-1; i<mMergedItem.mOtherProcesses.size(); i++) {
360728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                RunningState.ProcessItem pi = i < 0 ? mMergedItem.mProcess
361728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        : mMergedItem.mOtherProcesses.get(i);
362728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                if (pi.mPid <= 0) {
363728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    continue;
364728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
365728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
366c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                addProcessDetailsView(pi, i < 0);
367728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
368728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
369728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
370728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
371728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    void refreshUi(boolean dataChanged) {
372728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (findMergedItem()) {
373728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            dataChanged = true;
374728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
375728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (dataChanged) {
376728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (mMergedItem != null) {
377728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSnippetActiveItem = mSnippetViewHolder.bind(mState,
378728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        mMergedItem, mBuilder);
379728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            } else if (mSnippetActiveItem != null) {
380728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // Clear whatever is currently being shown.
381728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSnippetActiveItem.mHolder.size.setText("");
382728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSnippetActiveItem.mHolder.uptime.setText("");
383728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSnippetActiveItem.mHolder.description.setText(R.string.no_services);
384728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            } else {
385728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // No merged item, never had one.  Nothing to do.
386728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                finish();
387728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                return;
388728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
389728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            addDetailViews();
390728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
391728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
392728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
393728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
394728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    protected void onCreate(Bundle savedInstanceState) {
395728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onCreate(savedInstanceState);
396728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
397728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mUid = getIntent().getIntExtra(KEY_UID, 0);
398728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mProcessName = getIntent().getStringExtra(KEY_PROCESS);
399728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
400728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mAm = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
401728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
402728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
403508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        mState = RunningState.getInstance(this);
404728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
405728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        setContentView(R.layout.running_service_details);
406728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
407728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mAllDetails = (ViewGroup)findViewById(R.id.all_details);
408728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mSnippet = (ViewGroup)findViewById(R.id.snippet);
409728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mSnippet.setBackgroundResource(com.android.internal.R.drawable.title_bar_medium);
410728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mSnippet.setPadding(0, mSnippet.getPaddingTop(), 0, mSnippet.getPaddingBottom());
411728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mSnippetViewHolder = new RunningProcessesView.ViewHolder(mSnippet);
412b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
413b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        // We want to retrieve the data right now, so any active managed
414b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        // dialog that gets created can find it.
415b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        ensureData();
416728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
417728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
418728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
419728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    protected void onPause() {
420728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onPause();
421b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        mHaveData = false;
422508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        mState.pause();
423728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
424728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
425728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
426728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    protected void onResume() {
427728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onResume();
428b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        ensureData();
429728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
430728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
431728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
432728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    protected void onSaveInstanceState(Bundle outState) {
433728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onSaveInstanceState(outState);
434728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
435b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
436b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    ActiveDetail activeDetailForService(ComponentName comp) {
437b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        for (int i=0; i<mActiveDetails.size(); i++) {
438b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            ActiveDetail ad = mActiveDetails.get(i);
439b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            if (ad.mServiceItem != null && ad.mServiceItem.mRunningService != null
440b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                    && comp.equals(ad.mServiceItem.mRunningService.service)) {
441b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                return ad;
442b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            }
443b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        }
444b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        return null;
445b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    }
446b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
447b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    @Override
448b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    protected Dialog onCreateDialog(int id, Bundle args) {
449b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        switch (id) {
450b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            case DIALOG_CONFIRM_STOP: {
451b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                final ComponentName comp = (ComponentName)args.getParcelable("comp");
452b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                if (activeDetailForService(comp) == null) {
453b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                    return null;
454b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                }
455b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
456b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                return new AlertDialog.Builder(this)
457b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                        .setTitle(getString(R.string.runningservicedetails_stop_dlg_title))
458b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                        .setIcon(android.R.drawable.ic_dialog_alert)
459b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                        .setMessage(getString(R.string.runningservicedetails_stop_dlg_text))
460b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                        .setPositiveButton(R.string.dlg_ok,
461b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                                new DialogInterface.OnClickListener() {
462b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                            public void onClick(DialogInterface dialog, int which) {
463b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                                ActiveDetail ad = activeDetailForService(comp);
464b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                                if (ad != null) {
465b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                                    ad.stopActiveService(true);
466b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                                }
467b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                            }
468b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                        })
469b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                        .setNegativeButton(R.string.dlg_cancel, null)
470b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                        .create();
471b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            }
472b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
473b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            default:
474b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                return super.onCreateDialog(id, args);
475b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        }
476b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    }
477b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
478b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    void ensureData() {
479b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        if (!mHaveData) {
480b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            mHaveData = true;
481b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            mState.resume(this);
482b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
483b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            // We want to go away if the service being shown no longer exists,
484b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            // so we need to ensure we have done the initial data retrieval before
485b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            // showing our ui.
486b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            mState.waitForData();
487508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn
488b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            // And since we know we have the data, let's show the UI right away
489b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            // to avoid flicker.
490b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            refreshUi(true);
491b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        }
492b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    }
493b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
494508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn    void updateTimes() {
495508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        if (mSnippetActiveItem != null) {
496508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn            mSnippetActiveItem.updateTime(RunningServiceDetails.this, mBuilder);
497508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        }
498508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        for (int i=0; i<mActiveDetails.size(); i++) {
499508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn            mActiveDetails.get(i).mActiveItem.updateTime(
500508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                    RunningServiceDetails.this, mBuilder);
501508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        }
502508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn    }
503508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn
504508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn    @Override
505508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn    public void onRefreshUi(int what) {
506508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        switch (what) {
507508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn            case REFRESH_TIME:
508508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                updateTimes();
509508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                break;
510508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn            case REFRESH_DATA:
511508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                refreshUi(false);
512508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                updateTimes();
513508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                break;
514508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn            case REFRESH_STRUCTURE:
515508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                refreshUi(true);
516508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                updateTimes();
517508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                break;
518508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        }
519508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn    }
520728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn}
521