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