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