InstalledAppDetails.java revision 07f636059a2fb45f2d8284fedbbbba2c78b05157
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; 26cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackbornimport android.content.BroadcastReceiver; 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; 33ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapuimport android.content.pm.IPackageMoveObserver; 34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageStatsObserver; 3550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.content.pm.PackageInfo; 36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager; 37730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapuimport android.content.pm.PackageParser; 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.Log; 47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList; 48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List; 49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.ComponentName; 50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AppSecurityPermissions; 52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button; 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView; 54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.LinearLayout; 55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView; 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display application information from Settings. This activity presents 59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * extended information associated with a package like code, data, total size, permissions 60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * used by the application and also the set of default launchable activities. 61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For system applications, an option to clear user data is displayed only if data size is > 0. 62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * System applications that do not want clear user data do not have this option. 63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For non-system applications, there is no option to clear data. Instead there is an option to 64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * uninstall the application. 65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 6642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapupublic class InstalledAppDetails extends Activity implements View.OnClickListener { 67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String TAG="InstalledAppDetails"; 68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int _UNKNOWN_APP=R.string.unknown; 69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private ApplicationInfo mAppInfo; 7042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private Button mUninstallButton; 71de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu private boolean mMoveInProgress = false; 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; 885cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu private int mMoveErrorCode; 89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project PackageStats mSizeInfo; 91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private PackageManager mPm; 92ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private PackageMoveObserver mPackageMoveObserver; 93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //internal constants used in Handler 95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int OP_SUCCESSFUL = 1; 96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int OP_FAILED = 2; 97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int CLEAR_USER_DATA = 1; 98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int GET_PKG_SIZE = 2; 99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int CLEAR_CACHE = 3; 100ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private static final int PACKAGE_MOVE = 4; 101afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String ATTR_PACKAGE_STATS="PackageStats"; 102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // invalid size value used initially and also when size retrieval through PackageManager 104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // fails for whatever reason 105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int SIZE_INVALID = -1; 106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 107afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Resource strings 108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mInvalidSizeStr; 109afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mComputingStr; 110afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 11150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Dialog identifiers used in showDialog 11250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_BASE = 0; 11350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_CLEAR_DATA = DLG_BASE + 1; 11450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_FACTORY_RESET = DLG_BASE + 2; 11550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_APP_NOT_FOUND = DLG_BASE + 3; 11650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_CANNOT_CLEAR_DATA = DLG_BASE + 4; 11742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private static final int DLG_FORCE_STOP = DLG_BASE + 5; 1185cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu private static final int DLG_MOVE_FAILED = DLG_BASE + 6; 119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Handler mHandler = new Handler() { 121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void handleMessage(Message msg) { 12207f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn // If the activity is gone, don't process any more messages. 12307f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn if (isFinishing()) { 12407f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn return; 12507f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn } 126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project switch (msg.what) { 127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case CLEAR_USER_DATA: 128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project processClearMsg(msg); 129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case GET_PKG_SIZE: 131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project refreshSizeInfo(msg); 132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case CLEAR_CACHE: 134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Refresh size info 135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver); 136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 137ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu case PACKAGE_MOVE: 138ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu processMoveMsg(msg); 139ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu break; 140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project default: 141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }; 145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project class ClearUserDataObserver extends IPackageDataObserver.Stub { 147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onRemoveCompleted(final String packageName, final boolean succeeded) { 148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA); 149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED; 150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mHandler.sendMessage(msg); 151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project class PkgSizeObserver extends IPackageStatsObserver.Stub { 155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) { 156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Message msg = mHandler.obtainMessage(GET_PKG_SIZE); 157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Bundle data = new Bundle(); 158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project data.putParcelable(ATTR_PACKAGE_STATS, pStats); 159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project msg.setData(data); 160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mHandler.sendMessage(msg); 161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 16450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project class ClearCacheObserver extends IPackageDataObserver.Stub { 166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onRemoveCompleted(final String packageName, final boolean succeeded) { 167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final Message msg = mHandler.obtainMessage(CLEAR_CACHE); 168ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu msg.arg1 = succeeded ? OP_SUCCESSFUL:OP_FAILED; 169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mHandler.sendMessage(msg); 170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 172ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu 173ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu class PackageMoveObserver extends IPackageMoveObserver.Stub { 174ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu public void packageMoved(String packageName, int returnCode) throws RemoteException { 175ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu final Message msg = mHandler.obtainMessage(PACKAGE_MOVE); 176ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu msg.arg1 = returnCode; 177ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mHandler.sendMessage(msg); 178ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 179ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String getSizeStr(long size) { 182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (size == SIZE_INVALID) { 183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return mInvalidSizeStr.toString(); 184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return Formatter.formatFileSize(this, size); 186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 18842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void initDataButtons() { 18942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (mAppInfo.manageSpaceActivityName != null) { 19042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.manage_space_text); 19142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 19242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.clear_user_data_text); 19342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 19442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setOnClickListener(this); 195ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 196ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu 1975cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu private CharSequence getMoveErrMsg(int errCode) { 1985cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu switch (errCode) { 1995cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu case PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE: 2005cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu return getString(R.string.insufficient_storage); 2015cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu case PackageManager.MOVE_FAILED_DOESNT_EXIST: 2025cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu return getString(R.string.does_not_exist); 2035cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu case PackageManager.MOVE_FAILED_FORWARD_LOCKED: 2045cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu return getString(R.string.app_forward_locked); 2055cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu case PackageManager.MOVE_FAILED_INVALID_LOCATION: 2065cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu return getString(R.string.invalid_location); 2075cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu case PackageManager.MOVE_FAILED_SYSTEM_PACKAGE: 2085cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu return getString(R.string.system_package); 2099a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu case PackageManager.MOVE_FAILED_INTERNAL_ERROR: 2109a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu return ""; 2115cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu } 2129a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu return ""; 2135cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu } 2145cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu 215ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private void initMoveButton() { 21642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu String pkgName = mAppInfo.packageName; 21742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu boolean dataOnly = false; 21842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu ApplicationInfo info1 = null; 219730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu PackageInfo pkgInfo = null; 22042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 22142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu try { 22242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu info1 = mPm.getApplicationInfo(pkgName, 0); 223730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu pkgInfo = mPm.getPackageInfo(mAppInfo.packageName, 224730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu PackageManager.GET_UNINSTALLED_PACKAGES); 22542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } catch (NameNotFoundException e) { 22642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 22742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu dataOnly = (info1 == null) && (mAppInfo != null); 228ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu boolean moveDisable = true; 22942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (dataOnly) { 23042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mMoveAppButton.setText(R.string.move_app); 231d2b8efa494288ad01b1deb4449e39279bcd0d7fbSuchi Amalapurapu } else if ((mAppInfo.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) { 23242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mMoveAppButton.setText(R.string.move_app_to_internal); 233ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu moveDisable = false; 23442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 235ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu moveDisable = (mAppInfo.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0 || 236ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu (mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0; 23742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mMoveAppButton.setText(R.string.move_app_to_sdcard); 23842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 239730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu if (pkgInfo != null && pkgInfo.installLocation == 240730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY) { 241730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu // If an application explicitly specifies install location 242730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu // consider that 243730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu moveDisable = true; 244730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu } 245ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu if (moveDisable) { 246ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mMoveAppButton.setEnabled(false); 247ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } else { 248ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mMoveAppButton.setOnClickListener(this); 249ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mMoveAppButton.setEnabled(true); 250ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 25142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 25242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 253de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu private void initUninstallButtons() { 25442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUpdatedSysApp = (mAppInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0; 25542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu boolean enabled = true; 25642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (mUpdatedSysApp) { 25742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setText(R.string.app_factory_reset); 25842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else if ((mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0){ 25942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setText(R.string.uninstall_text); 26042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 26142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Disable uninstall for system apps 26242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu enabled = false; 26342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 26442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setEnabled(enabled); 26542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (enabled) { 26642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Register listener 26742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setOnClickListener(this); 26842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 26942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 27042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 271de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu private void initAppInfo(String packageName) { 272de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu try { 273de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mAppInfo = mPm.getApplicationInfo(packageName, 274de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu PackageManager.GET_UNINSTALLED_PACKAGES); 275de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } catch (NameNotFoundException e) { 276de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu Log.e(TAG, "Exception when retrieving package: " + packageName, e); 277de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu showDialogInner(DLG_APP_NOT_FOUND); 278de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu return; 279de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } 280de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } 281de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu 282afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** Called when the activity is first created. */ 283afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 284afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project protected void onCreate(Bundle icicle) { 285afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(icicle); 28650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Get package manager 287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm = getPackageManager(); 28850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Get application's name from intent 289afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Intent intent = getIntent(); 290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final String packageName = intent.getStringExtra(ManageApplications.APP_PKG_NAME); 291afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mComputingStr = getText(R.string.computing_size); 292afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Try retrieving package stats again 293afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project CharSequence totalSizeStr, appSizeStr, dataSizeStr; 294afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project totalSizeStr = appSizeStr = dataSizeStr = mComputingStr; 295afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(localLOGV) Log.i(TAG, "Have to compute package sizes"); 296afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSizeObserver = new PkgSizeObserver(); 297de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu initAppInfo(packageName); 29850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setContentView(R.layout.installed_app_details); 299afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //TODO download str and download url 30050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Set default values on sizes 301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize = (TextView)findViewById(R.id.total_size_text); 302afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize.setText(totalSizeStr); 303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize = (TextView)findViewById(R.id.application_size_text); 304afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize.setText(appSizeStr); 305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize = (TextView)findViewById(R.id.data_size_text); 306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize.setText(dataSizeStr); 30742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Get Control button panel 30842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu View btnPanel = findViewById(R.id.control_buttons_panel); 30942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mForceStopButton = (Button) btnPanel.findViewById(R.id.left_button); 31042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mForceStopButton.setText(R.string.force_stop); 31142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton = (Button)btnPanel.findViewById(R.id.right_button); 312cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn mForceStopButton.setEnabled(false); 31342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Initialize clear data and move install location buttons 31442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu View data_buttons_panel = findViewById(R.id.data_buttons_panel); 31542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton = (Button) data_buttons_panel.findViewById(R.id.left_button); 31642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mMoveAppButton = (Button) data_buttons_panel.findViewById(R.id.right_button); 317afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Cache section 318afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize = (TextView) findViewById(R.id.cache_size_text); 319afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(mComputingStr); 320afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheButton = (Button) findViewById(R.id.clear_cache_button); 32142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 32250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Get list of preferred activities 323afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mActivitiesButton = (Button)findViewById(R.id.clear_activities_button); 324afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project List<ComponentName> prefActList = new ArrayList<ComponentName>(); 32550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Intent list cannot be null. so pass empty list 326afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project List<IntentFilter> intentList = new ArrayList<IntentFilter>(); 327afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.getPreferredActivities(intentList, prefActList, packageName); 328afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(localLOGV) Log.i(TAG, "Have "+prefActList.size()+" number of activities in prefered list"); 329afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project TextView autoLaunchView = (TextView)findViewById(R.id.auto_launch); 330afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(prefActList.size() <= 0) { 33150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Disable clear activities button 332afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project autoLaunchView.setText(R.string.auto_launch_disable_text); 333afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mActivitiesButton.setEnabled(false); 334afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 335afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project autoLaunchView.setText(R.string.auto_launch_enable_text); 336afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mActivitiesButton.setOnClickListener(this); 337afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 338afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 33950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Security permissions section 340afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project LinearLayout permsView = (LinearLayout) findViewById(R.id.permissions_section); 341afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project AppSecurityPermissions asp = new AppSecurityPermissions(this, packageName); 342afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(asp.getPermissionCount() > 0) { 343afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project permsView.setVisibility(View.VISIBLE); 344afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Make the security sections header visible 345afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project LinearLayout securityList = (LinearLayout) permsView.findViewById( 346afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project R.id.security_settings_list); 347afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project securityList.addView(asp.getPermissionsView()); 348afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 349afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project permsView.setVisibility(View.GONE); 350afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 351afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 352f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu 35350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Utility method to set applicaiton label and icon. 354f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu private void setAppLabelAndIcon(PackageInfo pkgInfo) { 355f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu View appSnippet = findViewById(R.id.app_snippet); 356f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon); 357f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu icon.setImageDrawable(mAppInfo.loadIcon(mPm)); 358f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu // Set application name. 359f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu TextView label = (TextView) appSnippet.findViewById(R.id.app_name); 360f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu label.setText(mAppInfo.loadLabel(mPm)); 36150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Version number of application 362f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu mAppVersion = (TextView) appSnippet.findViewById(R.id.app_size); 363f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu 364f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu if (pkgInfo != null && pkgInfo.versionName != null) { 36550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppVersion.setVisibility(View.VISIBLE); 36650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppVersion.setText(getString(R.string.version_text, 3678e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes String.valueOf(pkgInfo.versionName))); 36850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } else { 369f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu mAppVersion.setVisibility(View.INVISIBLE); 37050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 37150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 37250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 37350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu @Override 37442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public void onResume() { 37542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu super.onResume(); 376de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu initAppInfo(mAppInfo.packageName); 377de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu PackageInfo pkgInfo = null; 37850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Get application info again to refresh changed properties of application 37950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu try { 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 } 387cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn checkForceStop(); 388de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu setAppLabelAndIcon(pkgInfo); 389de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu refreshButtons(); 390de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu // Refresh size info 391de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu if (mAppInfo != null && mAppInfo.packageName != null) { 392de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver); 393de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } 394afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 39542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 396afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void setIntentAndFinish(boolean finish, boolean appChanged) { 397afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(localLOGV) Log.i(TAG, "appChanged="+appChanged); 398afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Intent intent = new Intent(); 399afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project intent.putExtra(ManageApplications.APP_CHG, appChanged); 400afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project setResult(ManageApplications.RESULT_OK, intent); 401afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(finish) { 402afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project finish(); 403afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 404afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 405afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 406afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 407afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to handle get size info notification from observer when 408afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * the async operation from PackageManager is complete. The current user data 409afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * info has to be refreshed in the manage applications screen as well as the current screen. 410afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 411afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void refreshSizeInfo(Message msg) { 412afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project boolean changed = false; 413afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project PackageStats newPs = msg.getData().getParcelable(ATTR_PACKAGE_STATS); 414afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project long newTot = newPs.cacheSize+newPs.codeSize+newPs.dataSize; 415afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(mSizeInfo == null) { 416afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSizeInfo = newPs; 417afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String str = getSizeStr(newTot); 418afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize.setText(str); 419afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize.setText(getSizeStr(newPs.codeSize)); 420afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize.setText(getSizeStr(newPs.dataSize)); 421afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(getSizeStr(newPs.cacheSize)); 422afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 423afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project long oldTot = mSizeInfo.cacheSize+mSizeInfo.codeSize+mSizeInfo.dataSize; 424afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newTot != oldTot) { 425afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String str = getSizeStr(newTot); 426afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize.setText(str); 427afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 428afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 429afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newPs.codeSize != mSizeInfo.codeSize) { 430afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize.setText(getSizeStr(newPs.codeSize)); 431afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 432afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 433afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newPs.dataSize != mSizeInfo.dataSize) { 434afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize.setText(getSizeStr(newPs.dataSize)); 435afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 436afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 437afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newPs.cacheSize != mSizeInfo.cacheSize) { 438afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(getSizeStr(newPs.cacheSize)); 439afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 440afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 441afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(changed) { 442afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSizeInfo = newPs; 443afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 444afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 44542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // If data size is zero disable clear data button 44642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (newPs.dataSize == 0) { 44742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(false); 448afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 44942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu long data = mSizeInfo.dataSize; 450afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project refreshCacheInfo(newPs.cacheSize); 451afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 452afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 453afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void refreshCacheInfo(long cacheSize) { 454afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Set cache info 455afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(getSizeStr(cacheSize)); 456afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (cacheSize <= 0) { 457afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheButton.setEnabled(false); 458afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 459afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheButton.setOnClickListener(this); 460afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 461afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 462afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 463afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 464afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to handle clear message notification from observer when 465afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * the async operation from PackageManager is complete 466afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 467afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void processClearMsg(Message msg) { 468afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int result = msg.arg1; 469afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String packageName = mAppInfo.packageName; 47042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.clear_user_data_text); 471afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(result == OP_SUCCESSFUL) { 47242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Log.i(TAG, "Cleared user data for package : "+packageName); 473afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.getPackageSizeInfo(packageName, mSizeObserver); 474afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 47542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(true); 476afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 477afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 478ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu 479de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu private void refreshButtons() { 480de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu if (!mMoveInProgress) { 481de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu // Refresh application information again. 482de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu initAppInfo(mAppInfo.packageName); 483de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu initUninstallButtons(); 484de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu initDataButtons(); 485de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu initMoveButton(); 486de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } else { 487de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mMoveAppButton.setText(R.string.moving); 488de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mMoveAppButton.setEnabled(false); 489de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mUninstallButton.setEnabled(false); 490de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } 491de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } 492de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu 493ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private void processMoveMsg(Message msg) { 494ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu int result = msg.arg1; 495ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu String packageName = mAppInfo.packageName; 496de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu // Refresh the button attributes. 497de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mMoveInProgress = false; 498de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu refreshButtons(); 499ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu if(result == PackageManager.MOVE_SUCCEEDED) { 500ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu Log.i(TAG, "Moved resources for " + packageName); 501de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu // Refresh size information again. 502de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver); 503ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } else { 5045cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu mMoveErrorCode = result; 5055cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu showDialogInner(DLG_MOVE_FAILED); 506ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 507ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 5085cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu 509afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 510afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to initiate clearing user data when the user clicks the clear data 511afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * button for a system package 512afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 51342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void initiateClearUserData() { 51442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(false); 51542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Invoke uninstall or clear user data based on sysPackage 516afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String packageName = mAppInfo.packageName; 51742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Log.i(TAG, "Clearing user data for package : " + packageName); 518afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(mClearDataObserver == null) { 519afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearDataObserver = new ClearUserDataObserver(); 520afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 521afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 522afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project boolean res = am.clearApplicationUserData(packageName, mClearDataObserver); 523afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(!res) { 52450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Clearing data failed for some obscure reason. Just log error for now 525afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Log.i(TAG, "Couldnt clear application user data for package:"+packageName); 52650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialogInner(DLG_CANNOT_CLEAR_DATA); 527afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 52842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.recompute_size); 529afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 530afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 531afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 53250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private void showDialogInner(int id) { 53350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu //removeDialog(id); 53450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialog(id); 53550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 53650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 53750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu @Override 53842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public Dialog onCreateDialog(int id, Bundle args) { 53950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu switch (id) { 54050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu case DLG_CLEAR_DATA: 54150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return new AlertDialog.Builder(this) 54250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setTitle(getString(R.string.clear_data_dlg_title)) 54350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 54450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setMessage(getString(R.string.clear_data_dlg_text)) 54542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setPositiveButton(R.string.dlg_ok, 54642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu new DialogInterface.OnClickListener() { 54742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 54842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Clear user data here 54942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu initiateClearUserData(); 55042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 55142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu }) 55242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setNegativeButton(R.string.dlg_cancel, null) 55350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .create(); 55450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu case DLG_FACTORY_RESET: 55550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return new AlertDialog.Builder(this) 55650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setTitle(getString(R.string.app_factory_reset_dlg_title)) 55750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 55850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setMessage(getString(R.string.app_factory_reset_dlg_text)) 55942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setPositiveButton(R.string.dlg_ok, 56042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu new DialogInterface.OnClickListener() { 56142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 56242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Clear user data here 56342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu uninstallPkg(mAppInfo.packageName); 56442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 56542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu }) 56642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setNegativeButton(R.string.dlg_cancel, null) 56750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .create(); 56850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu case DLG_APP_NOT_FOUND: 56950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return new AlertDialog.Builder(this) 57050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setTitle(getString(R.string.app_not_found_dlg_title)) 57150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 57250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setMessage(getString(R.string.app_not_found_dlg_title)) 57350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setNeutralButton(getString(R.string.dlg_ok), 57450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu new DialogInterface.OnClickListener() { 57550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 57650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu //force to recompute changed value 57750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setIntentAndFinish(true, true); 57850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 57950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu }) 58050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .create(); 58150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu case DLG_CANNOT_CLEAR_DATA: 58250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return new AlertDialog.Builder(this) 58350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setTitle(getString(R.string.clear_failed_dlg_title)) 58450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 58550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setMessage(getString(R.string.clear_failed_dlg_text)) 58650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setNeutralButton(R.string.dlg_ok, 58750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu new DialogInterface.OnClickListener() { 58850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 58942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(false); 59050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu //force to recompute changed value 59150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setIntentAndFinish(false, false); 59250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 59350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu }) 59450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .create(); 59542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu case DLG_FORCE_STOP: 59642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu return new AlertDialog.Builder(this) 59742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setTitle(getString(R.string.force_stop_dlg_title)) 59842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 59942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setMessage(getString(R.string.force_stop_dlg_text)) 60042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setPositiveButton(R.string.dlg_ok, 60142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu new DialogInterface.OnClickListener() { 60242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 60342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Force stop 60442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu forceStopPackage(mAppInfo.packageName); 60542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 60642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu }) 60742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setNegativeButton(R.string.dlg_cancel, null) 60842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .create(); 6095cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu case DLG_MOVE_FAILED: 6105cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu CharSequence msg = getString(R.string.move_app_failed_dlg_text, 6115cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu getMoveErrMsg(mMoveErrorCode)); 6125cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu return new AlertDialog.Builder(this) 6135cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu .setTitle(getString(R.string.move_app_failed_dlg_title)) 6145cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 6155cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu .setMessage(msg) 6165cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu .setNeutralButton(R.string.dlg_ok, null) 6175cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu .create(); 61850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 61950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return null; 62050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 62150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 62250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private void uninstallPkg(String packageName) { 62350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Create new intent to launch Uninstaller activity 62450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu Uri packageURI = Uri.parse("package:"+packageName); 62550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI); 62650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu startActivity(uninstallIntent); 62750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setIntentAndFinish(true, true); 62850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 62950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 63042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void forceStopPackage(String pkgName) { 63142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu ActivityManager am = (ActivityManager)getSystemService( 63242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Context.ACTIVITY_SERVICE); 63342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu am.forceStopPackage(pkgName); 634cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn checkForceStop(); 63542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 63642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 637cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() { 638cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn @Override 639cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn public void onReceive(Context context, Intent intent) { 640cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn mForceStopButton.setEnabled(getResultCode() != RESULT_CANCELED); 64197de6bccfe81655a16feb988da1d208f95a8d6e3Dianne Hackborn mForceStopButton.setOnClickListener(InstalledAppDetails.this); 642cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn } 643cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn }; 644cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn 645cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn private void checkForceStop() { 646cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART, 647cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn Uri.fromParts("package", mAppInfo.packageName, null)); 648cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppInfo.packageName }); 649cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn intent.putExtra(Intent.EXTRA_UID, mAppInfo.uid); 650cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null, 651cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn Activity.RESULT_CANCELED, null, null); 652cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn } 653cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn 654afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 655afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Method implementing functionality of buttons clicked 656afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * @see android.view.View.OnClickListener#onClick(android.view.View) 657afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 658afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onClick(View v) { 659afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String packageName = mAppInfo.packageName; 66042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if(v == mUninstallButton) { 66142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (mUpdatedSysApp) { 66250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialogInner(DLG_FACTORY_RESET); 66342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 66450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu uninstallPkg(packageName); 665afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 666afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if(v == mActivitiesButton) { 667afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.clearPackagePreferredActivities(packageName); 668afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mActivitiesButton.setEnabled(false); 66942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else if(v == mClearDataButton) { 67042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (mAppInfo.manageSpaceActivityName != null) { 67142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Intent intent = new Intent(Intent.ACTION_DEFAULT); 67242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu intent.setClassName(mAppInfo.packageName, mAppInfo.manageSpaceActivityName); 67342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu startActivityForResult(intent, -1); 67442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 67542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu showDialogInner(DLG_CLEAR_DATA); 67642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 677afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mClearCacheButton) { 678afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Lazy initialization of observer 679afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mClearCacheObserver == null) { 680afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheObserver = new ClearCacheObserver(); 681afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 682afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver); 683afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mForceStopButton) { 68442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu forceStopPackage(mAppInfo.packageName); 685ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } else if (v == mMoveAppButton) { 686ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu if (mPackageMoveObserver == null) { 687ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mPackageMoveObserver = new PackageMoveObserver(); 688ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 689d2b8efa494288ad01b1deb4449e39279bcd0d7fbSuchi Amalapurapu int moveFlags = (mAppInfo.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0 ? 690ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu PackageManager.MOVE_INTERNAL : PackageManager.MOVE_EXTERNAL_MEDIA; 691de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mMoveInProgress = true; 692de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu refreshButtons(); 693ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mPm.movePackage(mAppInfo.packageName, mPackageMoveObserver, moveFlags); 694afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 695afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 696afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 697afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 698