1728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornpackage com.android.settings.applications;
2728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
3728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport com.android.settings.R;
4728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
525bda17a57321c8cf599673248d2e35d692ad51eDianne Hackbornimport android.app.Activity;
6728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.app.ActivityManager;
7b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackbornimport android.app.AlertDialog;
84d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.app.ApplicationErrorReport;
9b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackbornimport android.app.Dialog;
10ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornimport android.app.DialogFragment;
11ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornimport android.app.Fragment;
12728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.app.PendingIntent;
13728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.ActivityNotFoundException;
14728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.ComponentName;
15728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.Context;
16b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackbornimport android.content.DialogInterface;
17728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.Intent;
18728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.IntentSender;
194d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.content.pm.ApplicationInfo;
20728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.PackageManager;
21728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.ProviderInfo;
22728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.ServiceInfo;
23728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.PackageManager.NameNotFoundException;
24728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.res.Resources;
25728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.os.Bundle;
264d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.os.Debug;
2725bda17a57321c8cf599673248d2e35d692ad51eDianne Hackbornimport android.os.Handler;
284d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.os.SystemClock;
294d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.provider.Settings;
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.FileOutputStream;
404d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.IOException;
41728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport java.util.ArrayList;
42728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
43ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornpublic class RunningServiceDetails extends Fragment
44508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        implements RunningState.OnRefreshUiListener {
45728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static final String TAG = "RunningServicesDetails";
46728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
47728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static final String KEY_UID = "uid";
48728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static final String KEY_PROCESS = "process";
491337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn    static final String KEY_BACKGROUND = "background";
50728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
51b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    static final int DIALOG_CONFIRM_STOP = 1;
52b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
53728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    ActivityManager mAm;
54728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    LayoutInflater mInflater;
55728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
56728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    RunningState mState;
57b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    boolean mHaveData;
58728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
59728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    int mUid;
60728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    String mProcessName;
611337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn    boolean mShowBackground;
62728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
63728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    RunningState.MergedItem mMergedItem;
64728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
65ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    View mRootView;
66728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    ViewGroup mAllDetails;
67728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    ViewGroup mSnippet;
68728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    RunningProcessesView.ActiveItem mSnippetActiveItem;
69728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    RunningProcessesView.ViewHolder mSnippetViewHolder;
70728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
71c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    int mNumServices, mNumProcesses;
72c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
73728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    TextView mServicesHeader;
74728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    TextView mProcessesHeader;
75728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    final ArrayList<ActiveDetail> mActiveDetails = new ArrayList<ActiveDetail>();
76728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
77728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    class ActiveDetail implements View.OnClickListener {
78728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        View mRootView;
794d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        Button mStopButton;
804d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        Button mReportButton;
814d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        RunningState.ServiceItem mServiceItem;
82728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        RunningProcessesView.ActiveItem mActiveItem;
83728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        RunningProcessesView.ViewHolder mViewHolder;
84728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        PendingIntent mManageIntent;
854d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        ComponentName mInstaller;
86728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
87b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        void stopActiveService(boolean confirmed) {
88b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            RunningState.ServiceItem si = mServiceItem;
89b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            if (!confirmed) {
90b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                if ((si.mServiceInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) != 0) {
91ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    showConfirmStopDialog(si.mRunningService.service);
92b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                    return;
93b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                }
94b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            }
95ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            getActivity().stopService(new Intent().setComponent(si.mRunningService.service));
961337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn            if (mMergedItem == null) {
971337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                // If this is gone, we are gone.
981337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                mState.updateNow();
991337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                finish();
1001337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn            } else if (!mShowBackground && mMergedItem.mServices.size() <= 1) {
101b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                // If there was only one service, we are finishing it,
102b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                // so no reason for the UI to stick around.
1031337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                mState.updateNow();
104b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                finish();
105b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            } else {
106b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                mState.updateNow();
107b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            }
108b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        }
109b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
110728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        public void onClick(View v) {
1114d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn            if (v == mReportButton) {
1124d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                ApplicationErrorReport report = new ApplicationErrorReport();
1134d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.type = ApplicationErrorReport.TYPE_RUNNING_SERVICE;
1144d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.packageName = mServiceItem.mServiceInfo.packageName;
1154d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.installerPackageName = mInstaller.getPackageName();
1164d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.processName = mServiceItem.mRunningService.process;
1174d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.time = System.currentTimeMillis();
1184d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.systemApp = (mServiceItem.mServiceInfo.applicationInfo.flags
1194d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                        & ApplicationInfo.FLAG_SYSTEM) != 0;
1204d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                ApplicationErrorReport.RunningServiceInfo info
1214d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                        = new ApplicationErrorReport.RunningServiceInfo();
122be5994d20152c7194aac79eb8152240655fd3373Dianne Hackborn                if (mActiveItem.mFirstRunTime >= 0) {
123be5994d20152c7194aac79eb8152240655fd3373Dianne Hackborn                    info.durationMillis = SystemClock.elapsedRealtime()-mActiveItem.mFirstRunTime;
1244d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                } else {
1254d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    info.durationMillis = -1;
1264d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                }
1274d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                ComponentName comp = new ComponentName(mServiceItem.mServiceInfo.packageName,
1284d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                        mServiceItem.mServiceInfo.name);
129ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                File filename = getActivity().getFileStreamPath("service_dump.txt");
1304d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                FileOutputStream output = null;
1314d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                try {
1324d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    output = new FileOutputStream(filename);
1334d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    Debug.dumpService("activity", output.getFD(),
1344d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                            new String[] { "-a", "service", comp.flattenToString() });
1354d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                } catch (IOException e) {
1364d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    Log.w(TAG, "Can't dump service: " + comp, e);
1374d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                } finally {
1384d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    if (output != null) try { output.close(); } catch (IOException e) {}
1394d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                }
1404d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                FileInputStream input = null;
1414d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                try {
1424d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    input = new FileInputStream(filename);
1434d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    byte[] buffer = new byte[(int) filename.length()];
1444d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    input.read(buffer);
1454d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    info.serviceDetails = new String(buffer);
1464d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                } catch (IOException e) {
1474d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    Log.w(TAG, "Can't read service dump: " + comp, e);
1484d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                } finally {
1494d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                    if (input != null) try { input.close(); } catch (IOException e) {}
1504d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                }
1514d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                filename.delete();
1524d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                Log.i(TAG, "Details: " + info.serviceDetails);
1534d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                report.runningServiceInfo = info;
1544d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                Intent result = new Intent(Intent.ACTION_APP_ERROR);
1554d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                result.setComponent(mInstaller);
1564d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                result.putExtra(Intent.EXTRA_BUG_REPORT, report);
1574d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                result.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
1584d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                startActivity(result);
1594d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                return;
1604d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn            }
1614d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn
162728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (mManageIntent != null) {
163728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                try {
164ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    getActivity().startIntentSender(mManageIntent.getIntentSender(), null,
165728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                            Intent.FLAG_ACTIVITY_NEW_TASK
166728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                                    | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET,
167728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                            Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET, 0);
168728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } catch (IntentSender.SendIntentException e) {
169728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    Log.w(TAG, e);
170728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } catch (IllegalArgumentException e) {
171728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    Log.w(TAG, e);
172728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } catch (ActivityNotFoundException e) {
173728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    Log.w(TAG, e);
174728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
175b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            } else if (mServiceItem != null) {
176b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                stopActiveService(false);
1771337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn            } else if (mActiveItem.mItem.mBackground) {
1781337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                // Background process.  Just kill it.
1791337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                mAm.killBackgroundProcesses(mActiveItem.mItem.mPackageInfo.packageName);
1801337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                finish();
181c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            } else {
182c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                // Heavy-weight process.  We'll do a force-stop on it.
183c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                mAm.forceStopPackage(mActiveItem.mItem.mPackageInfo.packageName);
184c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                finish();
185728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
186728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
187728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
188728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
189728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    StringBuilder mBuilder = new StringBuilder(128);
190728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
191728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    boolean findMergedItem() {
192728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        RunningState.MergedItem item = null;
1931337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        ArrayList<RunningState.MergedItem> newItems = mShowBackground
1941337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                ? mState.getCurrentBackgroundItems() : mState.getCurrentMergedItems();
195728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (newItems != null) {
196728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            for (int i=0; i<newItems.size(); i++) {
197728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                RunningState.MergedItem mi = newItems.get(i);
198728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                if (mi.mProcess.mUid == mUid
199728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        && mi.mProcess.mProcessName.equals(mProcessName)) {
200728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    item = mi;
201728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    break;
202728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
203728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
204728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
2051337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn
206728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (mMergedItem != item) {
207728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mMergedItem = item;
208728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            return true;
209728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
210728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        return false;
211728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
212728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
213c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    void addServiceDetailsView(RunningState.ServiceItem si, RunningState.MergedItem mi) {
214c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        if (mNumServices == 0) {
215c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mServicesHeader = (TextView)mInflater.inflate(R.layout.separator_label,
216c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    mAllDetails, false);
217c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mServicesHeader.setText(R.string.runningservicedetails_services_title);
218c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mAllDetails.addView(mServicesHeader);
219c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
220c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mNumServices++;
221c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
222c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        RunningState.BaseItem bi = si != null ? si : mi;
223c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
224c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        ActiveDetail detail = new ActiveDetail();
225c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        View root = mInflater.inflate(R.layout.running_service_details_service,
226c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                mAllDetails, false);
227c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mAllDetails.addView(root);
228c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mRootView = root;
2294d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        detail.mServiceItem = si;
230c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mViewHolder = new RunningProcessesView.ViewHolder(root);
231c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mActiveItem = detail.mViewHolder.bind(mState, bi, mBuilder);
232c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
233c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        if (si != null && si.mRunningService.clientLabel != 0) {
234c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            detail.mManageIntent = mAm.getRunningServiceControlPanel(
235c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    si.mRunningService.service);
236c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
237c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
238c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        TextView description = (TextView)root.findViewById(R.id.comp_description);
239c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        if (si != null && si.mServiceInfo.descriptionRes != 0) {
240ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            description.setText(getActivity().getPackageManager().getText(
241c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    si.mServiceInfo.packageName, si.mServiceInfo.descriptionRes,
242c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    si.mServiceInfo.applicationInfo));
243c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        } else {
2441337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn            if (mi.mBackground) {
2451337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                description.setText(R.string.background_process_stop_description);
2461337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn            } else if (detail.mManageIntent != null) {
247c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                try {
248ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    Resources clientr = getActivity().getPackageManager().getResourcesForApplication(
249c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                            si.mRunningService.clientPackage);
250c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    String label = clientr.getString(si.mRunningService.clientLabel);
251ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    description.setText(getActivity().getString(R.string.service_manage_description,
252c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                            label));
253c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                } catch (PackageManager.NameNotFoundException e) {
254c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                }
255c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            } else {
256ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                description.setText(getActivity().getText(si != null
257c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        ? R.string.service_stop_description
258c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        : R.string.heavy_weight_stop_description));
259c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            }
260c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
261c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
2624d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        detail.mStopButton = (Button)root.findViewById(R.id.left_button);
2634d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        detail.mStopButton.setOnClickListener(detail);
264ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        detail.mStopButton.setText(getActivity().getText(detail.mManageIntent != null
265c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                ? R.string.service_manage : R.string.service_stop));
2664d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn
2674d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        detail.mReportButton = (Button)root.findViewById(R.id.right_button);
2684d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        detail.mReportButton.setOnClickListener(detail);
2694d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        detail.mReportButton.setText(com.android.internal.R.string.report);
2704d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        // check if error reporting is enabled in secure settings
271ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        int enabled = Settings.Secure.getInt(getActivity().getContentResolver(),
2724d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn                Settings.Secure.SEND_ACTION_APP_ERROR, 0);
2731337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn        if (enabled != 0 && si != null) {
2744d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn            detail.mInstaller = ApplicationErrorReport.getErrorReportReceiver(
275ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    getActivity(), si.mServiceInfo.packageName,
276ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    si.mServiceInfo.applicationInfo.flags);
2774d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn            detail.mReportButton.setEnabled(detail.mInstaller != null);
2784d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        } else {
2794d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn            detail.mReportButton.setEnabled(false);
2804d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn        }
281c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
282c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mActiveDetails.add(detail);
283c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    }
284c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
285c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    void addProcessDetailsView(RunningState.ProcessItem pi, boolean isMain) {
286c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        if (mNumProcesses == 0) {
287c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mProcessesHeader = (TextView)mInflater.inflate(R.layout.separator_label,
288c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    mAllDetails, false);
289c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mProcessesHeader.setText(R.string.runningservicedetails_processes_title);
290c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mAllDetails.addView(mProcessesHeader);
291c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
292c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mNumProcesses++;
293c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
294c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        ActiveDetail detail = new ActiveDetail();
295c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        View root = mInflater.inflate(R.layout.running_service_details_process,
296c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                mAllDetails, false);
297c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mAllDetails.addView(root);
298c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mRootView = root;
299c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mViewHolder = new RunningProcessesView.ViewHolder(root);
300c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mActiveItem = detail.mViewHolder.bind(mState, pi, mBuilder);
301c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
302c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        TextView description = (TextView)root.findViewById(R.id.comp_description);
303c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        if (isMain) {
304c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            description.setText(R.string.main_running_process_description);
305c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        } else {
306c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            int textid = 0;
307c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            CharSequence label = null;
308c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            ActivityManager.RunningAppProcessInfo rpi = pi.mRunningProcessInfo;
309c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            final ComponentName comp = rpi.importanceReasonComponent;
310c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            //Log.i(TAG, "Secondary proc: code=" + rpi.importanceReasonCode
311c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            //        + " pid=" + rpi.importanceReasonPid + " comp=" + comp);
312c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            switch (rpi.importanceReasonCode) {
313c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                case ActivityManager.RunningAppProcessInfo.REASON_PROVIDER_IN_USE:
314c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    textid = R.string.process_provider_in_use_description;
3155774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn                    if (rpi.importanceReasonComponent != null) {
3165774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn                        try {
317ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            ProviderInfo prov = getActivity().getPackageManager().getProviderInfo(
3185774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn                                    rpi.importanceReasonComponent, 0);
319ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            label = RunningState.makeLabel(getActivity().getPackageManager(),
3205774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn                                    prov.name, prov);
3215774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn                        } catch (NameNotFoundException e) {
322c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        }
323c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    }
324c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    break;
325c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                case ActivityManager.RunningAppProcessInfo.REASON_SERVICE_IN_USE:
326c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    textid = R.string.process_service_in_use_description;
327c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    if (rpi.importanceReasonComponent != null) {
328c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        try {
329ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            ServiceInfo serv = getActivity().getPackageManager().getServiceInfo(
330c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                                    rpi.importanceReasonComponent, 0);
331ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            label = RunningState.makeLabel(getActivity().getPackageManager(),
332c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                                    serv.name, serv);
333c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        } catch (NameNotFoundException e) {
334c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        }
335c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    }
336c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    break;
337c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            }
338c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            if (textid != 0 && label != null) {
339ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                description.setText(getActivity().getString(textid, label));
340c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            }
341c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
342c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
343c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mActiveDetails.add(detail);
344c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    }
345c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
346728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    void addDetailViews() {
347728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        for (int i=mActiveDetails.size()-1; i>=0; i--) {
348728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mAllDetails.removeView(mActiveDetails.get(i).mRootView);
349728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
350728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mActiveDetails.clear();
351728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
352728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (mServicesHeader != null) {
353728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mAllDetails.removeView(mServicesHeader);
354728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mServicesHeader = null;
355728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
356728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
357728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (mProcessesHeader != null) {
358728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mAllDetails.removeView(mProcessesHeader);
359728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mProcessesHeader = null;
360728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
361728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
362c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mNumServices = mNumProcesses = 0;
363c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
364728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (mMergedItem != null) {
365728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            for (int i=0; i<mMergedItem.mServices.size(); i++) {
366c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                addServiceDetailsView(mMergedItem.mServices.get(i), mMergedItem);
367c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            }
368c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
369c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            if (mMergedItem.mServices.size() <= 0) {
370c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                // This item does not have any services, so it must be
3711337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn                // another interesting process...  we will put a fake service
372c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                // entry for it, to allow the user to "stop" it.
373c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                addServiceDetailsView(null, mMergedItem);
374728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
375728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
376728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            for (int i=-1; i<mMergedItem.mOtherProcesses.size(); i++) {
377728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                RunningState.ProcessItem pi = i < 0 ? mMergedItem.mProcess
378728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        : mMergedItem.mOtherProcesses.get(i);
379728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                if (pi.mPid <= 0) {
380728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    continue;
381728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
382728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
383c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                addProcessDetailsView(pi, i < 0);
384728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
385728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
386728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
387728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
388728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    void refreshUi(boolean dataChanged) {
389728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (findMergedItem()) {
390728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            dataChanged = true;
391728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
392728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (dataChanged) {
393728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (mMergedItem != null) {
394728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSnippetActiveItem = mSnippetViewHolder.bind(mState,
395728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        mMergedItem, mBuilder);
396728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            } else if (mSnippetActiveItem != null) {
397728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // Clear whatever is currently being shown.
398728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSnippetActiveItem.mHolder.size.setText("");
399728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSnippetActiveItem.mHolder.uptime.setText("");
400728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSnippetActiveItem.mHolder.description.setText(R.string.no_services);
401728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            } else {
402728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // No merged item, never had one.  Nothing to do.
403728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                finish();
404728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                return;
405728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
406728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            addDetailViews();
407728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
408728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
409728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
410ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    private void finish() {
41125bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn        (new Handler()).post(new Runnable() {
41225bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn            @Override
41325bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn            public void run() {
41425bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn                Activity a = getActivity();
41525bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn                if (a != null) {
41625bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn                    a.onBackPressed();
41725bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn                }
41825bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn            }
41925bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn        });
420ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    }
421ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
422728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
423ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    public void onCreate(Bundle savedInstanceState) {
424728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onCreate(savedInstanceState);
425728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
426ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mUid = getArguments().getInt(KEY_UID, 0);
427ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mProcessName = getArguments().getString(KEY_PROCESS);
428ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mShowBackground = getArguments().getBoolean(KEY_BACKGROUND, false);
429728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
430ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mAm = (ActivityManager)getActivity().getSystemService(Context.ACTIVITY_SERVICE);
431ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mInflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
432728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
433ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mState = RunningState.getInstance(getActivity());
434ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    }
435ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
436ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    @Override
437ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
438ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        View view = mRootView = inflater.inflate(R.layout.running_service_details, null);
439728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
440ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mAllDetails = (ViewGroup)view.findViewById(R.id.all_details);
441ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        mSnippet = (ViewGroup)view.findViewById(R.id.snippet);
442728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mSnippet.setPadding(0, mSnippet.getPaddingTop(), 0, mSnippet.getPaddingBottom());
443728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mSnippetViewHolder = new RunningProcessesView.ViewHolder(mSnippet);
444b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
445b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        // We want to retrieve the data right now, so any active managed
446b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        // dialog that gets created can find it.
447b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        ensureData();
448ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
449ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        return view;
450728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
451728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
452728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
453ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    public void onPause() {
454728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onPause();
455b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        mHaveData = false;
456508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        mState.pause();
457728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
458728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
459728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
460ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    public void onResume() {
461728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onResume();
462b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        ensureData();
463728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
464728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
465b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    ActiveDetail activeDetailForService(ComponentName comp) {
466b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        for (int i=0; i<mActiveDetails.size(); i++) {
467b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            ActiveDetail ad = mActiveDetails.get(i);
468b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            if (ad.mServiceItem != null && ad.mServiceItem.mRunningService != null
469b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                    && comp.equals(ad.mServiceItem.mRunningService.service)) {
470b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                return ad;
471b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            }
472b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        }
473b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        return null;
474b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    }
475b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
476ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    private void showConfirmStopDialog(ComponentName comp) {
477ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        DialogFragment newFragment = MyAlertDialogFragment.newConfirmStop(
478ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                DIALOG_CONFIRM_STOP, comp);
479ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        newFragment.setTargetFragment(this, 0);
480ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        newFragment.show(getFragmentManager(), "confirmstop");
481ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    }
482ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
483ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    public static class MyAlertDialogFragment extends DialogFragment {
484ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
485ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        public static MyAlertDialogFragment newConfirmStop(int id, ComponentName comp) {
486ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            MyAlertDialogFragment frag = new MyAlertDialogFragment();
487ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            Bundle args = new Bundle();
488ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            args.putInt("id", id);
489ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            args.putParcelable("comp", comp);
490ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            frag.setArguments(args);
491ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            return frag;
492ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        }
493ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
494ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        RunningServiceDetails getOwner() {
495ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            return (RunningServiceDetails)getTargetFragment();
496ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        }
497ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
498ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        @Override
499ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        public Dialog onCreateDialog(Bundle savedInstanceState) {
500ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            int id = getArguments().getInt("id");
501ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            switch (id) {
502ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                case DIALOG_CONFIRM_STOP: {
503ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    final ComponentName comp = (ComponentName)getArguments().getParcelable("comp");
504ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    if (getOwner().activeDetailForService(comp) == null) {
505ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                        return null;
506ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    }
507ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn
508ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    return new AlertDialog.Builder(getActivity())
509ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            .setTitle(getActivity().getString(R.string.runningservicedetails_stop_dlg_title))
510ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            .setIcon(android.R.drawable.ic_dialog_alert)
511ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            .setMessage(getActivity().getString(R.string.runningservicedetails_stop_dlg_text))
512ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            .setPositiveButton(R.string.dlg_ok,
513ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                                    new DialogInterface.OnClickListener() {
514ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                                public void onClick(DialogInterface dialog, int which) {
515ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                                    ActiveDetail ad = getOwner().activeDetailForService(comp);
516ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                                    if (ad != null) {
517ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                                        ad.stopActiveService(true);
518ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                                    }
519b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn                                }
520ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            })
521ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            .setNegativeButton(R.string.dlg_cancel, null)
522ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                            .create();
523ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                }
524b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            }
525ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            throw new IllegalArgumentException("unknown id " + id);
526b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        }
527b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    }
528b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
529b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    void ensureData() {
530b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        if (!mHaveData) {
531b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            mHaveData = true;
532b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            mState.resume(this);
533b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
534b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            // We want to go away if the service being shown no longer exists,
535b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            // so we need to ensure we have done the initial data retrieval before
536b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            // showing our ui.
537b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            mState.waitForData();
538508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn
539b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            // And since we know we have the data, let's show the UI right away
540b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            // to avoid flicker.
541b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn            refreshUi(true);
542b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn        }
543b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn    }
544b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn
545508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn    void updateTimes() {
546508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        if (mSnippetActiveItem != null) {
547ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mSnippetActiveItem.updateTime(getActivity(), mBuilder);
548508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        }
549508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        for (int i=0; i<mActiveDetails.size(); i++) {
550ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            mActiveDetails.get(i).mActiveItem.updateTime(getActivity(), mBuilder);
551508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        }
552508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn    }
553508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn
554508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn    @Override
555508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn    public void onRefreshUi(int what) {
5568fda756e698c21f08992b9606dd3791c4755122cAmith Yamasani        if (getActivity() == null) return;
557508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        switch (what) {
558508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn            case REFRESH_TIME:
559508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                updateTimes();
560508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                break;
561508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn            case REFRESH_DATA:
562508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                refreshUi(false);
563508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                updateTimes();
564508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                break;
565508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn            case REFRESH_STRUCTURE:
566508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                refreshUi(true);
567508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                updateTimes();
568508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn                break;
569508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn        }
570508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn    }
571728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn}
572