1728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornpackage com.android.settings.applications; 2728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 325bda17a57321c8cf599673248d2e35d692ad51eDianne Hackbornimport android.app.Activity; 4728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.app.ActivityManager; 5b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackbornimport android.app.AlertDialog; 64d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.app.ApplicationErrorReport; 7b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackbornimport android.app.Dialog; 8ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornimport android.app.DialogFragment; 9728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.app.PendingIntent; 10728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.ActivityNotFoundException; 11728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.ComponentName; 12728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.Context; 13b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackbornimport android.content.DialogInterface; 14728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.Intent; 15728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.IntentSender; 164d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.content.pm.ApplicationInfo; 17728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.PackageManager; 1897d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkeyimport android.content.pm.PackageManager.NameNotFoundException; 19728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.ProviderInfo; 20728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.ServiceInfo; 21728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.res.Resources; 22728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.os.Bundle; 234d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.os.Debug; 2425bda17a57321c8cf599673248d2e35d692ad51eDianne Hackbornimport android.os.Handler; 254d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.os.SystemClock; 26271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackbornimport android.os.UserHandle; 274d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.provider.Settings; 28728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.util.Log; 29728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.view.LayoutInflater; 30728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.view.View; 31728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.view.ViewGroup; 324d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.widget.Button; 33728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.widget.TextView; 34728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 359d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wrenimport com.android.internal.logging.MetricsProto.MetricsEvent; 368a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenimport com.android.settings.InstrumentedFragment; 3797d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkeyimport com.android.settings.R; 3897d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkeyimport com.android.settings.Utils; 3997d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey 404d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.File; 414d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.FileInputStream; 424d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.FileOutputStream; 434d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.IOException; 44728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport java.util.ArrayList; 45271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackbornimport java.util.Collections; 46728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 478a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenpublic class RunningServiceDetails extends InstrumentedFragment 48508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn implements RunningState.OnRefreshUiListener { 49728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn static final String TAG = "RunningServicesDetails"; 50271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 51728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn static final String KEY_UID = "uid"; 52271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn static final String KEY_USER_ID = "user_id"; 53728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn static final String KEY_PROCESS = "process"; 541337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn static final String KEY_BACKGROUND = "background"; 55271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 56b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn static final int DIALOG_CONFIRM_STOP = 1; 57271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 58728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ActivityManager mAm; 59728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn LayoutInflater mInflater; 60271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 61728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn RunningState mState; 62b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn boolean mHaveData; 63271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 64728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn int mUid; 65271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn int mUserId; 66728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn String mProcessName; 671337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn boolean mShowBackground; 68271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 69728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn RunningState.MergedItem mMergedItem; 70271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 71ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn View mRootView; 72728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ViewGroup mAllDetails; 73728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ViewGroup mSnippet; 74728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn RunningProcessesView.ActiveItem mSnippetActiveItem; 75728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn RunningProcessesView.ViewHolder mSnippetViewHolder; 76271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 77c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn int mNumServices, mNumProcesses; 78c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 79728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn TextView mServicesHeader; 80728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn TextView mProcessesHeader; 81728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final ArrayList<ActiveDetail> mActiveDetails = new ArrayList<ActiveDetail>(); 82728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 83728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn class ActiveDetail implements View.OnClickListener { 84728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn View mRootView; 854d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn Button mStopButton; 864d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn Button mReportButton; 874d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn RunningState.ServiceItem mServiceItem; 88728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn RunningProcessesView.ActiveItem mActiveItem; 89728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn RunningProcessesView.ViewHolder mViewHolder; 90728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn PendingIntent mManageIntent; 914d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn ComponentName mInstaller; 92728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 93b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn void stopActiveService(boolean confirmed) { 94b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn RunningState.ServiceItem si = mServiceItem; 95b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn if (!confirmed) { 96b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn if ((si.mServiceInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) != 0) { 97ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn showConfirmStopDialog(si.mRunningService.service); 98b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn return; 99b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 100b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 101ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn getActivity().stopService(new Intent().setComponent(si.mRunningService.service)); 1021337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn if (mMergedItem == null) { 1031337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn // If this is gone, we are gone. 1041337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mState.updateNow(); 1051337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn finish(); 1061337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else if (!mShowBackground && mMergedItem.mServices.size() <= 1) { 107b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // If there was only one service, we are finishing it, 108b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // so no reason for the UI to stick around. 1091337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mState.updateNow(); 110b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn finish(); 111b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } else { 112b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn mState.updateNow(); 113b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 114b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 115b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn 116728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public void onClick(View v) { 1174d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn if (v == mReportButton) { 1184d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn ApplicationErrorReport report = new ApplicationErrorReport(); 1194d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn report.type = ApplicationErrorReport.TYPE_RUNNING_SERVICE; 1204d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn report.packageName = mServiceItem.mServiceInfo.packageName; 1214d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn report.installerPackageName = mInstaller.getPackageName(); 1224d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn report.processName = mServiceItem.mRunningService.process; 1234d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn report.time = System.currentTimeMillis(); 1244d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn report.systemApp = (mServiceItem.mServiceInfo.applicationInfo.flags 1254d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn & ApplicationInfo.FLAG_SYSTEM) != 0; 1264d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn ApplicationErrorReport.RunningServiceInfo info 1274d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn = new ApplicationErrorReport.RunningServiceInfo(); 128be5994d20152c7194aac79eb8152240655fd3373Dianne Hackborn if (mActiveItem.mFirstRunTime >= 0) { 129be5994d20152c7194aac79eb8152240655fd3373Dianne Hackborn info.durationMillis = SystemClock.elapsedRealtime()-mActiveItem.mFirstRunTime; 1304d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } else { 1314d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn info.durationMillis = -1; 1324d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } 1334d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn ComponentName comp = new ComponentName(mServiceItem.mServiceInfo.packageName, 1344d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn mServiceItem.mServiceInfo.name); 135ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn File filename = getActivity().getFileStreamPath("service_dump.txt"); 1364d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn FileOutputStream output = null; 1374d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn try { 1384d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn output = new FileOutputStream(filename); 1394d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn Debug.dumpService("activity", output.getFD(), 1404d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn new String[] { "-a", "service", comp.flattenToString() }); 1414d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } catch (IOException e) { 1424d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn Log.w(TAG, "Can't dump service: " + comp, e); 1434d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } finally { 1444d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn if (output != null) try { output.close(); } catch (IOException e) {} 1454d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } 1464d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn FileInputStream input = null; 1474d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn try { 1484d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn input = new FileInputStream(filename); 1494d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn byte[] buffer = new byte[(int) filename.length()]; 1504d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn input.read(buffer); 1514d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn info.serviceDetails = new String(buffer); 1524d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } catch (IOException e) { 1534d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn Log.w(TAG, "Can't read service dump: " + comp, e); 1544d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } finally { 1554d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn if (input != null) try { input.close(); } catch (IOException e) {} 1564d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } 1574d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn filename.delete(); 1584d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn Log.i(TAG, "Details: " + info.serviceDetails); 1594d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn report.runningServiceInfo = info; 1604d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn Intent result = new Intent(Intent.ACTION_APP_ERROR); 1614d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn result.setComponent(mInstaller); 1624d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn result.putExtra(Intent.EXTRA_BUG_REPORT, report); 1634d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn result.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 1644d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn startActivity(result); 1654d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn return; 1664d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } 1674d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn 168728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (mManageIntent != null) { 169728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn try { 170ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn getActivity().startIntentSender(mManageIntent.getIntentSender(), null, 171728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn Intent.FLAG_ACTIVITY_NEW_TASK 172728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET, 173728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET, 0); 174728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } catch (IntentSender.SendIntentException e) { 175728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn Log.w(TAG, e); 176728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } catch (IllegalArgumentException e) { 177728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn Log.w(TAG, e); 178728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } catch (ActivityNotFoundException e) { 179728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn Log.w(TAG, e); 180728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 181b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } else if (mServiceItem != null) { 182b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn stopActiveService(false); 1831337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else if (mActiveItem.mItem.mBackground) { 1841337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn // Background process. Just kill it. 1851337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mAm.killBackgroundProcesses(mActiveItem.mItem.mPackageInfo.packageName); 1861337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn finish(); 187c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } else { 188c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn // Heavy-weight process. We'll do a force-stop on it. 189c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mAm.forceStopPackage(mActiveItem.mItem.mPackageInfo.packageName); 190c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn finish(); 191728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 192728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 193728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 194728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 195728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn StringBuilder mBuilder = new StringBuilder(128); 196728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 197728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn boolean findMergedItem() { 198728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn RunningState.MergedItem item = null; 1991337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn ArrayList<RunningState.MergedItem> newItems = mShowBackground 2001337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn ? mState.getCurrentBackgroundItems() : mState.getCurrentMergedItems(); 201728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (newItems != null) { 202728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (int i=0; i<newItems.size(); i++) { 203728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn RunningState.MergedItem mi = newItems.get(i); 204271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (mi.mUserId != mUserId) { 205271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn continue; 206271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 207271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (mUid >= 0 && mi.mProcess != null && mi.mProcess.mUid != mUid) { 208271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn continue; 209271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 210271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (mProcessName == null || (mi.mProcess != null 211271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn && mProcessName.equals(mi.mProcess.mProcessName))) { 212728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn item = mi; 213728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn break; 214728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 215728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 216728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 2171337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn 218728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (mMergedItem != item) { 219728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mMergedItem = item; 220728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return true; 221728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 222728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return false; 223728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 224271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 225271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn void addServicesHeader() { 226c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn if (mNumServices == 0) { 227c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mServicesHeader = (TextView)mInflater.inflate(R.layout.separator_label, 228c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mAllDetails, false); 229c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mServicesHeader.setText(R.string.runningservicedetails_services_title); 230c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mAllDetails.addView(mServicesHeader); 231c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 232c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mNumServices++; 233271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 234271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 235271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn void addProcessesHeader() { 236271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (mNumProcesses == 0) { 237271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn mProcessesHeader = (TextView)mInflater.inflate(R.layout.separator_label, 238271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn mAllDetails, false); 239271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn mProcessesHeader.setText(R.string.runningservicedetails_processes_title); 240271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn mAllDetails.addView(mProcessesHeader); 241271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 242271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn mNumProcesses++; 243271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 244271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 245271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn void addServiceDetailsView(RunningState.ServiceItem si, RunningState.MergedItem mi, 246271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn boolean isService, boolean inclDetails) { 247271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (isService) { 248271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn addServicesHeader(); 249271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } else if (mi.mUserId != UserHandle.myUserId()) { 250271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // This is being called for another user, and is not a service... 251271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // That is, it is a background processes, being added for the 252271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // details of a user. In this case we want a header for processes, 253271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // since the top subject line is for the user. 254271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn addProcessesHeader(); 255271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 256271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 257c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn RunningState.BaseItem bi = si != null ? si : mi; 258c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 259c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn ActiveDetail detail = new ActiveDetail(); 260c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn View root = mInflater.inflate(R.layout.running_service_details_service, 261c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mAllDetails, false); 262c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mAllDetails.addView(root); 263c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn detail.mRootView = root; 2644d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn detail.mServiceItem = si; 265c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn detail.mViewHolder = new RunningProcessesView.ViewHolder(root); 266c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn detail.mActiveItem = detail.mViewHolder.bind(mState, bi, mBuilder); 267271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 268271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (!inclDetails) { 269271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn root.findViewById(R.id.service).setVisibility(View.GONE); 270271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 271271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 272c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn if (si != null && si.mRunningService.clientLabel != 0) { 273c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn detail.mManageIntent = mAm.getRunningServiceControlPanel( 274c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn si.mRunningService.service); 275c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 276c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 277c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn TextView description = (TextView)root.findViewById(R.id.comp_description); 278271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn detail.mStopButton = (Button)root.findViewById(R.id.left_button); 279271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn detail.mReportButton = (Button)root.findViewById(R.id.right_button); 280271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 281271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (isService && mi.mUserId != UserHandle.myUserId()) { 282271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // For services from other users, we don't show any description or 283271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // controls, because the current user can not perform 284271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // actions on them. 285271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn description.setVisibility(View.GONE); 286271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn root.findViewById(R.id.control_buttons_panel).setVisibility(View.GONE); 287c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } else { 288271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (si != null && si.mServiceInfo.descriptionRes != 0) { 289271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn description.setText(getActivity().getPackageManager().getText( 290271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn si.mServiceInfo.packageName, si.mServiceInfo.descriptionRes, 291271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn si.mServiceInfo.applicationInfo)); 292271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } else { 293271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (mi.mBackground) { 294271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn description.setText(R.string.background_process_stop_description); 295271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } else if (detail.mManageIntent != null) { 296271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn try { 297271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn Resources clientr = getActivity().getPackageManager().getResourcesForApplication( 298271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn si.mRunningService.clientPackage); 299271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn String label = clientr.getString(si.mRunningService.clientLabel); 300271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn description.setText(getActivity().getString(R.string.service_manage_description, 301271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn label)); 302271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } catch (PackageManager.NameNotFoundException e) { 303271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 304271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } else { 305271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn description.setText(getActivity().getText(si != null 306271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn ? R.string.service_stop_description 307271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn : R.string.heavy_weight_stop_description)); 308c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 309271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 310271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 311271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn detail.mStopButton.setOnClickListener(detail); 312271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn detail.mStopButton.setText(getActivity().getText(detail.mManageIntent != null 313271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn ? R.string.service_manage : R.string.service_stop)); 314271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn detail.mReportButton.setOnClickListener(detail); 315271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn detail.mReportButton.setText(com.android.internal.R.string.report); 316271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // check if error reporting is enabled in secure settings 3175246e7f76d5fe62f7ffd99e889d90116b37b7f35Jeff Sharkey int enabled = Settings.Global.getInt(getActivity().getContentResolver(), 3185246e7f76d5fe62f7ffd99e889d90116b37b7f35Jeff Sharkey Settings.Global.SEND_ACTION_APP_ERROR, 0); 319271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (enabled != 0 && si != null) { 320271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn detail.mInstaller = ApplicationErrorReport.getErrorReportReceiver( 321271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn getActivity(), si.mServiceInfo.packageName, 322271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn si.mServiceInfo.applicationInfo.flags); 323271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn detail.mReportButton.setEnabled(detail.mInstaller != null); 324c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } else { 325271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn detail.mReportButton.setEnabled(false); 326c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 327c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 3284d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn 329c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mActiveDetails.add(detail); 330c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 331271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 332c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn void addProcessDetailsView(RunningState.ProcessItem pi, boolean isMain) { 333271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn addProcessesHeader(); 334271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 335c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn ActiveDetail detail = new ActiveDetail(); 336c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn View root = mInflater.inflate(R.layout.running_service_details_process, 337c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mAllDetails, false); 338c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mAllDetails.addView(root); 339c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn detail.mRootView = root; 340c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn detail.mViewHolder = new RunningProcessesView.ViewHolder(root); 341c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn detail.mActiveItem = detail.mViewHolder.bind(mState, pi, mBuilder); 342c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 343c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn TextView description = (TextView)root.findViewById(R.id.comp_description); 344271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (pi.mUserId != UserHandle.myUserId()) { 345271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // Processes for another user are all shown batched together; there is 346271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // no reason to have a description. 347271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn description.setVisibility(View.GONE); 348271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } else if (isMain) { 349c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn description.setText(R.string.main_running_process_description); 350c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } else { 351c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn int textid = 0; 352c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn CharSequence label = null; 353c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn ActivityManager.RunningAppProcessInfo rpi = pi.mRunningProcessInfo; 354c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn final ComponentName comp = rpi.importanceReasonComponent; 355c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn //Log.i(TAG, "Secondary proc: code=" + rpi.importanceReasonCode 356c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn // + " pid=" + rpi.importanceReasonPid + " comp=" + comp); 357c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn switch (rpi.importanceReasonCode) { 358c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn case ActivityManager.RunningAppProcessInfo.REASON_PROVIDER_IN_USE: 359c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn textid = R.string.process_provider_in_use_description; 3605774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn if (rpi.importanceReasonComponent != null) { 3615774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn try { 362ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn ProviderInfo prov = getActivity().getPackageManager().getProviderInfo( 3635774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn rpi.importanceReasonComponent, 0); 364ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn label = RunningState.makeLabel(getActivity().getPackageManager(), 3655774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn prov.name, prov); 3665774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn } catch (NameNotFoundException e) { 367c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 368c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 369c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn break; 370c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn case ActivityManager.RunningAppProcessInfo.REASON_SERVICE_IN_USE: 371c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn textid = R.string.process_service_in_use_description; 372c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn if (rpi.importanceReasonComponent != null) { 373c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn try { 374ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn ServiceInfo serv = getActivity().getPackageManager().getServiceInfo( 375c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn rpi.importanceReasonComponent, 0); 376ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn label = RunningState.makeLabel(getActivity().getPackageManager(), 377c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn serv.name, serv); 378c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } catch (NameNotFoundException e) { 379c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 380c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 381c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn break; 382c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 383c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn if (textid != 0 && label != null) { 384ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn description.setText(getActivity().getString(textid, label)); 385c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 386c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 387c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 388c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mActiveDetails.add(detail); 389c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 390271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 391271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn void addDetailsViews(RunningState.MergedItem item, boolean inclServices, 392271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn boolean inclProcesses) { 393271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (item != null) { 394271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (inclServices) { 395271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn for (int i=0; i<item.mServices.size(); i++) { 396271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn addServiceDetailsView(item.mServices.get(i), item, true, true); 397271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 398271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 399271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 400271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (inclProcesses) { 401271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (item.mServices.size() <= 0) { 402271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // This item does not have any services, so it must be 403271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // another interesting process... we will put a fake service 404271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // entry for it, to allow the user to "stop" it. 405271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn addServiceDetailsView(null, item, false, item.mUserId != UserHandle.myUserId()); 406271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } else { 407271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // This screen is actually showing services, so also show 408271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // the process details. 409271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn for (int i=-1; i<item.mOtherProcesses.size(); i++) { 410271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn RunningState.ProcessItem pi = i < 0 ? item.mProcess 411271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn : item.mOtherProcesses.get(i); 412271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (pi != null && pi.mPid <= 0) { 413271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn continue; 414271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 415c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 416271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn addProcessDetailsView(pi, i < 0); 417271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 418271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 419271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 420271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 421271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 422271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 423728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn void addDetailViews() { 424728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (int i=mActiveDetails.size()-1; i>=0; i--) { 425728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mAllDetails.removeView(mActiveDetails.get(i).mRootView); 426728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 427728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mActiveDetails.clear(); 428728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 429728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (mServicesHeader != null) { 430728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mAllDetails.removeView(mServicesHeader); 431728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mServicesHeader = null; 432728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 433728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 434728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (mProcessesHeader != null) { 435728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mAllDetails.removeView(mProcessesHeader); 436728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mProcessesHeader = null; 437728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 438271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 439c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mNumServices = mNumProcesses = 0; 440271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 4419fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn if (mMergedItem != null) { 4429fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn if (mMergedItem.mUser != null) { 4439fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn ArrayList<RunningState.MergedItem> items; 4449fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn if (mShowBackground) { 4459fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn items = new ArrayList<RunningState.MergedItem>(mMergedItem.mChildren); 4469fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn Collections.sort(items, mState.mBackgroundComparator); 4479fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn } else { 4489fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn items = mMergedItem.mChildren; 4499fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn } 4509fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn for (int i=0; i<items.size(); i++) { 4519fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn addDetailsViews(items.get(i), true, false); 4529fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn } 4539fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn for (int i=0; i<items.size(); i++) { 4549fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn addDetailsViews(items.get(i), false, true); 4559fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn } 456271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } else { 4579fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn addDetailsViews(mMergedItem, true, true); 458c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 459728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 460728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 461728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 462728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn void refreshUi(boolean dataChanged) { 463728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (findMergedItem()) { 464728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn dataChanged = true; 465728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 466728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (dataChanged) { 467728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (mMergedItem != null) { 468728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mSnippetActiveItem = mSnippetViewHolder.bind(mState, 469728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mMergedItem, mBuilder); 470728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } else if (mSnippetActiveItem != null) { 471728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // Clear whatever is currently being shown. 472728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mSnippetActiveItem.mHolder.size.setText(""); 473728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mSnippetActiveItem.mHolder.uptime.setText(""); 474728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mSnippetActiveItem.mHolder.description.setText(R.string.no_services); 475728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } else { 476728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // No merged item, never had one. Nothing to do. 477728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn finish(); 478728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return; 479728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 480728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn addDetailViews(); 481728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 482728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 483728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 484ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn private void finish() { 48525bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn (new Handler()).post(new Runnable() { 48625bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn @Override 48725bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn public void run() { 48825bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn Activity a = getActivity(); 48925bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn if (a != null) { 49025bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn a.onBackPressed(); 49125bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn } 49225bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn } 49325bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn }); 494ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 495ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 496728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 497ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public void onCreate(Bundle savedInstanceState) { 498728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onCreate(savedInstanceState); 499728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 500271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn mUid = getArguments().getInt(KEY_UID, -1); 501271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn mUserId = getArguments().getInt(KEY_USER_ID, 0); 502271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn mProcessName = getArguments().getString(KEY_PROCESS, null); 503ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mShowBackground = getArguments().getBoolean(KEY_BACKGROUND, false); 504728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 505ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mAm = (ActivityManager)getActivity().getSystemService(Context.ACTIVITY_SERVICE); 506ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mInflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 507728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 508ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mState = RunningState.getInstance(getActivity()); 509ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 510ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 511ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn @Override 51297d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey public View onCreateView( 51397d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 51497d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey final View view = inflater.inflate(R.layout.running_service_details, container, false); 51597d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey Utils.prepareCustomPreferencesList(container, view, view, false); 51697d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey 51797d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey mRootView = view; 518ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mAllDetails = (ViewGroup)view.findViewById(R.id.all_details); 519ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mSnippet = (ViewGroup)view.findViewById(R.id.snippet); 520728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mSnippetViewHolder = new RunningProcessesView.ViewHolder(mSnippet); 521b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn 522b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // We want to retrieve the data right now, so any active managed 523b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // dialog that gets created can find it. 524b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn ensureData(); 525ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 526ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn return view; 527728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 528728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 529728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 530ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public void onPause() { 531728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onPause(); 532b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn mHaveData = false; 533508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn mState.pause(); 534728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 535728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 536728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 5378a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren protected int getMetricsCategory() { 5389d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren return MetricsEvent.RUNNING_SERVICE_DETAILS; 5398a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren } 5408a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren 5418a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren @Override 542ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public void onResume() { 543728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onResume(); 544b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn ensureData(); 545728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 546728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 547b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn ActiveDetail activeDetailForService(ComponentName comp) { 548b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn for (int i=0; i<mActiveDetails.size(); i++) { 549b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn ActiveDetail ad = mActiveDetails.get(i); 550b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn if (ad.mServiceItem != null && ad.mServiceItem.mRunningService != null 551b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn && comp.equals(ad.mServiceItem.mRunningService.service)) { 552b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn return ad; 553b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 554b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 555b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn return null; 556b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 557b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn 558ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn private void showConfirmStopDialog(ComponentName comp) { 559ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn DialogFragment newFragment = MyAlertDialogFragment.newConfirmStop( 560ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn DIALOG_CONFIRM_STOP, comp); 561ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn newFragment.setTargetFragment(this, 0); 562ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn newFragment.show(getFragmentManager(), "confirmstop"); 563ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 564ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 565ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public static class MyAlertDialogFragment extends DialogFragment { 566ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 567ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public static MyAlertDialogFragment newConfirmStop(int id, ComponentName comp) { 568ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn MyAlertDialogFragment frag = new MyAlertDialogFragment(); 569ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn Bundle args = new Bundle(); 570ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn args.putInt("id", id); 571ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn args.putParcelable("comp", comp); 572ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn frag.setArguments(args); 573ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn return frag; 574ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 575ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 576ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn RunningServiceDetails getOwner() { 577ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn return (RunningServiceDetails)getTargetFragment(); 578ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 579ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 580ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn @Override 581ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public Dialog onCreateDialog(Bundle savedInstanceState) { 582ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn int id = getArguments().getInt("id"); 583ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn switch (id) { 584ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn case DIALOG_CONFIRM_STOP: { 585ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn final ComponentName comp = (ComponentName)getArguments().getParcelable("comp"); 586ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn if (getOwner().activeDetailForService(comp) == null) { 587ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn return null; 588ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 589ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 590ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn return new AlertDialog.Builder(getActivity()) 591ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setTitle(getActivity().getString(R.string.runningservicedetails_stop_dlg_title)) 592ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setMessage(getActivity().getString(R.string.runningservicedetails_stop_dlg_text)) 593ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setPositiveButton(R.string.dlg_ok, 594ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn new DialogInterface.OnClickListener() { 595ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public void onClick(DialogInterface dialog, int which) { 596ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn ActiveDetail ad = getOwner().activeDetailForService(comp); 597ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn if (ad != null) { 598ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn ad.stopActiveService(true); 599ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 600b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 601ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn }) 602ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setNegativeButton(R.string.dlg_cancel, null) 603ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .create(); 604ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 605b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 606ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn throw new IllegalArgumentException("unknown id " + id); 607b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 608b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 609b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn 610b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn void ensureData() { 611b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn if (!mHaveData) { 612b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn mHaveData = true; 613b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn mState.resume(this); 614b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn 615b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // We want to go away if the service being shown no longer exists, 616b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // so we need to ensure we have done the initial data retrieval before 617b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // showing our ui. 618b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn mState.waitForData(); 619508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn 620b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // And since we know we have the data, let's show the UI right away 621b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // to avoid flicker. 622b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn refreshUi(true); 623b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 624b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 625b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn 626508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn void updateTimes() { 627508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn if (mSnippetActiveItem != null) { 628ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mSnippetActiveItem.updateTime(getActivity(), mBuilder); 629508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn } 630508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn for (int i=0; i<mActiveDetails.size(); i++) { 631ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mActiveDetails.get(i).mActiveItem.updateTime(getActivity(), mBuilder); 632508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn } 633508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn } 634508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn 635508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn @Override 636508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn public void onRefreshUi(int what) { 6378fda756e698c21f08992b9606dd3791c4755122cAmith Yamasani if (getActivity() == null) return; 638508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn switch (what) { 639508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn case REFRESH_TIME: 640508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn updateTimes(); 641508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn break; 642508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn case REFRESH_DATA: 643508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn refreshUi(false); 644508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn updateTimes(); 645508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn break; 646508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn case REFRESH_STRUCTURE: 647508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn refreshUi(true); 648508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn updateTimes(); 649508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn break; 650508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn } 651508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn } 652728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn} 653