RunningServiceDetails.java revision 508fedc4102790dcd7004e4962e2b540967b714b
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;
74d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.app.ApplicationErrorReport;
8728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.app.PendingIntent;
9728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.ActivityNotFoundException;
10728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.ComponentName;
11728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.Context;
12728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.Intent;
13728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.IntentSender;
144d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.content.pm.ApplicationInfo;
15728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.PackageManager;
16728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.ProviderInfo;
17728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.ServiceInfo;
18728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.PackageManager.NameNotFoundException;
19728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.res.Resources;
20728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.os.Bundle;
214d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.os.Debug;
22728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.os.Handler;
23728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.os.HandlerThread;
24728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.os.Looper;
25728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.os.Message;
264d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.os.Process;
274d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.os.SystemClock;
284d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.provider.Settings;
294d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.text.format.DateUtils;
30728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.util.Log;
31728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.view.LayoutInflater;
32728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.view.View;
33728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.view.ViewGroup;
344d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.widget.Button;
35728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.widget.TextView;
36728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
374d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.File;
384d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.FileInputStream;
394d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.FileNotFoundException;
404d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.FileOutputStream;
414d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.IOException;
42728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport java.util.ArrayList;
43728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport java.util.List;
44728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
45508fedc4102790dcd7004e4962e2b540967b714bDianne Hackbornpublic class RunningServiceDetails extends Activity
46508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        implements RunningState.OnRefreshUiListener {
47728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static final String TAG = "RunningServicesDetails";
48728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
49728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static final String KEY_UID = "uid";
50728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static final String KEY_PROCESS = "process";
51728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
52728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    ActivityManager mAm;
53728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    LayoutInflater mInflater;
54728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
55728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    RunningState mState;
56728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
57728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    int mUid;
58728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    String mProcessName;
59728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
60728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    RunningState.MergedItem mMergedItem;
61728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
62728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    ViewGroup mAllDetails;
63728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    ViewGroup mSnippet;
64728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    RunningProcessesView.ActiveItem mSnippetActiveItem;
65728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    RunningProcessesView.ViewHolder mSnippetViewHolder;
66728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
67c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    int mNumServices, mNumProcesses;
68c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
69728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    TextView mServicesHeader;
70728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    TextView mProcessesHeader;
71728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    final ArrayList<ActiveDetail> mActiveDetails = new ArrayList<ActiveDetail>();
72728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
73728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    class ActiveDetail implements View.OnClickListener {
74728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        View mRootView;
754d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        Button mStopButton;
764d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        Button mReportButton;
774d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        RunningState.ServiceItem mServiceItem;
78728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        RunningProcessesView.ActiveItem mActiveItem;
79728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        RunningProcessesView.ViewHolder mViewHolder;
80728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        PendingIntent mManageIntent;
814d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        ComponentName mInstaller;
82728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
83728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        public void onClick(View v) {
844d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn            if (v == mReportButton) {
854d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                ApplicationErrorReport report = new ApplicationErrorReport();
864d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.type = ApplicationErrorReport.TYPE_RUNNING_SERVICE;
874d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.packageName = mServiceItem.mServiceInfo.packageName;
884d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.installerPackageName = mInstaller.getPackageName();
894d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.processName = mServiceItem.mRunningService.process;
904d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.time = System.currentTimeMillis();
914d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.systemApp = (mServiceItem.mServiceInfo.applicationInfo.flags
924d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                        & ApplicationInfo.FLAG_SYSTEM) != 0;
934d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                ApplicationErrorReport.RunningServiceInfo info
944d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                        = new ApplicationErrorReport.RunningServiceInfo();
954d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                if (mActiveItem.mItem.mActiveSince >= 0) {
964d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    info.durationMillis = SystemClock.uptimeMillis()-mActiveItem.mFirstRunTime;
974d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                } else {
984d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    info.durationMillis = -1;
994d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                }
1004d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                ComponentName comp = new ComponentName(mServiceItem.mServiceInfo.packageName,
1014d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                        mServiceItem.mServiceInfo.name);
1024d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                File filename = getFileStreamPath("service_dump.txt");
1034d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                FileOutputStream output = null;
1044d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                try {
1054d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    output = new FileOutputStream(filename);
1064d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    Debug.dumpService("activity", output.getFD(),
1074d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                            new String[] { "-a", "service", comp.flattenToString() });
1084d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                } catch (IOException e) {
1094d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    Log.w(TAG, "Can't dump service: " + comp, e);
1104d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                } finally {
1114d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    if (output != null) try { output.close(); } catch (IOException e) {}
1124d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                }
1134d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                FileInputStream input = null;
1144d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                try {
1154d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    input = new FileInputStream(filename);
1164d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    byte[] buffer = new byte[(int) filename.length()];
1174d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    input.read(buffer);
1184d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    info.serviceDetails = new String(buffer);
1194d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                } catch (IOException e) {
1204d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    Log.w(TAG, "Can't read service dump: " + comp, e);
1214d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                } finally {
1224d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    if (input != null) try { input.close(); } catch (IOException e) {}
1234d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                }
1244d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                filename.delete();
1254d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                Log.i(TAG, "Details: " + info.serviceDetails);
1264d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.runningServiceInfo = info;
1274d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                Intent result = new Intent(Intent.ACTION_APP_ERROR);
1284d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                result.setComponent(mInstaller);
1294d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                result.putExtra(Intent.EXTRA_BUG_REPORT, report);
1304d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                result.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
1314d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                startActivity(result);
1324d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                return;
1334d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn            }
1344d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn
135728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (mManageIntent != null) {
136728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                try {
137728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    startIntentSender(mManageIntent.getIntentSender(), null,
138728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                            Intent.FLAG_ACTIVITY_NEW_TASK
139728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                                    | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET,
140728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                            Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET, 0);
141728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } catch (IntentSender.SendIntentException e) {
142728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    Log.w(TAG, e);
143728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } catch (IllegalArgumentException e) {
144728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    Log.w(TAG, e);
145728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } catch (ActivityNotFoundException e) {
146728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    Log.w(TAG, e);
147728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
148c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            } else if (mActiveItem.mItem instanceof RunningState.ServiceItem) {
149728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                RunningState.ServiceItem si = (RunningState.ServiceItem)mActiveItem.mItem;
150728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                stopService(new Intent().setComponent(si.mRunningService.service));
151728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                if (mMergedItem == null || mMergedItem.mServices.size() <= 1) {
152728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    // If there was only one service, we are finishing it,
153728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    // so no reason for the UI to stick around.
154728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    finish();
155728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } else {
156508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                    mState.updateNow();
157728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
158c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            } else {
159c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                // Heavy-weight process.  We'll do a force-stop on it.
160c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                mAm.forceStopPackage(mActiveItem.mItem.mPackageInfo.packageName);
161c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                finish();
162728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
163728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
164728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
165728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
166728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    StringBuilder mBuilder = new StringBuilder(128);
167728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
168728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    boolean findMergedItem() {
169728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        RunningState.MergedItem item = null;
170728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        ArrayList<RunningState.MergedItem> newItems = mState.getCurrentMergedItems();
171728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (newItems != null) {
172728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            for (int i=0; i<newItems.size(); i++) {
173728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                RunningState.MergedItem mi = newItems.get(i);
174728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                if (mi.mProcess.mUid == mUid
175728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        && mi.mProcess.mProcessName.equals(mProcessName)) {
176728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    item = mi;
177728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    break;
178728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
179728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
180728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
181728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (mMergedItem != item) {
182728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mMergedItem = item;
183728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            return true;
184728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
185728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        return false;
186728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
187728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
188c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    void addServiceDetailsView(RunningState.ServiceItem si, RunningState.MergedItem mi) {
189c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        if (mNumServices == 0) {
190c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mServicesHeader = (TextView)mInflater.inflate(R.layout.separator_label,
191c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    mAllDetails, false);
192c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mServicesHeader.setText(R.string.runningservicedetails_services_title);
193c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mAllDetails.addView(mServicesHeader);
194c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
195c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mNumServices++;
196c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
197c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        RunningState.BaseItem bi = si != null ? si : mi;
198c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
199c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        ActiveDetail detail = new ActiveDetail();
200c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        View root = mInflater.inflate(R.layout.running_service_details_service,
201c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                mAllDetails, false);
202c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mAllDetails.addView(root);
203c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mRootView = root;
2044d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        detail.mServiceItem = si;
205c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mViewHolder = new RunningProcessesView.ViewHolder(root);
206c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mActiveItem = detail.mViewHolder.bind(mState, bi, mBuilder);
207c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
208c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        if (si != null && si.mRunningService.clientLabel != 0) {
209c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            detail.mManageIntent = mAm.getRunningServiceControlPanel(
210c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    si.mRunningService.service);
211c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
212c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
213c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        TextView description = (TextView)root.findViewById(R.id.comp_description);
214c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        if (si != null && si.mServiceInfo.descriptionRes != 0) {
215c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            description.setText(getPackageManager().getText(
216c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    si.mServiceInfo.packageName, si.mServiceInfo.descriptionRes,
217c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    si.mServiceInfo.applicationInfo));
218c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        } else {
219c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            if (detail.mManageIntent != null) {
220c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                try {
221c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    Resources clientr = getPackageManager().getResourcesForApplication(
222c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                            si.mRunningService.clientPackage);
223c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    String label = clientr.getString(si.mRunningService.clientLabel);
224c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    description.setText(getString(R.string.service_manage_description,
225c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                            label));
226c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                } catch (PackageManager.NameNotFoundException e) {
227c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                }
228c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            } else {
229c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                description.setText(getText(si != null
230c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        ? R.string.service_stop_description
231c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        : R.string.heavy_weight_stop_description));
232c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            }
233c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
234c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
2354d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        detail.mStopButton = (Button)root.findViewById(R.id.left_button);
2364d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        detail.mStopButton.setOnClickListener(detail);
2374d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        detail.mStopButton.setText(getText(detail.mManageIntent != null
238c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                ? R.string.service_manage : R.string.service_stop));
2394d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn
2404d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        detail.mReportButton = (Button)root.findViewById(R.id.right_button);
2414d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        detail.mReportButton.setOnClickListener(detail);
2424d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        detail.mReportButton.setText(com.android.internal.R.string.report);
2434d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        // check if error reporting is enabled in secure settings
2444d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        int enabled = Settings.Secure.getInt(getContentResolver(),
2454d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                Settings.Secure.SEND_ACTION_APP_ERROR, 0);
2464d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        if (enabled != 0) {
2474d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn            detail.mInstaller = ApplicationErrorReport.getErrorReportReceiver(
2484d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    this, si.mServiceInfo.packageName, si.mServiceInfo.applicationInfo.flags);
2494d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn            detail.mReportButton.setEnabled(detail.mInstaller != null);
2504d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        } else {
2514d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn            detail.mReportButton.setEnabled(false);
2524d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        }
253c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
254c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mActiveDetails.add(detail);
255c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    }
256c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
257c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    void addProcessDetailsView(RunningState.ProcessItem pi, boolean isMain) {
258c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        if (mNumProcesses == 0) {
259c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mProcessesHeader = (TextView)mInflater.inflate(R.layout.separator_label,
260c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    mAllDetails, false);
261c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mProcessesHeader.setText(R.string.runningservicedetails_processes_title);
262c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mAllDetails.addView(mProcessesHeader);
263c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
264c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mNumProcesses++;
265c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
266c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        ActiveDetail detail = new ActiveDetail();
267c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        View root = mInflater.inflate(R.layout.running_service_details_process,
268c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                mAllDetails, false);
269c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mAllDetails.addView(root);
270c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mRootView = root;
271c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mViewHolder = new RunningProcessesView.ViewHolder(root);
272c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mActiveItem = detail.mViewHolder.bind(mState, pi, mBuilder);
273c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
274c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        TextView description = (TextView)root.findViewById(R.id.comp_description);
275c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        if (isMain) {
276c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            description.setText(R.string.main_running_process_description);
277c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        } else {
278c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            int textid = 0;
279c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            CharSequence label = null;
280c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            ActivityManager.RunningAppProcessInfo rpi = pi.mRunningProcessInfo;
281c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            final ComponentName comp = rpi.importanceReasonComponent;
282c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            //Log.i(TAG, "Secondary proc: code=" + rpi.importanceReasonCode
283c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            //        + " pid=" + rpi.importanceReasonPid + " comp=" + comp);
284c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            switch (rpi.importanceReasonCode) {
285c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                case ActivityManager.RunningAppProcessInfo.REASON_PROVIDER_IN_USE:
286c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    textid = R.string.process_provider_in_use_description;
287c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    List<ProviderInfo> providers = null;
288c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    if (comp != null) {
289c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        providers = getPackageManager()
290c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                                .queryContentProviders(comp.getPackageName(),
291c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                                        rpi.uid, 0);
292c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    }
293c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    if (providers != null) {
294c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        for (int j=0; j<providers.size(); j++) {
295c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                            ProviderInfo prov = providers.get(j);
296c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                            if (comp.getClassName().equals(prov.name)) {
297c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                                label = RunningState.makeLabel(getPackageManager(),
298c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                                        prov.name, prov);
299c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                                break;
300c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                            }
301c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        }
302c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    }
303c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    break;
304c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                case ActivityManager.RunningAppProcessInfo.REASON_SERVICE_IN_USE:
305c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    textid = R.string.process_service_in_use_description;
306c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    if (rpi.importanceReasonComponent != null) {
307c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        try {
308c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                            ServiceInfo serv = getPackageManager().getServiceInfo(
309c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                                    rpi.importanceReasonComponent, 0);
310c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                            label = RunningState.makeLabel(getPackageManager(),
311c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                                    serv.name, serv);
312c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        } catch (NameNotFoundException e) {
313c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        }
314c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    }
315c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    break;
316c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            }
317c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            if (textid != 0 && label != null) {
318c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                description.setText(getString(textid, label));
319c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            }
320c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
321c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
322c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mActiveDetails.add(detail);
323c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    }
324c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
325728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    void addDetailViews() {
326728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        for (int i=mActiveDetails.size()-1; i>=0; i--) {
327728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mAllDetails.removeView(mActiveDetails.get(i).mRootView);
328728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
329728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mActiveDetails.clear();
330728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
331728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (mServicesHeader != null) {
332728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mAllDetails.removeView(mServicesHeader);
333728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mServicesHeader = null;
334728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
335728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
336728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (mProcessesHeader != null) {
337728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mAllDetails.removeView(mProcessesHeader);
338728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mProcessesHeader = null;
339728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
340728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
341c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mNumServices = mNumProcesses = 0;
342c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
343728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (mMergedItem != null) {
344728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            for (int i=0; i<mMergedItem.mServices.size(); i++) {
345c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                addServiceDetailsView(mMergedItem.mServices.get(i), mMergedItem);
346c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            }
347c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
348c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            if (mMergedItem.mServices.size() <= 0) {
349c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                // This item does not have any services, so it must be
350c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                // a heavy-weight process...  we will put a fake service
351c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                // entry for it, to allow the user to "stop" it.
352c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                addServiceDetailsView(null, mMergedItem);
353728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
354728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
355728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            for (int i=-1; i<mMergedItem.mOtherProcesses.size(); i++) {
356728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                RunningState.ProcessItem pi = i < 0 ? mMergedItem.mProcess
357728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        : mMergedItem.mOtherProcesses.get(i);
358728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                if (pi.mPid <= 0) {
359728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    continue;
360728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
361728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
362c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                addProcessDetailsView(pi, i < 0);
363728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
364728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
365728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
366728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
367728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    void refreshUi(boolean dataChanged) {
368728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (findMergedItem()) {
369728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            dataChanged = true;
370728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
371728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (dataChanged) {
372728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (mMergedItem != null) {
373728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSnippetActiveItem = mSnippetViewHolder.bind(mState,
374728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        mMergedItem, mBuilder);
375728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            } else if (mSnippetActiveItem != null) {
376728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // Clear whatever is currently being shown.
377728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSnippetActiveItem.mHolder.size.setText("");
378728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSnippetActiveItem.mHolder.uptime.setText("");
379728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSnippetActiveItem.mHolder.description.setText(R.string.no_services);
380728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            } else {
381728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // No merged item, never had one.  Nothing to do.
382728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                finish();
383728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                return;
384728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
385728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            addDetailViews();
386728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
387728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
388728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
389728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
390728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    protected void onCreate(Bundle savedInstanceState) {
391728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onCreate(savedInstanceState);
392728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
393728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mUid = getIntent().getIntExtra(KEY_UID, 0);
394728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mProcessName = getIntent().getStringExtra(KEY_PROCESS);
395728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
396728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mAm = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
397728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
398728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
399508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        mState = RunningState.getInstance(this);
400728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
401728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        setContentView(R.layout.running_service_details);
402728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
403728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mAllDetails = (ViewGroup)findViewById(R.id.all_details);
404728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mSnippet = (ViewGroup)findViewById(R.id.snippet);
405728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mSnippet.setBackgroundResource(com.android.internal.R.drawable.title_bar_medium);
406728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mSnippet.setPadding(0, mSnippet.getPaddingTop(), 0, mSnippet.getPaddingBottom());
407728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mSnippetViewHolder = new RunningProcessesView.ViewHolder(mSnippet);
408728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
409728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
410728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
411728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    protected void onPause() {
412728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onPause();
413508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        mState.pause();
414728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
415728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
416728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
417728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    protected void onResume() {
418728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onResume();
419508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        mState.resume(this);
420728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
421508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        // We want to go away if the service being shown no longer exists,
422508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        // so we need to ensure we have done the initial data retrieval before
423508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        // showing our ui.
424508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        mState.waitForData();
425508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn
426508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        // And since we know we have the data, let's show the UI right away
427508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        // to avoid flicker.
428508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        refreshUi(true);
429728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
430728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
431728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
432728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    protected void onSaveInstanceState(Bundle outState) {
433728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onSaveInstanceState(outState);
434728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
435508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn
436508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn    void updateTimes() {
437508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        if (mSnippetActiveItem != null) {
438508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn            mSnippetActiveItem.updateTime(RunningServiceDetails.this, mBuilder);
439508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        }
440508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        for (int i=0; i<mActiveDetails.size(); i++) {
441508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn            mActiveDetails.get(i).mActiveItem.updateTime(
442508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                    RunningServiceDetails.this, mBuilder);
443508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        }
444508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn    }
445508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn
446508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn    @Override
447508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn    public void onRefreshUi(int what) {
448508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        switch (what) {
449508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn            case REFRESH_TIME:
450508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                updateTimes();
451508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                break;
452508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn            case REFRESH_DATA:
453508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                refreshUi(false);
454508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                updateTimes();
455508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                break;
456508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn            case REFRESH_STRUCTURE:
457508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                refreshUi(true);
458508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                updateTimes();
459508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                break;
460508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        }
461508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn    }
462728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn}
463