InstalledAppDetails.java revision ad1482712de6e7cac803ed02abcdc2efb47d43ba
1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); you may not 7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * use this file except in compliance with the License. You may obtain a copy 8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * of the License at 9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * License for the specific language governing permissions and limitations 16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * under the License. 17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 19afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings; 20afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.settings.R; 22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Activity; 23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.ActivityManager; 24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.AlertDialog; 2550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.app.Dialog; 2642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapuimport android.app.ActivityManager.RunningAppProcessInfo; 27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.DialogInterface; 29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.IntentFilter; 31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.ApplicationInfo; 32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageDataObserver; 3350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.content.pm.IPackageDeleteObserver; 34ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapuimport android.content.pm.IPackageMoveObserver; 35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageStatsObserver; 3650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.content.pm.PackageInfo; 37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager; 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageStats; 39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException; 40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.Uri; 41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Handler; 43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Message; 4450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.os.RemoteException; 45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.format.Formatter; 46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Config; 47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log; 48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList; 49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List; 50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.ComponentName; 51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AppSecurityPermissions; 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button; 54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView; 55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.LinearLayout; 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView; 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display application information from Settings. This activity presents 60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * extended information associated with a package like code, data, total size, permissions 61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * used by the application and also the set of default launchable activities. 62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For system applications, an option to clear user data is displayed only if data size is > 0. 63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * System applications that do not want clear user data do not have this option. 64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For non-system applications, there is no option to clear data. Instead there is an option to 65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * uninstall the application. 66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 6742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapupublic class InstalledAppDetails extends Activity implements View.OnClickListener { 68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String TAG="InstalledAppDetails"; 69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int _UNKNOWN_APP=R.string.unknown; 70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private ApplicationInfo mAppInfo; 7142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private Button mUninstallButton; 7242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private boolean mUpdatedSysApp = false; 73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mActivitiesButton; 7450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private boolean localLOGV = false; 7550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private TextView mAppVersion; 76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mTotalSize; 77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mAppSize; 78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mDataSize; 79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private PkgSizeObserver mSizeObserver; 80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private ClearUserDataObserver mClearDataObserver; 81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Views related to cache info 82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mCacheSize; 83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mClearCacheButton; 84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private ClearCacheObserver mClearCacheObserver; 85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mForceStopButton; 8642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private Button mClearDataButton; 8742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private Button mMoveAppButton; 88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project PackageStats mSizeInfo; 90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private PackageManager mPm; 91ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private PackageMoveObserver mPackageMoveObserver; 92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //internal constants used in Handler 94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int OP_SUCCESSFUL = 1; 95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int OP_FAILED = 2; 96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int CLEAR_USER_DATA = 1; 97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int GET_PKG_SIZE = 2; 98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int CLEAR_CACHE = 3; 99ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private static final int PACKAGE_MOVE = 4; 100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String ATTR_PACKAGE_STATS="PackageStats"; 101afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // invalid size value used initially and also when size retrieval through PackageManager 103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // fails for whatever reason 104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int SIZE_INVALID = -1; 105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Resource strings 107afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mInvalidSizeStr; 108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mComputingStr; 109afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 11050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Dialog identifiers used in showDialog 11150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_BASE = 0; 11250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_CLEAR_DATA = DLG_BASE + 1; 11350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_FACTORY_RESET = DLG_BASE + 2; 11450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_APP_NOT_FOUND = DLG_BASE + 3; 11550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_CANNOT_CLEAR_DATA = DLG_BASE + 4; 11642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private static final int DLG_FORCE_STOP = DLG_BASE + 5; 117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Handler mHandler = new Handler() { 119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void handleMessage(Message msg) { 120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project switch (msg.what) { 121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case CLEAR_USER_DATA: 122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project processClearMsg(msg); 123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case GET_PKG_SIZE: 125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project refreshSizeInfo(msg); 126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case CLEAR_CACHE: 128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Refresh size info 129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver); 130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 131ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu case PACKAGE_MOVE: 132ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu processMoveMsg(msg); 133ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu break; 134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project default: 135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }; 139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project class ClearUserDataObserver extends IPackageDataObserver.Stub { 141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onRemoveCompleted(final String packageName, final boolean succeeded) { 142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA); 143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED; 144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mHandler.sendMessage(msg); 145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project class PkgSizeObserver extends IPackageStatsObserver.Stub { 149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) { 150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Message msg = mHandler.obtainMessage(GET_PKG_SIZE); 151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Bundle data = new Bundle(); 152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project data.putParcelable(ATTR_PACKAGE_STATS, pStats); 153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project msg.setData(data); 154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mHandler.sendMessage(msg); 155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 15850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project class ClearCacheObserver extends IPackageDataObserver.Stub { 160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onRemoveCompleted(final String packageName, final boolean succeeded) { 161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final Message msg = mHandler.obtainMessage(CLEAR_CACHE); 162ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu msg.arg1 = succeeded ? OP_SUCCESSFUL:OP_FAILED; 163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mHandler.sendMessage(msg); 164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 166ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu 167ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu class PackageMoveObserver extends IPackageMoveObserver.Stub { 168ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu public void packageMoved(String packageName, int returnCode) throws RemoteException { 169ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu final Message msg = mHandler.obtainMessage(PACKAGE_MOVE); 170ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu msg.arg1 = returnCode; 171ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mHandler.sendMessage(msg); 172ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 173ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String getSizeStr(long size) { 176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (size == SIZE_INVALID) { 177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return mInvalidSizeStr.toString(); 178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return Formatter.formatFileSize(this, size); 180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 18242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void initDataButtons() { 18342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (mAppInfo.manageSpaceActivityName != null) { 18442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.manage_space_text); 18542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 18642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.clear_user_data_text); 18742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 18842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setOnClickListener(this); 189ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu initMoveButton(); 190ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 191ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu 192ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private void initMoveButton() { 19342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu String pkgName = mAppInfo.packageName; 19442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu boolean dataOnly = false; 19542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu ApplicationInfo info1 = null; 19642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 19742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu try { 19842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu info1 = mPm.getApplicationInfo(pkgName, 0); 19942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } catch (NameNotFoundException e) { 20042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 20142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu dataOnly = (info1 == null) && (mAppInfo != null); 202ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu boolean moveDisable = true; 20342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (dataOnly) { 20442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mMoveAppButton.setText(R.string.move_app); 20542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else if ((mAppInfo.flags & ApplicationInfo.FLAG_ON_SDCARD) != 0) { 20642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mMoveAppButton.setText(R.string.move_app_to_internal); 207ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu moveDisable = false; 20842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 209ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu moveDisable = (mAppInfo.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0 || 210ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu (mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0; 21142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mMoveAppButton.setText(R.string.move_app_to_sdcard); 21242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 213ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu if (moveDisable) { 214ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mMoveAppButton.setEnabled(false); 215ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } else { 216ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mMoveAppButton.setOnClickListener(this); 217ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mMoveAppButton.setEnabled(true); 218ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 21942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 22042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 22142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void initControlButtons() { 22242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUpdatedSysApp = (mAppInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0; 22342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu boolean enabled = true; 22442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (mUpdatedSysApp) { 22542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setText(R.string.app_factory_reset); 22642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else if ((mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0){ 22742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setText(R.string.uninstall_text); 22842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 22942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Disable uninstall for system apps 23042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu enabled = false; 23142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 23242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setEnabled(enabled); 23342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (enabled) { 23442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Register listener 23542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setOnClickListener(this); 23642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 23742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 23842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu List<RunningAppProcessInfo> rList = am.getRunningAppProcesses(); 23942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu boolean running = false; 24042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (rList != null) { 24142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu for (RunningAppProcessInfo info : rList) { 24242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (info.pkgList != null) { 24342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu for (String rpkg : info.pkgList) { 24442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (rpkg.equals(mAppInfo.packageName)) { 24542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu running = true; 24642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu break; 24742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 24842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 24942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 25042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 25142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 25242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mForceStopButton.setEnabled(running); 25342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (running) { 25442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mForceStopButton.setOnClickListener(this); 25542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 25642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 25742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 258afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** Called when the activity is first created. */ 259afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 260afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project protected void onCreate(Bundle icicle) { 261afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(icicle); 26250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Get package manager 263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm = getPackageManager(); 26450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Get application's name from intent 265afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Intent intent = getIntent(); 266afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final String packageName = intent.getStringExtra(ManageApplications.APP_PKG_NAME); 267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mComputingStr = getText(R.string.computing_size); 268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Try retrieving package stats again 269afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project CharSequence totalSizeStr, appSizeStr, dataSizeStr; 270afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project totalSizeStr = appSizeStr = dataSizeStr = mComputingStr; 271afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(localLOGV) Log.i(TAG, "Have to compute package sizes"); 272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSizeObserver = new PkgSizeObserver(); 273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project try { 274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppInfo = mPm.getApplicationInfo(packageName, 275afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project PackageManager.GET_UNINSTALLED_PACKAGES); 276afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } catch (NameNotFoundException e) { 277afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Log.e(TAG, "Exception when retrieving package:"+packageName, e); 27850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialogInner(DLG_APP_NOT_FOUND); 27950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return; 280afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 28150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setContentView(R.layout.installed_app_details); 282afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //TODO download str and download url 28350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Set default values on sizes 284afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize = (TextView)findViewById(R.id.total_size_text); 285afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize.setText(totalSizeStr); 286afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize = (TextView)findViewById(R.id.application_size_text); 287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize.setText(appSizeStr); 288afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize = (TextView)findViewById(R.id.data_size_text); 289afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize.setText(dataSizeStr); 29042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Get Control button panel 29142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu View btnPanel = findViewById(R.id.control_buttons_panel); 29242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mForceStopButton = (Button) btnPanel.findViewById(R.id.left_button); 29342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mForceStopButton.setText(R.string.force_stop); 29442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton = (Button)btnPanel.findViewById(R.id.right_button); 29542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu initControlButtons(); 29642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Initialize clear data and move install location buttons 29742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu View data_buttons_panel = findViewById(R.id.data_buttons_panel); 29842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton = (Button) data_buttons_panel.findViewById(R.id.left_button); 29942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mMoveAppButton = (Button) data_buttons_panel.findViewById(R.id.right_button); 300afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Cache section 301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize = (TextView) findViewById(R.id.cache_size_text); 302afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(mComputingStr); 303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheButton = (Button) findViewById(R.id.clear_cache_button); 30442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 30550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Get list of preferred activities 306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mActivitiesButton = (Button)findViewById(R.id.clear_activities_button); 307afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project List<ComponentName> prefActList = new ArrayList<ComponentName>(); 30850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Intent list cannot be null. so pass empty list 309afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project List<IntentFilter> intentList = new ArrayList<IntentFilter>(); 310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.getPreferredActivities(intentList, prefActList, packageName); 311afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(localLOGV) Log.i(TAG, "Have "+prefActList.size()+" number of activities in prefered list"); 312afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project TextView autoLaunchView = (TextView)findViewById(R.id.auto_launch); 313afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(prefActList.size() <= 0) { 31450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Disable clear activities button 315afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project autoLaunchView.setText(R.string.auto_launch_disable_text); 316afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mActivitiesButton.setEnabled(false); 317afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 318afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project autoLaunchView.setText(R.string.auto_launch_enable_text); 319afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mActivitiesButton.setOnClickListener(this); 320afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 321afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 32250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Security permissions section 323afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project LinearLayout permsView = (LinearLayout) findViewById(R.id.permissions_section); 324afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project AppSecurityPermissions asp = new AppSecurityPermissions(this, packageName); 325afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(asp.getPermissionCount() > 0) { 326afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project permsView.setVisibility(View.VISIBLE); 327afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Make the security sections header visible 328afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project LinearLayout securityList = (LinearLayout) permsView.findViewById( 329afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project R.id.security_settings_list); 330afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project securityList.addView(asp.getPermissionsView()); 331afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 332afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project permsView.setVisibility(View.GONE); 333afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 334afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 335afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 33650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private void refreshAppAttributes(PackageInfo pkgInfo) { 33750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setAppLabelAndIcon(); 33842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu initControlButtons(); 33942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu initDataButtons(); 34050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Version number of application 34150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setAppVersion(pkgInfo); 34250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Refresh size info 343a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu if (mAppInfo != null && mAppInfo.packageName != null) { 344a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver); 345a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu } 346a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu } 347a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu 34850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Utility method to set applicaiton label and icon. 34950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private void setAppLabelAndIcon() { 35050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu ((ImageView)findViewById(R.id.app_icon)).setImageDrawable(mAppInfo.loadIcon(mPm)); 35150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu //set application name TODO version 35250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu CharSequence appName = mAppInfo.loadLabel(mPm); 35350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu if(appName == null) { 35450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu appName = getString(_UNKNOWN_APP); 35550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 35650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu ((TextView)findViewById(R.id.app_name)).setText(appName); 35750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 35850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 35950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Utility method to set application version 36050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private void setAppVersion(PackageInfo pkgInfo) { 36150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Version number of application 36250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppVersion = ((TextView)findViewById(R.id.app_version)); 36350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu if (pkgInfo != null) { 36450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppVersion.setVisibility(View.VISIBLE); 36550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppVersion.setText(getString(R.string.version_text, 3668e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes String.valueOf(pkgInfo.versionName))); 36750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } else { 36850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppVersion.setVisibility(View.GONE); 36950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 37050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 37150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 37250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu @Override 37342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public void onResume() { 37442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu super.onResume(); 37550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu PackageInfo pkgInfo; 37650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Get application info again to refresh changed properties of application 37750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu try { 37850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppInfo = mPm.getApplicationInfo(mAppInfo.packageName, 37950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu PackageManager.GET_UNINSTALLED_PACKAGES); 3809f1900dc05773a0659030e21a8c2fa1641655669Dianne Hackborn pkgInfo = mPm.getPackageInfo(mAppInfo.packageName, 3819f1900dc05773a0659030e21a8c2fa1641655669Dianne Hackborn PackageManager.GET_UNINSTALLED_PACKAGES); 38250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } catch (NameNotFoundException e) { 38350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu Log.e(TAG, "Exception when retrieving package:" + mAppInfo.packageName, e); 38450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialogInner(DLG_APP_NOT_FOUND); 38550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return; 38650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 38750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu refreshAppAttributes(pkgInfo); 388afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 38942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 390afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void setIntentAndFinish(boolean finish, boolean appChanged) { 391afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(localLOGV) Log.i(TAG, "appChanged="+appChanged); 392afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Intent intent = new Intent(); 393afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project intent.putExtra(ManageApplications.APP_CHG, appChanged); 394afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project setResult(ManageApplications.RESULT_OK, intent); 395afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(finish) { 396afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project finish(); 397afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 398afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 399afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 400afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 401afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to handle get size info notification from observer when 402afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * the async operation from PackageManager is complete. The current user data 403afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * info has to be refreshed in the manage applications screen as well as the current screen. 404afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 405afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void refreshSizeInfo(Message msg) { 406afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project boolean changed = false; 407afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project PackageStats newPs = msg.getData().getParcelable(ATTR_PACKAGE_STATS); 408afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project long newTot = newPs.cacheSize+newPs.codeSize+newPs.dataSize; 409afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(mSizeInfo == null) { 410afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSizeInfo = newPs; 411afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String str = getSizeStr(newTot); 412afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize.setText(str); 413afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize.setText(getSizeStr(newPs.codeSize)); 414afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize.setText(getSizeStr(newPs.dataSize)); 415afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(getSizeStr(newPs.cacheSize)); 416afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 417afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project long oldTot = mSizeInfo.cacheSize+mSizeInfo.codeSize+mSizeInfo.dataSize; 418afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newTot != oldTot) { 419afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String str = getSizeStr(newTot); 420afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize.setText(str); 421afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 422afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 423afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newPs.codeSize != mSizeInfo.codeSize) { 424afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize.setText(getSizeStr(newPs.codeSize)); 425afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 426afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 427afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newPs.dataSize != mSizeInfo.dataSize) { 428afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize.setText(getSizeStr(newPs.dataSize)); 429afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 430afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 431afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newPs.cacheSize != mSizeInfo.cacheSize) { 432afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(getSizeStr(newPs.cacheSize)); 433afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 434afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 435afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(changed) { 436afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSizeInfo = newPs; 437afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 438afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 43942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // If data size is zero disable clear data button 44042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (newPs.dataSize == 0) { 44142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(false); 442afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 44342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu long data = mSizeInfo.dataSize; 444afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project refreshCacheInfo(newPs.cacheSize); 445afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 446afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 447afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void refreshCacheInfo(long cacheSize) { 448afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Set cache info 449afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(getSizeStr(cacheSize)); 450afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (cacheSize <= 0) { 451afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheButton.setEnabled(false); 452afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 453afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheButton.setOnClickListener(this); 454afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 455afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 456afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 457afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 458afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to handle clear message notification from observer when 459afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * the async operation from PackageManager is complete 460afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 461afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void processClearMsg(Message msg) { 462afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int result = msg.arg1; 463afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String packageName = mAppInfo.packageName; 46442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.clear_user_data_text); 465afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(result == OP_SUCCESSFUL) { 46642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Log.i(TAG, "Cleared user data for package : "+packageName); 467afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.getPackageSizeInfo(packageName, mSizeObserver); 468afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 46942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(true); 470afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 471afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 472ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu 473ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private void processMoveMsg(Message msg) { 474ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu int result = msg.arg1; 475ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu String packageName = mAppInfo.packageName; 476ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu if(result == PackageManager.MOVE_SUCCEEDED) { 477ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu Log.i(TAG, "Moved resources for " + packageName); 478ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu try { 479ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu // Reset flags 480ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mAppInfo = mPm.getApplicationInfo(packageName, 481ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu PackageManager.GET_UNINSTALLED_PACKAGES); 482ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu initMoveButton(); 483ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } catch (NameNotFoundException e) { 484ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu // TODO error handling 485ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 486ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } else { 487ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu // TODO Present a dialog indicating failure. 488ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 489ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 490afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 491afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 492afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to initiate clearing user data when the user clicks the clear data 493afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * button for a system package 494afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 49542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void initiateClearUserData() { 49642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(false); 49742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Invoke uninstall or clear user data based on sysPackage 498afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String packageName = mAppInfo.packageName; 49942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Log.i(TAG, "Clearing user data for package : " + packageName); 500afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(mClearDataObserver == null) { 501afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearDataObserver = new ClearUserDataObserver(); 502afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 503afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 504afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project boolean res = am.clearApplicationUserData(packageName, mClearDataObserver); 505afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(!res) { 50650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Clearing data failed for some obscure reason. Just log error for now 507afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Log.i(TAG, "Couldnt clear application user data for package:"+packageName); 50850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialogInner(DLG_CANNOT_CLEAR_DATA); 509afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 51042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.recompute_size); 511afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 512afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 513afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 51450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private void showDialogInner(int id) { 51550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu //removeDialog(id); 51650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialog(id); 51750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 51850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 51950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu @Override 52042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public Dialog onCreateDialog(int id, Bundle args) { 52150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu switch (id) { 52250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu case DLG_CLEAR_DATA: 52350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return new AlertDialog.Builder(this) 52450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setTitle(getString(R.string.clear_data_dlg_title)) 52550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 52650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setMessage(getString(R.string.clear_data_dlg_text)) 52742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setPositiveButton(R.string.dlg_ok, 52842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu new DialogInterface.OnClickListener() { 52942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 53042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Clear user data here 53142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu initiateClearUserData(); 53242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 53342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu }) 53442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setNegativeButton(R.string.dlg_cancel, null) 53550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .create(); 53650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu case DLG_FACTORY_RESET: 53750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return new AlertDialog.Builder(this) 53850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setTitle(getString(R.string.app_factory_reset_dlg_title)) 53950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 54050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setMessage(getString(R.string.app_factory_reset_dlg_text)) 54142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setPositiveButton(R.string.dlg_ok, 54242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu new DialogInterface.OnClickListener() { 54342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 54442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Clear user data here 54542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu uninstallPkg(mAppInfo.packageName); 54642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 54742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu }) 54842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setNegativeButton(R.string.dlg_cancel, null) 54950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .create(); 55050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu case DLG_APP_NOT_FOUND: 55150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return new AlertDialog.Builder(this) 55250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setTitle(getString(R.string.app_not_found_dlg_title)) 55350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 55450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setMessage(getString(R.string.app_not_found_dlg_title)) 55550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setNeutralButton(getString(R.string.dlg_ok), 55650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu new DialogInterface.OnClickListener() { 55750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 55850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu //force to recompute changed value 55950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setIntentAndFinish(true, true); 56050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 56150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu }) 56250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .create(); 56350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu case DLG_CANNOT_CLEAR_DATA: 56450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return new AlertDialog.Builder(this) 56550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setTitle(getString(R.string.clear_failed_dlg_title)) 56650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 56750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setMessage(getString(R.string.clear_failed_dlg_text)) 56850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setNeutralButton(R.string.dlg_ok, 56950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu new DialogInterface.OnClickListener() { 57050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 57142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(false); 57250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu //force to recompute changed value 57350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setIntentAndFinish(false, false); 57450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 57550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu }) 57650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .create(); 57742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu case DLG_FORCE_STOP: 57842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu return new AlertDialog.Builder(this) 57942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setTitle(getString(R.string.force_stop_dlg_title)) 58042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 58142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setMessage(getString(R.string.force_stop_dlg_text)) 58242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setPositiveButton(R.string.dlg_ok, 58342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu new DialogInterface.OnClickListener() { 58442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 58542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Force stop 58642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu forceStopPackage(mAppInfo.packageName); 58742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 58842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu }) 58942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setNegativeButton(R.string.dlg_cancel, null) 59042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .create(); 59150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 59250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return null; 59350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 59450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 59550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private void uninstallPkg(String packageName) { 59650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Create new intent to launch Uninstaller activity 59750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu Uri packageURI = Uri.parse("package:"+packageName); 59850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI); 59950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu startActivity(uninstallIntent); 60050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setIntentAndFinish(true, true); 60150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 60250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 60342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void forceStopPackage(String pkgName) { 60442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu ActivityManager am = (ActivityManager)getSystemService( 60542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Context.ACTIVITY_SERVICE); 60642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu am.forceStopPackage(pkgName); 60742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 60842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 609afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 610afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Method implementing functionality of buttons clicked 611afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * @see android.view.View.OnClickListener#onClick(android.view.View) 612afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 613afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onClick(View v) { 614afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String packageName = mAppInfo.packageName; 61542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if(v == mUninstallButton) { 61642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (mUpdatedSysApp) { 61750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialogInner(DLG_FACTORY_RESET); 61842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 61950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu uninstallPkg(packageName); 620afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 621afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if(v == mActivitiesButton) { 622afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.clearPackagePreferredActivities(packageName); 623afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mActivitiesButton.setEnabled(false); 62442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else if(v == mClearDataButton) { 62542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (mAppInfo.manageSpaceActivityName != null) { 62642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Intent intent = new Intent(Intent.ACTION_DEFAULT); 62742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu intent.setClassName(mAppInfo.packageName, mAppInfo.manageSpaceActivityName); 62842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu startActivityForResult(intent, -1); 62942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 63042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu showDialogInner(DLG_CLEAR_DATA); 63142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 632afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mClearCacheButton) { 633afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Lazy initialization of observer 634afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mClearCacheObserver == null) { 635afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheObserver = new ClearCacheObserver(); 636afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 637afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver); 638afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mForceStopButton) { 63942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // TODO Once framework supports a pre-broadcast to 64042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // actually find out if an application will be restarted right 64142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // after its killed, there is no way we can determine if 64242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // a force stop will really kill the app. So just ignore 64342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // the dialog for now and force stop the package. Please note 64442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // that the button cannot be enabled or disabled since 64542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // we do not have this info for now. 64642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu forceStopPackage(mAppInfo.packageName); 647ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } else if (v == mMoveAppButton) { 648ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu if (mPackageMoveObserver == null) { 649ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mPackageMoveObserver = new PackageMoveObserver(); 650ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 651ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu int moveFlags = (mAppInfo.flags & ApplicationInfo.FLAG_ON_SDCARD) != 0 ? 652ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu PackageManager.MOVE_INTERNAL : PackageManager.MOVE_EXTERNAL_MEDIA; 653ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mMoveAppButton.setText(R.string.moving); 654ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mMoveAppButton.setEnabled(false); 655ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mPm.movePackage(mAppInfo.packageName, mPackageMoveObserver, moveFlags); 656afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 657afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 658afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 659afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 660