RunningServiceDetails.java revision 9fae74f6c37b60d10a2bddb214c28e7f9f7484f3
1728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornpackage com.android.settings.applications; 2728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 3728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport com.android.settings.R; 4728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 525bda17a57321c8cf599673248d2e35d692ad51eDianne Hackbornimport android.app.Activity; 6728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.app.ActivityManager; 7b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackbornimport android.app.AlertDialog; 84d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.app.ApplicationErrorReport; 9b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackbornimport android.app.Dialog; 10ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornimport android.app.DialogFragment; 11ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornimport android.app.Fragment; 12728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.app.PendingIntent; 13728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.ActivityNotFoundException; 14728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.ComponentName; 15728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.Context; 16b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackbornimport android.content.DialogInterface; 17728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.Intent; 18728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.IntentSender; 194d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.content.pm.ApplicationInfo; 20728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.PackageManager; 21728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.ProviderInfo; 22728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.ServiceInfo; 23728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.PackageManager.NameNotFoundException; 24728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.res.Resources; 25728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.os.Bundle; 264d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.os.Debug; 2725bda17a57321c8cf599673248d2e35d692ad51eDianne Hackbornimport android.os.Handler; 284d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.os.SystemClock; 29271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackbornimport android.os.UserHandle; 304d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.provider.Settings; 31728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.util.Log; 32728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.view.LayoutInflater; 33728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.view.View; 34728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.view.ViewGroup; 354d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.widget.Button; 36728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.widget.TextView; 37728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 384d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.File; 394d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.FileInputStream; 404d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.FileOutputStream; 414d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.IOException; 42728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport java.util.ArrayList; 43271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackbornimport java.util.Collections; 44728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 45ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornpublic class RunningServiceDetails extends Fragment 46508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn implements RunningState.OnRefreshUiListener { 47728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn static final String TAG = "RunningServicesDetails"; 48271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 49728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn static final String KEY_UID = "uid"; 50271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn static final String KEY_USER_ID = "user_id"; 51728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn static final String KEY_PROCESS = "process"; 521337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn static final String KEY_BACKGROUND = "background"; 53271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 54b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn static final int DIALOG_CONFIRM_STOP = 1; 55271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 56728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ActivityManager mAm; 57728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn LayoutInflater mInflater; 58271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 59728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn RunningState mState; 60b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn boolean mHaveData; 61271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 62728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn int mUid; 63271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn int mUserId; 64728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn String mProcessName; 651337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn boolean mShowBackground; 66271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 67728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn RunningState.MergedItem mMergedItem; 68271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 69ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn View mRootView; 70728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ViewGroup mAllDetails; 71728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ViewGroup mSnippet; 72728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn RunningProcessesView.ActiveItem mSnippetActiveItem; 73728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn RunningProcessesView.ViewHolder mSnippetViewHolder; 74271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 75c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn int mNumServices, mNumProcesses; 76c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 77728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn TextView mServicesHeader; 78728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn TextView mProcessesHeader; 79728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final ArrayList<ActiveDetail> mActiveDetails = new ArrayList<ActiveDetail>(); 80728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 81728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn class ActiveDetail implements View.OnClickListener { 82728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn View mRootView; 834d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn Button mStopButton; 844d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn Button mReportButton; 854d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn RunningState.ServiceItem mServiceItem; 86728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn RunningProcessesView.ActiveItem mActiveItem; 87728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn RunningProcessesView.ViewHolder mViewHolder; 88728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn PendingIntent mManageIntent; 894d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn ComponentName mInstaller; 90728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 91b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn void stopActiveService(boolean confirmed) { 92b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn RunningState.ServiceItem si = mServiceItem; 93b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn if (!confirmed) { 94b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn if ((si.mServiceInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) != 0) { 95ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn showConfirmStopDialog(si.mRunningService.service); 96b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn return; 97b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 98b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 99ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn getActivity().stopService(new Intent().setComponent(si.mRunningService.service)); 1001337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn if (mMergedItem == null) { 1011337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn // If this is gone, we are gone. 1021337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mState.updateNow(); 1031337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn finish(); 1041337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else if (!mShowBackground && mMergedItem.mServices.size() <= 1) { 105b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // If there was only one service, we are finishing it, 106b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // so no reason for the UI to stick around. 1071337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mState.updateNow(); 108b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn finish(); 109b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } else { 110b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn mState.updateNow(); 111b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 112b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 113b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn 114728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public void onClick(View v) { 1154d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn if (v == mReportButton) { 1164d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn ApplicationErrorReport report = new ApplicationErrorReport(); 1174d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn report.type = ApplicationErrorReport.TYPE_RUNNING_SERVICE; 1184d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn report.packageName = mServiceItem.mServiceInfo.packageName; 1194d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn report.installerPackageName = mInstaller.getPackageName(); 1204d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn report.processName = mServiceItem.mRunningService.process; 1214d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn report.time = System.currentTimeMillis(); 1224d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn report.systemApp = (mServiceItem.mServiceInfo.applicationInfo.flags 1234d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn & ApplicationInfo.FLAG_SYSTEM) != 0; 1244d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn ApplicationErrorReport.RunningServiceInfo info 1254d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn = new ApplicationErrorReport.RunningServiceInfo(); 126be5994d20152c7194aac79eb8152240655fd3373Dianne Hackborn if (mActiveItem.mFirstRunTime >= 0) { 127be5994d20152c7194aac79eb8152240655fd3373Dianne Hackborn info.durationMillis = SystemClock.elapsedRealtime()-mActiveItem.mFirstRunTime; 1284d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } else { 1294d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn info.durationMillis = -1; 1304d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } 1314d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn ComponentName comp = new ComponentName(mServiceItem.mServiceInfo.packageName, 1324d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn mServiceItem.mServiceInfo.name); 133ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn File filename = getActivity().getFileStreamPath("service_dump.txt"); 1344d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn FileOutputStream output = null; 1354d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn try { 1364d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn output = new FileOutputStream(filename); 1374d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn Debug.dumpService("activity", output.getFD(), 1384d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn new String[] { "-a", "service", comp.flattenToString() }); 1394d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } catch (IOException e) { 1404d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn Log.w(TAG, "Can't dump service: " + comp, e); 1414d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } finally { 1424d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn if (output != null) try { output.close(); } catch (IOException e) {} 1434d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } 1444d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn FileInputStream input = null; 1454d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn try { 1464d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn input = new FileInputStream(filename); 1474d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn byte[] buffer = new byte[(int) filename.length()]; 1484d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn input.read(buffer); 1494d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn info.serviceDetails = new String(buffer); 1504d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } catch (IOException e) { 1514d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn Log.w(TAG, "Can't read service dump: " + comp, e); 1524d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } finally { 1534d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn if (input != null) try { input.close(); } catch (IOException e) {} 1544d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } 1554d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn filename.delete(); 1564d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn Log.i(TAG, "Details: " + info.serviceDetails); 1574d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn report.runningServiceInfo = info; 1584d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn Intent result = new Intent(Intent.ACTION_APP_ERROR); 1594d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn result.setComponent(mInstaller); 1604d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn result.putExtra(Intent.EXTRA_BUG_REPORT, report); 1614d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn result.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 1624d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn startActivity(result); 1634d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn return; 1644d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } 1654d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn 166728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (mManageIntent != null) { 167728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn try { 168ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn getActivity().startIntentSender(mManageIntent.getIntentSender(), null, 169728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn Intent.FLAG_ACTIVITY_NEW_TASK 170728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET, 171728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET, 0); 172728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } catch (IntentSender.SendIntentException e) { 173728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn Log.w(TAG, e); 174728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } catch (IllegalArgumentException e) { 175728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn Log.w(TAG, e); 176728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } catch (ActivityNotFoundException e) { 177728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn Log.w(TAG, e); 178728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 179b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } else if (mServiceItem != null) { 180b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn stopActiveService(false); 1811337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else if (mActiveItem.mItem.mBackground) { 1821337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn // Background process. Just kill it. 1831337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mAm.killBackgroundProcesses(mActiveItem.mItem.mPackageInfo.packageName); 1841337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn finish(); 185c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } else { 186c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn // Heavy-weight process. We'll do a force-stop on it. 187c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mAm.forceStopPackage(mActiveItem.mItem.mPackageInfo.packageName); 188c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn finish(); 189728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 190728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 191728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 192728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 193728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn StringBuilder mBuilder = new StringBuilder(128); 194728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 195728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn boolean findMergedItem() { 196728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn RunningState.MergedItem item = null; 1971337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn ArrayList<RunningState.MergedItem> newItems = mShowBackground 1981337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn ? mState.getCurrentBackgroundItems() : mState.getCurrentMergedItems(); 199728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (newItems != null) { 200728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (int i=0; i<newItems.size(); i++) { 201728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn RunningState.MergedItem mi = newItems.get(i); 202271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (mi.mUserId != mUserId) { 203271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn continue; 204271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 205271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (mUid >= 0 && mi.mProcess != null && mi.mProcess.mUid != mUid) { 206271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn continue; 207271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 208271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (mProcessName == null || (mi.mProcess != null 209271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn && mProcessName.equals(mi.mProcess.mProcessName))) { 210728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn item = mi; 211728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn break; 212728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 213728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 214728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 2151337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn 216728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (mMergedItem != item) { 217728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mMergedItem = item; 218728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return true; 219728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 220728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return false; 221728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 222271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 223271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn void addServicesHeader() { 224c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn if (mNumServices == 0) { 225c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mServicesHeader = (TextView)mInflater.inflate(R.layout.separator_label, 226c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mAllDetails, false); 227c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mServicesHeader.setText(R.string.runningservicedetails_services_title); 228c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mAllDetails.addView(mServicesHeader); 229c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 230c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mNumServices++; 231271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 232271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 233271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn void addProcessesHeader() { 234271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (mNumProcesses == 0) { 235271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn mProcessesHeader = (TextView)mInflater.inflate(R.layout.separator_label, 236271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn mAllDetails, false); 237271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn mProcessesHeader.setText(R.string.runningservicedetails_processes_title); 238271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn mAllDetails.addView(mProcessesHeader); 239271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 240271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn mNumProcesses++; 241271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 242271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 243271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn void addServiceDetailsView(RunningState.ServiceItem si, RunningState.MergedItem mi, 244271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn boolean isService, boolean inclDetails) { 245271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (isService) { 246271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn addServicesHeader(); 247271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } else if (mi.mUserId != UserHandle.myUserId()) { 248271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // This is being called for another user, and is not a service... 249271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // That is, it is a background processes, being added for the 250271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // details of a user. In this case we want a header for processes, 251271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // since the top subject line is for the user. 252271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn addProcessesHeader(); 253271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 254271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 255c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn RunningState.BaseItem bi = si != null ? si : mi; 256c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 257c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn ActiveDetail detail = new ActiveDetail(); 258c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn View root = mInflater.inflate(R.layout.running_service_details_service, 259c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mAllDetails, false); 260c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mAllDetails.addView(root); 261c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn detail.mRootView = root; 2624d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn detail.mServiceItem = si; 263c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn detail.mViewHolder = new RunningProcessesView.ViewHolder(root); 264c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn detail.mActiveItem = detail.mViewHolder.bind(mState, bi, mBuilder); 265271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 266271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (!inclDetails) { 267271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn root.findViewById(R.id.service).setVisibility(View.GONE); 268271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 269271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 270c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn if (si != null && si.mRunningService.clientLabel != 0) { 271c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn detail.mManageIntent = mAm.getRunningServiceControlPanel( 272c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn si.mRunningService.service); 273c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 274c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 275c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn TextView description = (TextView)root.findViewById(R.id.comp_description); 276271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn detail.mStopButton = (Button)root.findViewById(R.id.left_button); 277271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn detail.mReportButton = (Button)root.findViewById(R.id.right_button); 278271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 279271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (isService && mi.mUserId != UserHandle.myUserId()) { 280271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // For services from other users, we don't show any description or 281271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // controls, because the current user can not perform 282271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // actions on them. 283271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn description.setVisibility(View.GONE); 284271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn root.findViewById(R.id.control_buttons_panel).setVisibility(View.GONE); 285c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } else { 286271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (si != null && si.mServiceInfo.descriptionRes != 0) { 287271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn description.setText(getActivity().getPackageManager().getText( 288271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn si.mServiceInfo.packageName, si.mServiceInfo.descriptionRes, 289271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn si.mServiceInfo.applicationInfo)); 290271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } else { 291271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (mi.mBackground) { 292271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn description.setText(R.string.background_process_stop_description); 293271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } else if (detail.mManageIntent != null) { 294271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn try { 295271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn Resources clientr = getActivity().getPackageManager().getResourcesForApplication( 296271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn si.mRunningService.clientPackage); 297271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn String label = clientr.getString(si.mRunningService.clientLabel); 298271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn description.setText(getActivity().getString(R.string.service_manage_description, 299271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn label)); 300271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } catch (PackageManager.NameNotFoundException e) { 301271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 302271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } else { 303271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn description.setText(getActivity().getText(si != null 304271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn ? R.string.service_stop_description 305271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn : R.string.heavy_weight_stop_description)); 306c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 307271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 308271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 309271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn detail.mStopButton.setOnClickListener(detail); 310271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn detail.mStopButton.setText(getActivity().getText(detail.mManageIntent != null 311271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn ? R.string.service_manage : R.string.service_stop)); 312271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn detail.mReportButton.setOnClickListener(detail); 313271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn detail.mReportButton.setText(com.android.internal.R.string.report); 314271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // check if error reporting is enabled in secure settings 315271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn int enabled = Settings.Secure.getInt(getActivity().getContentResolver(), 316271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn Settings.Secure.SEND_ACTION_APP_ERROR, 0); 317271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (enabled != 0 && si != null) { 318271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn detail.mInstaller = ApplicationErrorReport.getErrorReportReceiver( 319271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn getActivity(), si.mServiceInfo.packageName, 320271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn si.mServiceInfo.applicationInfo.flags); 321271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn detail.mReportButton.setEnabled(detail.mInstaller != null); 322c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } else { 323271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn detail.mReportButton.setEnabled(false); 324c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 325c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 3264d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn 327c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mActiveDetails.add(detail); 328c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 329271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 330c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn void addProcessDetailsView(RunningState.ProcessItem pi, boolean isMain) { 331271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn addProcessesHeader(); 332271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 333c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn ActiveDetail detail = new ActiveDetail(); 334c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn View root = mInflater.inflate(R.layout.running_service_details_process, 335c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mAllDetails, false); 336c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mAllDetails.addView(root); 337c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn detail.mRootView = root; 338c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn detail.mViewHolder = new RunningProcessesView.ViewHolder(root); 339c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn detail.mActiveItem = detail.mViewHolder.bind(mState, pi, mBuilder); 340c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 341c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn TextView description = (TextView)root.findViewById(R.id.comp_description); 342271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (pi.mUserId != UserHandle.myUserId()) { 343271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // Processes for another user are all shown batched together; there is 344271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // no reason to have a description. 345271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn description.setVisibility(View.GONE); 346271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } else if (isMain) { 347c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn description.setText(R.string.main_running_process_description); 348c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } else { 349c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn int textid = 0; 350c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn CharSequence label = null; 351c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn ActivityManager.RunningAppProcessInfo rpi = pi.mRunningProcessInfo; 352c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn final ComponentName comp = rpi.importanceReasonComponent; 353c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn //Log.i(TAG, "Secondary proc: code=" + rpi.importanceReasonCode 354c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn // + " pid=" + rpi.importanceReasonPid + " comp=" + comp); 355c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn switch (rpi.importanceReasonCode) { 356c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn case ActivityManager.RunningAppProcessInfo.REASON_PROVIDER_IN_USE: 357c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn textid = R.string.process_provider_in_use_description; 3585774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn if (rpi.importanceReasonComponent != null) { 3595774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn try { 360ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn ProviderInfo prov = getActivity().getPackageManager().getProviderInfo( 3615774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn rpi.importanceReasonComponent, 0); 362ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn label = RunningState.makeLabel(getActivity().getPackageManager(), 3635774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn prov.name, prov); 3645774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn } catch (NameNotFoundException e) { 365c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 366c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 367c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn break; 368c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn case ActivityManager.RunningAppProcessInfo.REASON_SERVICE_IN_USE: 369c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn textid = R.string.process_service_in_use_description; 370c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn if (rpi.importanceReasonComponent != null) { 371c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn try { 372ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn ServiceInfo serv = getActivity().getPackageManager().getServiceInfo( 373c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn rpi.importanceReasonComponent, 0); 374ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn label = RunningState.makeLabel(getActivity().getPackageManager(), 375c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn serv.name, serv); 376c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } catch (NameNotFoundException e) { 377c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 378c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 379c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn break; 380c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 381c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn if (textid != 0 && label != null) { 382ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn description.setText(getActivity().getString(textid, label)); 383c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 384c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 385c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 386c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mActiveDetails.add(detail); 387c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 388271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 389271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn void addDetailsViews(RunningState.MergedItem item, boolean inclServices, 390271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn boolean inclProcesses) { 391271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (item != null) { 392271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (inclServices) { 393271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn for (int i=0; i<item.mServices.size(); i++) { 394271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn addServiceDetailsView(item.mServices.get(i), item, true, true); 395271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 396271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 397271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 398271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (inclProcesses) { 399271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (item.mServices.size() <= 0) { 400271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // This item does not have any services, so it must be 401271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // another interesting process... we will put a fake service 402271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // entry for it, to allow the user to "stop" it. 403271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn addServiceDetailsView(null, item, false, item.mUserId != UserHandle.myUserId()); 404271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } else { 405271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // This screen is actually showing services, so also show 406271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn // the process details. 407271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn for (int i=-1; i<item.mOtherProcesses.size(); i++) { 408271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn RunningState.ProcessItem pi = i < 0 ? item.mProcess 409271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn : item.mOtherProcesses.get(i); 410271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn if (pi != null && pi.mPid <= 0) { 411271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn continue; 412271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 413c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 414271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn addProcessDetailsView(pi, i < 0); 415271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 416271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 417271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 418271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 419271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } 420271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 421728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn void addDetailViews() { 422728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (int i=mActiveDetails.size()-1; i>=0; i--) { 423728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mAllDetails.removeView(mActiveDetails.get(i).mRootView); 424728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 425728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mActiveDetails.clear(); 426728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 427728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (mServicesHeader != null) { 428728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mAllDetails.removeView(mServicesHeader); 429728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mServicesHeader = null; 430728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 431728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 432728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (mProcessesHeader != null) { 433728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mAllDetails.removeView(mProcessesHeader); 434728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mProcessesHeader = null; 435728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 436271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 437c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mNumServices = mNumProcesses = 0; 438271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn 4399fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn if (mMergedItem != null) { 4409fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn if (mMergedItem.mUser != null) { 4419fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn ArrayList<RunningState.MergedItem> items; 4429fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn if (mShowBackground) { 4439fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn items = new ArrayList<RunningState.MergedItem>(mMergedItem.mChildren); 4449fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn Collections.sort(items, mState.mBackgroundComparator); 4459fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn } else { 4469fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn items = mMergedItem.mChildren; 4479fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn } 4489fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn for (int i=0; i<items.size(); i++) { 4499fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn addDetailsViews(items.get(i), true, false); 4509fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn } 4519fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn for (int i=0; i<items.size(); i++) { 4529fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn addDetailsViews(items.get(i), false, true); 4539fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn } 454271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn } else { 4559fae74f6c37b60d10a2bddb214c28e7f9f7484f3Dianne Hackborn addDetailsViews(mMergedItem, true, true); 456c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 457728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 458728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 459728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 460728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn void refreshUi(boolean dataChanged) { 461728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (findMergedItem()) { 462728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn dataChanged = true; 463728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 464728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (dataChanged) { 465728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (mMergedItem != null) { 466728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mSnippetActiveItem = mSnippetViewHolder.bind(mState, 467728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mMergedItem, mBuilder); 468728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } else if (mSnippetActiveItem != null) { 469728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // Clear whatever is currently being shown. 470728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mSnippetActiveItem.mHolder.size.setText(""); 471728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mSnippetActiveItem.mHolder.uptime.setText(""); 472728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mSnippetActiveItem.mHolder.description.setText(R.string.no_services); 473728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } else { 474728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // No merged item, never had one. Nothing to do. 475728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn finish(); 476728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return; 477728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 478728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn addDetailViews(); 479728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 480728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 481728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 482ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn private void finish() { 48325bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn (new Handler()).post(new Runnable() { 48425bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn @Override 48525bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn public void run() { 48625bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn Activity a = getActivity(); 48725bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn if (a != null) { 48825bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn a.onBackPressed(); 48925bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn } 49025bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn } 49125bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn }); 492ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 493ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 494728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 495ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public void onCreate(Bundle savedInstanceState) { 496728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onCreate(savedInstanceState); 497728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 498271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn mUid = getArguments().getInt(KEY_UID, -1); 499271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn mUserId = getArguments().getInt(KEY_USER_ID, 0); 500271c8b06c2b6f12cd7f51c2be2ca50167b96e742Dianne Hackborn mProcessName = getArguments().getString(KEY_PROCESS, null); 501ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mShowBackground = getArguments().getBoolean(KEY_BACKGROUND, false); 502728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 503ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mAm = (ActivityManager)getActivity().getSystemService(Context.ACTIVITY_SERVICE); 504ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mInflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 505728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 506ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mState = RunningState.getInstance(getActivity()); 507ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 508ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 509ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn @Override 510ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 511ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn View view = mRootView = inflater.inflate(R.layout.running_service_details, null); 512728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 513ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mAllDetails = (ViewGroup)view.findViewById(R.id.all_details); 514ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mSnippet = (ViewGroup)view.findViewById(R.id.snippet); 515728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mSnippet.setPadding(0, mSnippet.getPaddingTop(), 0, mSnippet.getPaddingBottom()); 516728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mSnippetViewHolder = new RunningProcessesView.ViewHolder(mSnippet); 517b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn 518b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // We want to retrieve the data right now, so any active managed 519b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // dialog that gets created can find it. 520b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn ensureData(); 521ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 522ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn return view; 523728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 524728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 525728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 526ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public void onPause() { 527728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onPause(); 528b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn mHaveData = false; 529508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn mState.pause(); 530728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 531728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 532728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 533ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public void onResume() { 534728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onResume(); 535b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn ensureData(); 536728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 537728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 538b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn ActiveDetail activeDetailForService(ComponentName comp) { 539b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn for (int i=0; i<mActiveDetails.size(); i++) { 540b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn ActiveDetail ad = mActiveDetails.get(i); 541b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn if (ad.mServiceItem != null && ad.mServiceItem.mRunningService != null 542b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn && comp.equals(ad.mServiceItem.mRunningService.service)) { 543b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn return ad; 544b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 545b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 546b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn return null; 547b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 548b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn 549ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn private void showConfirmStopDialog(ComponentName comp) { 550ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn DialogFragment newFragment = MyAlertDialogFragment.newConfirmStop( 551ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn DIALOG_CONFIRM_STOP, comp); 552ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn newFragment.setTargetFragment(this, 0); 553ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn newFragment.show(getFragmentManager(), "confirmstop"); 554ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 555ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 556ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public static class MyAlertDialogFragment extends DialogFragment { 557ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 558ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public static MyAlertDialogFragment newConfirmStop(int id, ComponentName comp) { 559ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn MyAlertDialogFragment frag = new MyAlertDialogFragment(); 560ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn Bundle args = new Bundle(); 561ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn args.putInt("id", id); 562ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn args.putParcelable("comp", comp); 563ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn frag.setArguments(args); 564ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn return frag; 565ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 566ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 567ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn RunningServiceDetails getOwner() { 568ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn return (RunningServiceDetails)getTargetFragment(); 569ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 570ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 571ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn @Override 572ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public Dialog onCreateDialog(Bundle savedInstanceState) { 573ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn int id = getArguments().getInt("id"); 574ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn switch (id) { 575ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn case DIALOG_CONFIRM_STOP: { 576ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn final ComponentName comp = (ComponentName)getArguments().getParcelable("comp"); 577ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn if (getOwner().activeDetailForService(comp) == null) { 578ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn return null; 579ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 580ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 581ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn return new AlertDialog.Builder(getActivity()) 582ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setTitle(getActivity().getString(R.string.runningservicedetails_stop_dlg_title)) 583e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 584ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setMessage(getActivity().getString(R.string.runningservicedetails_stop_dlg_text)) 585ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setPositiveButton(R.string.dlg_ok, 586ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn new DialogInterface.OnClickListener() { 587ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public void onClick(DialogInterface dialog, int which) { 588ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn ActiveDetail ad = getOwner().activeDetailForService(comp); 589ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn if (ad != null) { 590ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn ad.stopActiveService(true); 591ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 592b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 593ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn }) 594ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setNegativeButton(R.string.dlg_cancel, null) 595ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .create(); 596ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 597b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 598ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn throw new IllegalArgumentException("unknown id " + id); 599b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 600b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 601b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn 602b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn void ensureData() { 603b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn if (!mHaveData) { 604b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn mHaveData = true; 605b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn mState.resume(this); 606b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn 607b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // We want to go away if the service being shown no longer exists, 608b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // so we need to ensure we have done the initial data retrieval before 609b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // showing our ui. 610b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn mState.waitForData(); 611508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn 612b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // And since we know we have the data, let's show the UI right away 613b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // to avoid flicker. 614b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn refreshUi(true); 615b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 616b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 617b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn 618508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn void updateTimes() { 619508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn if (mSnippetActiveItem != null) { 620ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mSnippetActiveItem.updateTime(getActivity(), mBuilder); 621508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn } 622508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn for (int i=0; i<mActiveDetails.size(); i++) { 623ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mActiveDetails.get(i).mActiveItem.updateTime(getActivity(), mBuilder); 624508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn } 625508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn } 626508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn 627508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn @Override 628508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn public void onRefreshUi(int what) { 6298fda756e698c21f08992b9606dd3791c4755122cAmith Yamasani if (getActivity() == null) return; 630508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn switch (what) { 631508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn case REFRESH_TIME: 632508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn updateTimes(); 633508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn break; 634508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn case REFRESH_DATA: 635508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn refreshUi(false); 636508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn updateTimes(); 637508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn break; 638508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn case REFRESH_STRUCTURE: 639508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn refreshUi(true); 640508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn updateTimes(); 641508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn break; 642508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn } 643508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn } 644728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn} 645