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; 294d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.provider.Settings; 30728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.util.Log; 31728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.view.LayoutInflater; 32728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.view.View; 33728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.view.ViewGroup; 344d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport android.widget.Button; 35728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.widget.TextView; 36728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 374d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.File; 384d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.FileInputStream; 394d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.FileOutputStream; 404d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackbornimport java.io.IOException; 41728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport java.util.ArrayList; 42728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 43ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornpublic class RunningServiceDetails extends Fragment 44508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn implements RunningState.OnRefreshUiListener { 45728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn static final String TAG = "RunningServicesDetails"; 46728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 47728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn static final String KEY_UID = "uid"; 48728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn static final String KEY_PROCESS = "process"; 491337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn static final String KEY_BACKGROUND = "background"; 50728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 51b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn static final int DIALOG_CONFIRM_STOP = 1; 52b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn 53728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ActivityManager mAm; 54728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn LayoutInflater mInflater; 55728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 56728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn RunningState mState; 57b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn boolean mHaveData; 58728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 59728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn int mUid; 60728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn String mProcessName; 611337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn boolean mShowBackground; 62728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 63728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn RunningState.MergedItem mMergedItem; 64728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 65ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn View mRootView; 66728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ViewGroup mAllDetails; 67728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ViewGroup mSnippet; 68728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn RunningProcessesView.ActiveItem mSnippetActiveItem; 69728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn RunningProcessesView.ViewHolder mSnippetViewHolder; 70728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 71c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn int mNumServices, mNumProcesses; 72c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 73728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn TextView mServicesHeader; 74728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn TextView mProcessesHeader; 75728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final ArrayList<ActiveDetail> mActiveDetails = new ArrayList<ActiveDetail>(); 76728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 77728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn class ActiveDetail implements View.OnClickListener { 78728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn View mRootView; 794d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn Button mStopButton; 804d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn Button mReportButton; 814d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn RunningState.ServiceItem mServiceItem; 82728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn RunningProcessesView.ActiveItem mActiveItem; 83728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn RunningProcessesView.ViewHolder mViewHolder; 84728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn PendingIntent mManageIntent; 854d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn ComponentName mInstaller; 86728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 87b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn void stopActiveService(boolean confirmed) { 88b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn RunningState.ServiceItem si = mServiceItem; 89b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn if (!confirmed) { 90b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn if ((si.mServiceInfo.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) != 0) { 91ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn showConfirmStopDialog(si.mRunningService.service); 92b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn return; 93b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 94b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 95ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn getActivity().stopService(new Intent().setComponent(si.mRunningService.service)); 961337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn if (mMergedItem == null) { 971337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn // If this is gone, we are gone. 981337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mState.updateNow(); 991337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn finish(); 1001337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else if (!mShowBackground && mMergedItem.mServices.size() <= 1) { 101b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // If there was only one service, we are finishing it, 102b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // so no reason for the UI to stick around. 1031337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mState.updateNow(); 104b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn finish(); 105b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } else { 106b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn mState.updateNow(); 107b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 108b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 109b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn 110728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public void onClick(View v) { 1114d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn if (v == mReportButton) { 1124d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn ApplicationErrorReport report = new ApplicationErrorReport(); 1134d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn report.type = ApplicationErrorReport.TYPE_RUNNING_SERVICE; 1144d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn report.packageName = mServiceItem.mServiceInfo.packageName; 1154d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn report.installerPackageName = mInstaller.getPackageName(); 1164d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn report.processName = mServiceItem.mRunningService.process; 1174d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn report.time = System.currentTimeMillis(); 1184d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn report.systemApp = (mServiceItem.mServiceInfo.applicationInfo.flags 1194d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn & ApplicationInfo.FLAG_SYSTEM) != 0; 1204d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn ApplicationErrorReport.RunningServiceInfo info 1214d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn = new ApplicationErrorReport.RunningServiceInfo(); 122be5994d20152c7194aac79eb8152240655fd3373Dianne Hackborn if (mActiveItem.mFirstRunTime >= 0) { 123be5994d20152c7194aac79eb8152240655fd3373Dianne Hackborn info.durationMillis = SystemClock.elapsedRealtime()-mActiveItem.mFirstRunTime; 1244d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } else { 1254d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn info.durationMillis = -1; 1264d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } 1274d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn ComponentName comp = new ComponentName(mServiceItem.mServiceInfo.packageName, 1284d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn mServiceItem.mServiceInfo.name); 129ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn File filename = getActivity().getFileStreamPath("service_dump.txt"); 1304d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn FileOutputStream output = null; 1314d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn try { 1324d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn output = new FileOutputStream(filename); 1334d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn Debug.dumpService("activity", output.getFD(), 1344d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn new String[] { "-a", "service", comp.flattenToString() }); 1354d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } catch (IOException e) { 1364d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn Log.w(TAG, "Can't dump service: " + comp, e); 1374d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } finally { 1384d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn if (output != null) try { output.close(); } catch (IOException e) {} 1394d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } 1404d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn FileInputStream input = null; 1414d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn try { 1424d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn input = new FileInputStream(filename); 1434d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn byte[] buffer = new byte[(int) filename.length()]; 1444d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn input.read(buffer); 1454d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn info.serviceDetails = new String(buffer); 1464d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } catch (IOException e) { 1474d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn Log.w(TAG, "Can't read service dump: " + comp, e); 1484d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } finally { 1494d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn if (input != null) try { input.close(); } catch (IOException e) {} 1504d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } 1514d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn filename.delete(); 1524d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn Log.i(TAG, "Details: " + info.serviceDetails); 1534d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn report.runningServiceInfo = info; 1544d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn Intent result = new Intent(Intent.ACTION_APP_ERROR); 1554d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn result.setComponent(mInstaller); 1564d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn result.putExtra(Intent.EXTRA_BUG_REPORT, report); 1574d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn result.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 1584d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn startActivity(result); 1594d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn return; 1604d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } 1614d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn 162728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (mManageIntent != null) { 163728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn try { 164ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn getActivity().startIntentSender(mManageIntent.getIntentSender(), null, 165728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn Intent.FLAG_ACTIVITY_NEW_TASK 166728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET, 167728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET, 0); 168728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } catch (IntentSender.SendIntentException e) { 169728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn Log.w(TAG, e); 170728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } catch (IllegalArgumentException e) { 171728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn Log.w(TAG, e); 172728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } catch (ActivityNotFoundException e) { 173728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn Log.w(TAG, e); 174728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 175b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } else if (mServiceItem != null) { 176b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn stopActiveService(false); 1771337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else if (mActiveItem.mItem.mBackground) { 1781337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn // Background process. Just kill it. 1791337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn mAm.killBackgroundProcesses(mActiveItem.mItem.mPackageInfo.packageName); 1801337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn finish(); 181c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } else { 182c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn // Heavy-weight process. We'll do a force-stop on it. 183c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mAm.forceStopPackage(mActiveItem.mItem.mPackageInfo.packageName); 184c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn finish(); 185728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 186728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 187728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 188728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 189728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn StringBuilder mBuilder = new StringBuilder(128); 190728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 191728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn boolean findMergedItem() { 192728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn RunningState.MergedItem item = null; 1931337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn ArrayList<RunningState.MergedItem> newItems = mShowBackground 1941337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn ? mState.getCurrentBackgroundItems() : mState.getCurrentMergedItems(); 195728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (newItems != null) { 196728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (int i=0; i<newItems.size(); i++) { 197728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn RunningState.MergedItem mi = newItems.get(i); 198728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (mi.mProcess.mUid == mUid 199728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn && mi.mProcess.mProcessName.equals(mProcessName)) { 200728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn item = mi; 201728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn break; 202728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 203728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 204728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 2051337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn 206728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (mMergedItem != item) { 207728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mMergedItem = item; 208728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return true; 209728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 210728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return false; 211728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 212728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 213c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn void addServiceDetailsView(RunningState.ServiceItem si, RunningState.MergedItem mi) { 214c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn if (mNumServices == 0) { 215c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mServicesHeader = (TextView)mInflater.inflate(R.layout.separator_label, 216c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mAllDetails, false); 217c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mServicesHeader.setText(R.string.runningservicedetails_services_title); 218c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mAllDetails.addView(mServicesHeader); 219c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 220c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mNumServices++; 221c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 222c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn RunningState.BaseItem bi = si != null ? si : mi; 223c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 224c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn ActiveDetail detail = new ActiveDetail(); 225c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn View root = mInflater.inflate(R.layout.running_service_details_service, 226c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mAllDetails, false); 227c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mAllDetails.addView(root); 228c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn detail.mRootView = root; 2294d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn detail.mServiceItem = si; 230c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn detail.mViewHolder = new RunningProcessesView.ViewHolder(root); 231c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn detail.mActiveItem = detail.mViewHolder.bind(mState, bi, mBuilder); 232c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 233c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn if (si != null && si.mRunningService.clientLabel != 0) { 234c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn detail.mManageIntent = mAm.getRunningServiceControlPanel( 235c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn si.mRunningService.service); 236c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 237c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 238c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn TextView description = (TextView)root.findViewById(R.id.comp_description); 239c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn if (si != null && si.mServiceInfo.descriptionRes != 0) { 240ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn description.setText(getActivity().getPackageManager().getText( 241c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn si.mServiceInfo.packageName, si.mServiceInfo.descriptionRes, 242c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn si.mServiceInfo.applicationInfo)); 243c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } else { 2441337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn if (mi.mBackground) { 2451337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn description.setText(R.string.background_process_stop_description); 2461337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn } else if (detail.mManageIntent != null) { 247c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn try { 248ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn Resources clientr = getActivity().getPackageManager().getResourcesForApplication( 249c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn si.mRunningService.clientPackage); 250c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn String label = clientr.getString(si.mRunningService.clientLabel); 251ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn description.setText(getActivity().getString(R.string.service_manage_description, 252c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn label)); 253c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } catch (PackageManager.NameNotFoundException e) { 254c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 255c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } else { 256ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn description.setText(getActivity().getText(si != null 257c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn ? R.string.service_stop_description 258c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn : R.string.heavy_weight_stop_description)); 259c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 260c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 261c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 2624d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn detail.mStopButton = (Button)root.findViewById(R.id.left_button); 2634d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn detail.mStopButton.setOnClickListener(detail); 264ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn detail.mStopButton.setText(getActivity().getText(detail.mManageIntent != null 265c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn ? R.string.service_manage : R.string.service_stop)); 2664d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn 2674d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn detail.mReportButton = (Button)root.findViewById(R.id.right_button); 2684d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn detail.mReportButton.setOnClickListener(detail); 2694d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn detail.mReportButton.setText(com.android.internal.R.string.report); 2704d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn // check if error reporting is enabled in secure settings 271ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn int enabled = Settings.Secure.getInt(getActivity().getContentResolver(), 2724d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn Settings.Secure.SEND_ACTION_APP_ERROR, 0); 2731337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn if (enabled != 0 && si != null) { 2744d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn detail.mInstaller = ApplicationErrorReport.getErrorReportReceiver( 275ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn getActivity(), si.mServiceInfo.packageName, 276ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn si.mServiceInfo.applicationInfo.flags); 2774d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn detail.mReportButton.setEnabled(detail.mInstaller != null); 2784d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } else { 2794d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn detail.mReportButton.setEnabled(false); 2804d83bd2dbd6cd068ef770ec960c24414e8aa6391Dianne Hackborn } 281c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 282c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mActiveDetails.add(detail); 283c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 284c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 285c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn void addProcessDetailsView(RunningState.ProcessItem pi, boolean isMain) { 286c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn if (mNumProcesses == 0) { 287c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mProcessesHeader = (TextView)mInflater.inflate(R.layout.separator_label, 288c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mAllDetails, false); 289c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mProcessesHeader.setText(R.string.runningservicedetails_processes_title); 290c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mAllDetails.addView(mProcessesHeader); 291c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 292c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mNumProcesses++; 293c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 294c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn ActiveDetail detail = new ActiveDetail(); 295c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn View root = mInflater.inflate(R.layout.running_service_details_process, 296c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mAllDetails, false); 297c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mAllDetails.addView(root); 298c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn detail.mRootView = root; 299c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn detail.mViewHolder = new RunningProcessesView.ViewHolder(root); 300c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn detail.mActiveItem = detail.mViewHolder.bind(mState, pi, mBuilder); 301c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 302c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn TextView description = (TextView)root.findViewById(R.id.comp_description); 303c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn if (isMain) { 304c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn description.setText(R.string.main_running_process_description); 305c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } else { 306c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn int textid = 0; 307c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn CharSequence label = null; 308c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn ActivityManager.RunningAppProcessInfo rpi = pi.mRunningProcessInfo; 309c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn final ComponentName comp = rpi.importanceReasonComponent; 310c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn //Log.i(TAG, "Secondary proc: code=" + rpi.importanceReasonCode 311c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn // + " pid=" + rpi.importanceReasonPid + " comp=" + comp); 312c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn switch (rpi.importanceReasonCode) { 313c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn case ActivityManager.RunningAppProcessInfo.REASON_PROVIDER_IN_USE: 314c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn textid = R.string.process_provider_in_use_description; 3155774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn if (rpi.importanceReasonComponent != null) { 3165774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn try { 317ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn ProviderInfo prov = getActivity().getPackageManager().getProviderInfo( 3185774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn rpi.importanceReasonComponent, 0); 319ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn label = RunningState.makeLabel(getActivity().getPackageManager(), 3205774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn prov.name, prov); 3215774d5d34b2339135feab01b998fcd111ebdde4dDianne Hackborn } catch (NameNotFoundException e) { 322c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 323c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 324c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn break; 325c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn case ActivityManager.RunningAppProcessInfo.REASON_SERVICE_IN_USE: 326c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn textid = R.string.process_service_in_use_description; 327c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn if (rpi.importanceReasonComponent != null) { 328c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn try { 329ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn ServiceInfo serv = getActivity().getPackageManager().getServiceInfo( 330c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn rpi.importanceReasonComponent, 0); 331ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn label = RunningState.makeLabel(getActivity().getPackageManager(), 332c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn serv.name, serv); 333c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } catch (NameNotFoundException e) { 334c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 335c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 336c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn break; 337c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 338c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn if (textid != 0 && label != null) { 339ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn description.setText(getActivity().getString(textid, label)); 340c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 341c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 342c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 343c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mActiveDetails.add(detail); 344c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 345c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 346728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn void addDetailViews() { 347728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (int i=mActiveDetails.size()-1; i>=0; i--) { 348728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mAllDetails.removeView(mActiveDetails.get(i).mRootView); 349728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 350728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mActiveDetails.clear(); 351728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 352728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (mServicesHeader != null) { 353728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mAllDetails.removeView(mServicesHeader); 354728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mServicesHeader = null; 355728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 356728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 357728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (mProcessesHeader != null) { 358728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mAllDetails.removeView(mProcessesHeader); 359728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mProcessesHeader = null; 360728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 361728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 362c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn mNumServices = mNumProcesses = 0; 363c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 364728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (mMergedItem != null) { 365728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (int i=0; i<mMergedItem.mServices.size(); i++) { 366c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn addServiceDetailsView(mMergedItem.mServices.get(i), mMergedItem); 367c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn } 368c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn 369c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn if (mMergedItem.mServices.size() <= 0) { 370c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn // This item does not have any services, so it must be 3711337d0f70b18dd732c6a617be83e5be0bb8f2f87Dianne Hackborn // another interesting process... we will put a fake service 372c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn // entry for it, to allow the user to "stop" it. 373c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn addServiceDetailsView(null, mMergedItem); 374728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 375728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 376728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (int i=-1; i<mMergedItem.mOtherProcesses.size(); i++) { 377728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn RunningState.ProcessItem pi = i < 0 ? mMergedItem.mProcess 378728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn : mMergedItem.mOtherProcesses.get(i); 379728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (pi.mPid <= 0) { 380728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn continue; 381728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 382728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 383c01b0c83fca571229621d16b757a46dc0fae7dfeDianne Hackborn addProcessDetailsView(pi, i < 0); 384728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 385728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 386728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 387728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 388728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn void refreshUi(boolean dataChanged) { 389728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (findMergedItem()) { 390728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn dataChanged = true; 391728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 392728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (dataChanged) { 393728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (mMergedItem != null) { 394728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mSnippetActiveItem = mSnippetViewHolder.bind(mState, 395728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mMergedItem, mBuilder); 396728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } else if (mSnippetActiveItem != null) { 397728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // Clear whatever is currently being shown. 398728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mSnippetActiveItem.mHolder.size.setText(""); 399728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mSnippetActiveItem.mHolder.uptime.setText(""); 400728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mSnippetActiveItem.mHolder.description.setText(R.string.no_services); 401728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } else { 402728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // No merged item, never had one. Nothing to do. 403728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn finish(); 404728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return; 405728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 406728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn addDetailViews(); 407728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 408728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 409728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 410ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn private void finish() { 41125bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn (new Handler()).post(new Runnable() { 41225bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn @Override 41325bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn public void run() { 41425bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn Activity a = getActivity(); 41525bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn if (a != null) { 41625bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn a.onBackPressed(); 41725bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn } 41825bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn } 41925bda17a57321c8cf599673248d2e35d692ad51eDianne Hackborn }); 420ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 421ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 422728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 423ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public void onCreate(Bundle savedInstanceState) { 424728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onCreate(savedInstanceState); 425728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 426ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mUid = getArguments().getInt(KEY_UID, 0); 427ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mProcessName = getArguments().getString(KEY_PROCESS); 428ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mShowBackground = getArguments().getBoolean(KEY_BACKGROUND, false); 429728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 430ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mAm = (ActivityManager)getActivity().getSystemService(Context.ACTIVITY_SERVICE); 431ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mInflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 432728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 433ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mState = RunningState.getInstance(getActivity()); 434ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 435ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 436ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn @Override 437ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 438ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn View view = mRootView = inflater.inflate(R.layout.running_service_details, null); 439728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 440ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mAllDetails = (ViewGroup)view.findViewById(R.id.all_details); 441ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mSnippet = (ViewGroup)view.findViewById(R.id.snippet); 442728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mSnippet.setPadding(0, mSnippet.getPaddingTop(), 0, mSnippet.getPaddingBottom()); 443728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mSnippetViewHolder = new RunningProcessesView.ViewHolder(mSnippet); 444b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn 445b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // We want to retrieve the data right now, so any active managed 446b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // dialog that gets created can find it. 447b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn ensureData(); 448ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 449ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn return view; 450728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 451728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 452728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 453ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public void onPause() { 454728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onPause(); 455b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn mHaveData = false; 456508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn mState.pause(); 457728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 458728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 459728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn @Override 460ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public void onResume() { 461728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super.onResume(); 462b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn ensureData(); 463728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 464728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 465b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn ActiveDetail activeDetailForService(ComponentName comp) { 466b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn for (int i=0; i<mActiveDetails.size(); i++) { 467b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn ActiveDetail ad = mActiveDetails.get(i); 468b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn if (ad.mServiceItem != null && ad.mServiceItem.mRunningService != null 469b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn && comp.equals(ad.mServiceItem.mRunningService.service)) { 470b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn return ad; 471b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 472b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 473b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn return null; 474b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 475b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn 476ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn private void showConfirmStopDialog(ComponentName comp) { 477ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn DialogFragment newFragment = MyAlertDialogFragment.newConfirmStop( 478ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn DIALOG_CONFIRM_STOP, comp); 479ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn newFragment.setTargetFragment(this, 0); 480ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn newFragment.show(getFragmentManager(), "confirmstop"); 481ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 482ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 483ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public static class MyAlertDialogFragment extends DialogFragment { 484ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 485ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public static MyAlertDialogFragment newConfirmStop(int id, ComponentName comp) { 486ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn MyAlertDialogFragment frag = new MyAlertDialogFragment(); 487ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn Bundle args = new Bundle(); 488ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn args.putInt("id", id); 489ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn args.putParcelable("comp", comp); 490ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn frag.setArguments(args); 491ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn return frag; 492ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 493ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 494ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn RunningServiceDetails getOwner() { 495ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn return (RunningServiceDetails)getTargetFragment(); 496ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 497ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 498ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn @Override 499ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public Dialog onCreateDialog(Bundle savedInstanceState) { 500ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn int id = getArguments().getInt("id"); 501ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn switch (id) { 502ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn case DIALOG_CONFIRM_STOP: { 503ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn final ComponentName comp = (ComponentName)getArguments().getParcelable("comp"); 504ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn if (getOwner().activeDetailForService(comp) == null) { 505ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn return null; 506ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 507ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn 508ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn return new AlertDialog.Builder(getActivity()) 509ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setTitle(getActivity().getString(R.string.runningservicedetails_stop_dlg_title)) 510ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setIcon(android.R.drawable.ic_dialog_alert) 511ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setMessage(getActivity().getString(R.string.runningservicedetails_stop_dlg_text)) 512ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setPositiveButton(R.string.dlg_ok, 513ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn new DialogInterface.OnClickListener() { 514ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn public void onClick(DialogInterface dialog, int which) { 515ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn ActiveDetail ad = getOwner().activeDetailForService(comp); 516ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn if (ad != null) { 517ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn ad.stopActiveService(true); 518ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 519b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 520ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn }) 521ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .setNegativeButton(R.string.dlg_cancel, null) 522ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn .create(); 523ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 524b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 525ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn throw new IllegalArgumentException("unknown id " + id); 526b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 527b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 528b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn 529b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn void ensureData() { 530b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn if (!mHaveData) { 531b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn mHaveData = true; 532b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn mState.resume(this); 533b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn 534b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // We want to go away if the service being shown no longer exists, 535b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // so we need to ensure we have done the initial data retrieval before 536b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // showing our ui. 537b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn mState.waitForData(); 538508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn 539b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // And since we know we have the data, let's show the UI right away 540b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn // to avoid flicker. 541b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn refreshUi(true); 542b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 543b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn } 544b8f9c9cf7c0343c6c05296bb7af8fdccdc3b7a3bDianne Hackborn 545508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn void updateTimes() { 546508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn if (mSnippetActiveItem != null) { 547ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mSnippetActiveItem.updateTime(getActivity(), mBuilder); 548508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn } 549508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn for (int i=0; i<mActiveDetails.size(); i++) { 550ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mActiveDetails.get(i).mActiveItem.updateTime(getActivity(), mBuilder); 551508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn } 552508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn } 553508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn 554508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn @Override 555508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn public void onRefreshUi(int what) { 5568fda756e698c21f08992b9606dd3791c4755122cAmith Yamasani if (getActivity() == null) return; 557508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn switch (what) { 558508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn case REFRESH_TIME: 559508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn updateTimes(); 560508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn break; 561508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn case REFRESH_DATA: 562508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn refreshUi(false); 563508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn updateTimes(); 564508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn break; 565508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn case REFRESH_STRUCTURE: 566508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn refreshUi(true); 567508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn updateTimes(); 568508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn break; 569508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn } 570508fedc4102790dcd7004e4962e2b540967b714bDianne Hackborn } 571728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn} 572