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