RunningServiceDetails.java revision c01b0c83fca571229621d16b757a46dc0fae7dfe
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;
7728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.app.PendingIntent;
8728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.ActivityNotFoundException;
9728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.ComponentName;
10728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.Context;
11728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.Intent;
12728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.IntentSender;
13728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.PackageManager;
14728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.ProviderInfo;
15728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.ServiceInfo;
16728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.PackageManager.NameNotFoundException;
17728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.res.Resources;
18728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.os.Bundle;
19728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.os.Handler;
20728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.os.HandlerThread;
21728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.os.Looper;
22728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.os.Message;
23728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.util.Log;
24728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.view.LayoutInflater;
25728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.view.View;
26728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.view.ViewGroup;
27728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.widget.LinearLayout;
28728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.widget.TextView;
29728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
30728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport java.util.ArrayList;
31728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport java.util.List;
32728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
33728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornpublic class RunningServiceDetails extends Activity {
34728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static final String TAG = "RunningServicesDetails";
35728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
36728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static final String KEY_UID = "uid";
37728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static final String KEY_PROCESS = "process";
38728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
39728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static final int MSG_UPDATE_TIMES = 1;
40728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static final int MSG_UPDATE_CONTENTS = 2;
41728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    static final int MSG_REFRESH_UI = 3;
42728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
43728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    ActivityManager mAm;
44728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    LayoutInflater mInflater;
45728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
46728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    RunningState mState;
47728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
48728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    int mUid;
49728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    String mProcessName;
50728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
51728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    RunningState.MergedItem mMergedItem;
52728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
53728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    ViewGroup mAllDetails;
54728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    ViewGroup mSnippet;
55728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    RunningProcessesView.ActiveItem mSnippetActiveItem;
56728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    RunningProcessesView.ViewHolder mSnippetViewHolder;
57728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
58c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    int mNumServices, mNumProcesses;
59c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
60728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    TextView mServicesHeader;
61728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    TextView mProcessesHeader;
62728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    final ArrayList<ActiveDetail> mActiveDetails = new ArrayList<ActiveDetail>();
63728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
64728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    class ActiveDetail implements View.OnClickListener {
65728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        View mRootView;
66728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        RunningProcessesView.ActiveItem mActiveItem;
67728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        RunningProcessesView.ViewHolder mViewHolder;
68728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        PendingIntent mManageIntent;
69728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
70728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        public void onClick(View v) {
71728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (mManageIntent != null) {
72728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                try {
73728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    startIntentSender(mManageIntent.getIntentSender(), null,
74728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                            Intent.FLAG_ACTIVITY_NEW_TASK
75728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                                    | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET,
76728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                            Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET, 0);
77728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } catch (IntentSender.SendIntentException e) {
78728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    Log.w(TAG, e);
79728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } catch (IllegalArgumentException e) {
80728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    Log.w(TAG, e);
81728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } catch (ActivityNotFoundException e) {
82728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    Log.w(TAG, e);
83728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
84c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            } else if (mActiveItem.mItem instanceof RunningState.ServiceItem) {
85728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                RunningState.ServiceItem si = (RunningState.ServiceItem)mActiveItem.mItem;
86728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                stopService(new Intent().setComponent(si.mRunningService.service));
87728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                if (mMergedItem == null || mMergedItem.mServices.size() <= 1) {
88728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    // If there was only one service, we are finishing it,
89728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    // so no reason for the UI to stick around.
90728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    finish();
91728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                } else {
92728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    if (mBackgroundHandler != null) {
93728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        mBackgroundHandler.sendEmptyMessage(MSG_UPDATE_CONTENTS);
94728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    }
95728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
96c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            } else {
97c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                // Heavy-weight process.  We'll do a force-stop on it.
98c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                mAm.forceStopPackage(mActiveItem.mItem.mPackageInfo.packageName);
99c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                finish();
100728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
101728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
102728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
103728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
104728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    StringBuilder mBuilder = new StringBuilder(128);
105728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
106728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    HandlerThread mBackgroundThread;
107728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    final class BackgroundHandler extends Handler {
108728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        public BackgroundHandler(Looper looper) {
109728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            super(looper);
110728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
111728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
112728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        @Override
113728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        public void handleMessage(Message msg) {
114728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            switch (msg.what) {
115728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                case MSG_UPDATE_CONTENTS:
116728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    Message cmd = mHandler.obtainMessage(MSG_REFRESH_UI);
117728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    cmd.arg1 = mState.update(RunningServiceDetails.this, mAm) ? 1 : 0;
118728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    mHandler.sendMessage(cmd);
119728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    removeMessages(MSG_UPDATE_CONTENTS);
120728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    msg = obtainMessage(MSG_UPDATE_CONTENTS);
121728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    sendMessageDelayed(msg, RunningProcessesView.CONTENTS_UPDATE_DELAY);
122728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    break;
123728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
124728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
125728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    };
126728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
127728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    BackgroundHandler mBackgroundHandler;
128728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
129728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    final Handler mHandler = new Handler() {
130728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        @Override
131728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        public void handleMessage(Message msg) {
132728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            switch (msg.what) {
133728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                case MSG_UPDATE_TIMES:
134728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    if (mSnippetActiveItem != null) {
135728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        mSnippetActiveItem.updateTime(RunningServiceDetails.this, mBuilder);
136728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    }
137728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    for (int i=0; i<mActiveDetails.size(); i++) {
138728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        mActiveDetails.get(i).mActiveItem.updateTime(
139728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                                RunningServiceDetails.this, mBuilder);
140728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    }
141728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    removeMessages(MSG_UPDATE_TIMES);
142728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    msg = obtainMessage(MSG_UPDATE_TIMES);
143728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    sendMessageDelayed(msg, RunningProcessesView.TIME_UPDATE_DELAY);
144728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    break;
145728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                case MSG_REFRESH_UI:
146728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    refreshUi(msg.arg1 != 0);
147728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    break;
148728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
149728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
150728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    };
151728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
152728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    boolean findMergedItem() {
153728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        RunningState.MergedItem item = null;
154728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        ArrayList<RunningState.MergedItem> newItems = mState.getCurrentMergedItems();
155728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (newItems != null) {
156728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            for (int i=0; i<newItems.size(); i++) {
157728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                RunningState.MergedItem mi = newItems.get(i);
158728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                if (mi.mProcess.mUid == mUid
159728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        && mi.mProcess.mProcessName.equals(mProcessName)) {
160728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    item = mi;
161728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    break;
162728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
163728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
164728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
165728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (mMergedItem != item) {
166728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mMergedItem = item;
167728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            return true;
168728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
169728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        return false;
170728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
171728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
172c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    void addServiceDetailsView(RunningState.ServiceItem si, RunningState.MergedItem mi) {
173c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        if (mNumServices == 0) {
174c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mServicesHeader = (TextView)mInflater.inflate(R.layout.separator_label,
175c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    mAllDetails, false);
176c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mServicesHeader.setText(R.string.runningservicedetails_services_title);
177c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mAllDetails.addView(mServicesHeader);
178c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
179c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mNumServices++;
180c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
181c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        RunningState.BaseItem bi = si != null ? si : mi;
182c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
183c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        ActiveDetail detail = new ActiveDetail();
184c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        View root = mInflater.inflate(R.layout.running_service_details_service,
185c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                mAllDetails, false);
186c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mAllDetails.addView(root);
187c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mRootView = root;
188c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mViewHolder = new RunningProcessesView.ViewHolder(root);
189c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mActiveItem = detail.mViewHolder.bind(mState, bi, mBuilder);
190c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
191c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        if (si != null && si.mRunningService.clientLabel != 0) {
192c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            detail.mManageIntent = mAm.getRunningServiceControlPanel(
193c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    si.mRunningService.service);
194c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
195c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
196c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        TextView description = (TextView)root.findViewById(R.id.comp_description);
197c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        if (si != null && si.mServiceInfo.descriptionRes != 0) {
198c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            description.setText(getPackageManager().getText(
199c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    si.mServiceInfo.packageName, si.mServiceInfo.descriptionRes,
200c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    si.mServiceInfo.applicationInfo));
201c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        } else {
202c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            if (detail.mManageIntent != null) {
203c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                try {
204c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    Resources clientr = getPackageManager().getResourcesForApplication(
205c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                            si.mRunningService.clientPackage);
206c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    String label = clientr.getString(si.mRunningService.clientLabel);
207c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    description.setText(getString(R.string.service_manage_description,
208c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                            label));
209c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                } catch (PackageManager.NameNotFoundException e) {
210c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                }
211c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            } else {
212c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                description.setText(getText(si != null
213c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        ? R.string.service_stop_description
214c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        : R.string.heavy_weight_stop_description));
215c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            }
216c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
217c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
218c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        View button = root.findViewById(R.id.right_button);
219c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        button.setOnClickListener(detail);
220c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        ((TextView)button).setText(getText(detail.mManageIntent != null
221c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                ? R.string.service_manage : R.string.service_stop));
222c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        root.findViewById(R.id.left_button).setVisibility(View.INVISIBLE);
223c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
224c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mActiveDetails.add(detail);
225c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    }
226c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
227c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    void addProcessDetailsView(RunningState.ProcessItem pi, boolean isMain) {
228c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        if (mNumProcesses == 0) {
229c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mProcessesHeader = (TextView)mInflater.inflate(R.layout.separator_label,
230c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    mAllDetails, false);
231c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mProcessesHeader.setText(R.string.runningservicedetails_processes_title);
232c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            mAllDetails.addView(mProcessesHeader);
233c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
234c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mNumProcesses++;
235c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
236c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        ActiveDetail detail = new ActiveDetail();
237c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        View root = mInflater.inflate(R.layout.running_service_details_process,
238c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                mAllDetails, false);
239c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mAllDetails.addView(root);
240c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mRootView = root;
241c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mViewHolder = new RunningProcessesView.ViewHolder(root);
242c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        detail.mActiveItem = detail.mViewHolder.bind(mState, pi, mBuilder);
243c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
244c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        TextView description = (TextView)root.findViewById(R.id.comp_description);
245c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        if (isMain) {
246c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            description.setText(R.string.main_running_process_description);
247c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        } else {
248c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            int textid = 0;
249c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            CharSequence label = null;
250c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            ActivityManager.RunningAppProcessInfo rpi = pi.mRunningProcessInfo;
251c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            final ComponentName comp = rpi.importanceReasonComponent;
252c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            //Log.i(TAG, "Secondary proc: code=" + rpi.importanceReasonCode
253c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            //        + " pid=" + rpi.importanceReasonPid + " comp=" + comp);
254c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            switch (rpi.importanceReasonCode) {
255c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                case ActivityManager.RunningAppProcessInfo.REASON_PROVIDER_IN_USE:
256c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    textid = R.string.process_provider_in_use_description;
257c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    List<ProviderInfo> providers = null;
258c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    if (comp != null) {
259c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        providers = getPackageManager()
260c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                                .queryContentProviders(comp.getPackageName(),
261c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                                        rpi.uid, 0);
262c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    }
263c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    if (providers != null) {
264c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        for (int j=0; j<providers.size(); j++) {
265c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                            ProviderInfo prov = providers.get(j);
266c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                            if (comp.getClassName().equals(prov.name)) {
267c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                                label = RunningState.makeLabel(getPackageManager(),
268c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                                        prov.name, prov);
269c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                                break;
270c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                            }
271c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        }
272c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    }
273c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    break;
274c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                case ActivityManager.RunningAppProcessInfo.REASON_SERVICE_IN_USE:
275c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    textid = R.string.process_service_in_use_description;
276c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    if (rpi.importanceReasonComponent != null) {
277c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        try {
278c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                            ServiceInfo serv = getPackageManager().getServiceInfo(
279c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                                    rpi.importanceReasonComponent, 0);
280c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                            label = RunningState.makeLabel(getPackageManager(),
281c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                                    serv.name, serv);
282c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        } catch (NameNotFoundException e) {
283c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                        }
284c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    }
285c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                    break;
286c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            }
287c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            if (textid != 0 && label != null) {
288c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                description.setText(getString(textid, label));
289c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            }
290c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        }
291c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
292c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mActiveDetails.add(detail);
293c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn    }
294c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
295728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    void addDetailViews() {
296728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        for (int i=mActiveDetails.size()-1; i>=0; i--) {
297728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mAllDetails.removeView(mActiveDetails.get(i).mRootView);
298728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
299728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mActiveDetails.clear();
300728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
301728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (mServicesHeader != null) {
302728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mAllDetails.removeView(mServicesHeader);
303728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mServicesHeader = null;
304728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
305728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
306728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (mProcessesHeader != null) {
307728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mAllDetails.removeView(mProcessesHeader);
308728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mProcessesHeader = null;
309728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
310728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
311c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn        mNumServices = mNumProcesses = 0;
312c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
313728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (mMergedItem != null) {
314728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            for (int i=0; i<mMergedItem.mServices.size(); i++) {
315c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                addServiceDetailsView(mMergedItem.mServices.get(i), mMergedItem);
316c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            }
317c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn
318c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn            if (mMergedItem.mServices.size() <= 0) {
319c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                // This item does not have any services, so it must be
320c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                // a heavy-weight process...  we will put a fake service
321c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                // entry for it, to allow the user to "stop" it.
322c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                addServiceDetailsView(null, mMergedItem);
323728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
324728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
325728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            for (int i=-1; i<mMergedItem.mOtherProcesses.size(); i++) {
326728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                RunningState.ProcessItem pi = i < 0 ? mMergedItem.mProcess
327728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        : mMergedItem.mOtherProcesses.get(i);
328728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                if (pi.mPid <= 0) {
329728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                    continue;
330728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                }
331728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
332c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn                addProcessDetailsView(pi, i < 0);
333728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
334728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
335728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
336728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
337728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    void refreshUi(boolean dataChanged) {
338728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (findMergedItem()) {
339728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            dataChanged = true;
340728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
341728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (dataChanged) {
342728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            if (mMergedItem != null) {
343728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSnippetActiveItem = mSnippetViewHolder.bind(mState,
344728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                        mMergedItem, mBuilder);
345728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            } else if (mSnippetActiveItem != null) {
346728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // Clear whatever is currently being shown.
347728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSnippetActiveItem.mHolder.size.setText("");
348728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSnippetActiveItem.mHolder.uptime.setText("");
349728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                mSnippetActiveItem.mHolder.description.setText(R.string.no_services);
350728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            } else {
351728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                // No merged item, never had one.  Nothing to do.
352728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                finish();
353728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn                return;
354728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            }
355728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            addDetailViews();
356728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
357728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
358728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
359728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
360728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    protected void onCreate(Bundle savedInstanceState) {
361728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onCreate(savedInstanceState);
362728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
363728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mUid = getIntent().getIntExtra(KEY_UID, 0);
364728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mProcessName = getIntent().getStringExtra(KEY_PROCESS);
365728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
366728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mAm = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
367728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
368728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
369728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mState = (RunningState)getLastNonConfigurationInstance();
370728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (mState == null) {
371728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mState = new RunningState();
372728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
373728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
374728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        setContentView(R.layout.running_service_details);
375728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
376728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mAllDetails = (ViewGroup)findViewById(R.id.all_details);
377728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mSnippet = (ViewGroup)findViewById(R.id.snippet);
378728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mSnippet.setBackgroundResource(com.android.internal.R.drawable.title_bar_medium);
379728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mSnippet.setPadding(0, mSnippet.getPaddingTop(), 0, mSnippet.getPaddingBottom());
380728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mSnippetViewHolder = new RunningProcessesView.ViewHolder(mSnippet);
381728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
382728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
383728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
384728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    protected void onPause() {
385728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onPause();
386728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mHandler.removeMessages(MSG_UPDATE_TIMES);
387728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        if (mBackgroundThread != null) {
388728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mBackgroundThread.quit();
389728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mBackgroundThread = null;
390728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn            mBackgroundHandler = null;
391728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        }
392728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
393728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
394728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
395728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    protected void onResume() {
396728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onResume();
397728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        refreshUi(mState.update(this, mAm));
398728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mBackgroundThread = new HandlerThread("RunningServices");
399728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mBackgroundThread.start();
400728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mBackgroundHandler = new BackgroundHandler(mBackgroundThread.getLooper());
401728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mHandler.removeMessages(MSG_UPDATE_TIMES);
402728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        Message msg = mHandler.obtainMessage(MSG_UPDATE_TIMES);
403728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mHandler.sendMessageDelayed(msg, RunningProcessesView.TIME_UPDATE_DELAY);
404728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mBackgroundHandler.removeMessages(MSG_UPDATE_CONTENTS);
405728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        msg = mBackgroundHandler.obtainMessage(MSG_UPDATE_CONTENTS);
406728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        mBackgroundHandler.sendMessageDelayed(msg, RunningProcessesView.CONTENTS_UPDATE_DELAY);
407728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
408728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
409728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
410728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    public Object onRetainNonConfigurationInstance() {
411728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        return mState;
412728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
413728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn
414728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    @Override
415728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    protected void onSaveInstanceState(Bundle outState) {
416728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn        super.onSaveInstanceState(outState);
417728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn    }
418728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn}
419