InstalledAppDetails.java revision 728ac35373028b79205a788c526ef4b495518ec1
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 19728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornpackage com.android.settings.applications; 20afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 214056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapuimport com.android.internal.content.PackageHelper; 22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.settings.R; 23728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport com.android.settings.R.id; 24728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport com.android.settings.R.layout; 25728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport com.android.settings.R.string; 26728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Activity; 28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.ActivityManager; 29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.AlertDialog; 3050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.app.Dialog; 31cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackbornimport android.content.BroadcastReceiver; 32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.DialogInterface; 34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.IntentFilter; 36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.ApplicationInfo; 37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageDataObserver; 384056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapuimport android.content.pm.IPackageManager; 39ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapuimport android.content.pm.IPackageMoveObserver; 40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageStatsObserver; 4150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.content.pm.PackageInfo; 42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager; 43730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapuimport android.content.pm.PackageParser; 44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageStats; 45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException; 46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.Uri; 47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Handler; 494056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapuimport android.os.IBinder; 50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Message; 5150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.os.RemoteException; 524056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapuimport android.os.ServiceManager; 534056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapuimport android.os.storage.IMountService; 54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.format.Formatter; 55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log; 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList; 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List; 58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.ComponentName; 59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AppSecurityPermissions; 61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button; 62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView; 63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.LinearLayout; 64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView; 65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display application information from Settings. This activity presents 68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * extended information associated with a package like code, data, total size, permissions 69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * used by the application and also the set of default launchable activities. 70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For system applications, an option to clear user data is displayed only if data size is > 0. 71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * System applications that do not want clear user data do not have this option. 72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For non-system applications, there is no option to clear data. Instead there is an option to 73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * uninstall the application. 74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 7542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapupublic class InstalledAppDetails extends Activity implements View.OnClickListener { 76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String TAG="InstalledAppDetails"; 77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int _UNKNOWN_APP=R.string.unknown; 78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private ApplicationInfo mAppInfo; 7942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private Button mUninstallButton; 80de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu private boolean mMoveInProgress = false; 8142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private boolean mUpdatedSysApp = false; 82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mActivitiesButton; 8350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private boolean localLOGV = false; 8450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private TextView mAppVersion; 85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mTotalSize; 86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mAppSize; 87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mDataSize; 88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private PkgSizeObserver mSizeObserver; 89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private ClearUserDataObserver mClearDataObserver; 90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Views related to cache info 91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mCacheSize; 92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mClearCacheButton; 93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private ClearCacheObserver mClearCacheObserver; 94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mForceStopButton; 9542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private Button mClearDataButton; 9642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private Button mMoveAppButton; 975cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu private int mMoveErrorCode; 98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project PackageStats mSizeInfo; 100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private PackageManager mPm; 101ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private PackageMoveObserver mPackageMoveObserver; 102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //internal constants used in Handler 104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int OP_SUCCESSFUL = 1; 105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int OP_FAILED = 2; 106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int CLEAR_USER_DATA = 1; 107afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int GET_PKG_SIZE = 2; 108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int CLEAR_CACHE = 3; 109ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private static final int PACKAGE_MOVE = 4; 110afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String ATTR_PACKAGE_STATS="PackageStats"; 111afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 112afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // invalid size value used initially and also when size retrieval through PackageManager 113afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // fails for whatever reason 114afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int SIZE_INVALID = -1; 115afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 116afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Resource strings 117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mInvalidSizeStr; 118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mComputingStr; 119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 12050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Dialog identifiers used in showDialog 12150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_BASE = 0; 12250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_CLEAR_DATA = DLG_BASE + 1; 12350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_FACTORY_RESET = DLG_BASE + 2; 12450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_APP_NOT_FOUND = DLG_BASE + 3; 12550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_CANNOT_CLEAR_DATA = DLG_BASE + 4; 12642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private static final int DLG_FORCE_STOP = DLG_BASE + 5; 1275cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu private static final int DLG_MOVE_FAILED = DLG_BASE + 6; 128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Handler mHandler = new Handler() { 130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void handleMessage(Message msg) { 13107f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn // If the activity is gone, don't process any more messages. 13207f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn if (isFinishing()) { 13307f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn return; 13407f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn } 135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project switch (msg.what) { 136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case CLEAR_USER_DATA: 137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project processClearMsg(msg); 138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case GET_PKG_SIZE: 140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project refreshSizeInfo(msg); 141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case CLEAR_CACHE: 143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Refresh size info 144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver); 145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 146ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu case PACKAGE_MOVE: 147ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu processMoveMsg(msg); 148ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu break; 149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project default: 150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }; 154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project class ClearUserDataObserver extends IPackageDataObserver.Stub { 156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onRemoveCompleted(final String packageName, final boolean succeeded) { 157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA); 158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED; 159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mHandler.sendMessage(msg); 160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project class PkgSizeObserver extends IPackageStatsObserver.Stub { 164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) { 165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Message msg = mHandler.obtainMessage(GET_PKG_SIZE); 166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Bundle data = new Bundle(); 167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project data.putParcelable(ATTR_PACKAGE_STATS, pStats); 168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project msg.setData(data); 169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mHandler.sendMessage(msg); 170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 17350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project class ClearCacheObserver extends IPackageDataObserver.Stub { 175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onRemoveCompleted(final String packageName, final boolean succeeded) { 176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final Message msg = mHandler.obtainMessage(CLEAR_CACHE); 177ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu msg.arg1 = succeeded ? OP_SUCCESSFUL:OP_FAILED; 178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mHandler.sendMessage(msg); 179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 181ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu 182ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu class PackageMoveObserver extends IPackageMoveObserver.Stub { 183ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu public void packageMoved(String packageName, int returnCode) throws RemoteException { 184ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu final Message msg = mHandler.obtainMessage(PACKAGE_MOVE); 185ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu msg.arg1 = returnCode; 186ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mHandler.sendMessage(msg); 187ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 188ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String getSizeStr(long size) { 191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (size == SIZE_INVALID) { 192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return mInvalidSizeStr.toString(); 193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return Formatter.formatFileSize(this, size); 195afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 196afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 19742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void initDataButtons() { 19842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (mAppInfo.manageSpaceActivityName != null) { 19942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.manage_space_text); 20042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 20142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.clear_user_data_text); 20242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 20342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setOnClickListener(this); 204ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 205ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu 2065cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu private CharSequence getMoveErrMsg(int errCode) { 2075cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu switch (errCode) { 2085cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu case PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE: 2095cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu return getString(R.string.insufficient_storage); 2105cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu case PackageManager.MOVE_FAILED_DOESNT_EXIST: 2115cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu return getString(R.string.does_not_exist); 2125cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu case PackageManager.MOVE_FAILED_FORWARD_LOCKED: 2135cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu return getString(R.string.app_forward_locked); 2145cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu case PackageManager.MOVE_FAILED_INVALID_LOCATION: 2155cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu return getString(R.string.invalid_location); 2165cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu case PackageManager.MOVE_FAILED_SYSTEM_PACKAGE: 2175cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu return getString(R.string.system_package); 2189a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu case PackageManager.MOVE_FAILED_INTERNAL_ERROR: 2199a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu return ""; 2205cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu } 2219a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu return ""; 2225cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu } 2235cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu 224ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private void initMoveButton() { 22542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu String pkgName = mAppInfo.packageName; 22642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu boolean dataOnly = false; 22742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu ApplicationInfo info1 = null; 228730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu PackageInfo pkgInfo = null; 22942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 23042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu try { 23142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu info1 = mPm.getApplicationInfo(pkgName, 0); 232730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu pkgInfo = mPm.getPackageInfo(mAppInfo.packageName, 233730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu PackageManager.GET_UNINSTALLED_PACKAGES); 23442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } catch (NameNotFoundException e) { 23542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 23642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu dataOnly = (info1 == null) && (mAppInfo != null); 237ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu boolean moveDisable = true; 23842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (dataOnly) { 23942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mMoveAppButton.setText(R.string.move_app); 240d2b8efa494288ad01b1deb4449e39279bcd0d7fbSuchi Amalapurapu } else if ((mAppInfo.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) { 24142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mMoveAppButton.setText(R.string.move_app_to_internal); 2424056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu // Always let apps move to internal storage from sdcard. 243ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu moveDisable = false; 24442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 24542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mMoveAppButton.setText(R.string.move_app_to_sdcard); 24630de84777b715a586f85d7665227342e6b67d373Suchi Amalapurapu if ((mAppInfo.flags & ApplicationInfo.FLAG_FORWARD_LOCK) == 0 && 24730de84777b715a586f85d7665227342e6b67d373Suchi Amalapurapu (mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0 && 24830de84777b715a586f85d7665227342e6b67d373Suchi Amalapurapu pkgInfo != null) { 249a3683a51faab316c1577cd13c708a41938bcc646Suchi Amalapurapu if (pkgInfo.installLocation == PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL || 250a3683a51faab316c1577cd13c708a41938bcc646Suchi Amalapurapu pkgInfo.installLocation == PackageInfo.INSTALL_LOCATION_AUTO) { 25130de84777b715a586f85d7665227342e6b67d373Suchi Amalapurapu moveDisable = false; 2524056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu } else if (pkgInfo.installLocation == PackageInfo.INSTALL_LOCATION_UNSPECIFIED) { 2534056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu IPackageManager ipm = IPackageManager.Stub.asInterface( 2544056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu ServiceManager.getService("package")); 2554056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu int loc; 2564056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu try { 2574056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu loc = ipm.getInstallLocation(); 2584056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu } catch (RemoteException e) { 2594056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu Log.e(TAG, "Is Pakage Manager running?"); 2604056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu return; 2614056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu } 2624056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu if (loc == PackageHelper.APP_INSTALL_EXTERNAL) { 2634056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu // For apps with no preference and the default value set 2644056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu // to install on sdcard. 2654056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu moveDisable = false; 2664056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu } 2674056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu } 2684056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu } 269730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu } 270ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu if (moveDisable) { 271ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mMoveAppButton.setEnabled(false); 272ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } else { 273ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mMoveAppButton.setOnClickListener(this); 274ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mMoveAppButton.setEnabled(true); 275ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 27642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 27742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 278de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu private void initUninstallButtons() { 27942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUpdatedSysApp = (mAppInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0; 28042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu boolean enabled = true; 28142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (mUpdatedSysApp) { 28242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setText(R.string.app_factory_reset); 28342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 284b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu if ((mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0){ 285b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu // Disable button for system applications. 286b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu enabled = false; 287b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu } 288b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu mUninstallButton.setText(R.string.uninstall_text); 28942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 29042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setEnabled(enabled); 29142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (enabled) { 29242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Register listener 29342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setOnClickListener(this); 29442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 29542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 29642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 297b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown private boolean initAppInfo(String packageName) { 298de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu try { 299de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mAppInfo = mPm.getApplicationInfo(packageName, 300de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu PackageManager.GET_UNINSTALLED_PACKAGES); 301b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown return true; 302de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } catch (NameNotFoundException e) { 303de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu Log.e(TAG, "Exception when retrieving package: " + packageName, e); 304de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu showDialogInner(DLG_APP_NOT_FOUND); 305b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown return false; 306de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } 307de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } 308de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu 309afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** Called when the activity is first created. */ 310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 311afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project protected void onCreate(Bundle icicle) { 312afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(icicle); 313b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 31450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Get package manager 315afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm = getPackageManager(); 316b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 31750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Get application's name from intent 318afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Intent intent = getIntent(); 319728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final String packageName = intent.getData().getSchemeSpecificPart(); 320b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown if (! initAppInfo(packageName)) { 321b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown return; // could not find package, finish called 322b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown } 323b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 324afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Try retrieving package stats again 325afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project CharSequence totalSizeStr, appSizeStr, dataSizeStr; 326b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown mComputingStr = getText(R.string.computing_size); 327afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project totalSizeStr = appSizeStr = dataSizeStr = mComputingStr; 328afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(localLOGV) Log.i(TAG, "Have to compute package sizes"); 329afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSizeObserver = new PkgSizeObserver(); 33050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setContentView(R.layout.installed_app_details); 331afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //TODO download str and download url 332b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 33350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Set default values on sizes 334afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize = (TextView)findViewById(R.id.total_size_text); 335afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize.setText(totalSizeStr); 336afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize = (TextView)findViewById(R.id.application_size_text); 337afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize.setText(appSizeStr); 338afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize = (TextView)findViewById(R.id.data_size_text); 339afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize.setText(dataSizeStr); 340b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 34142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Get Control button panel 34242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu View btnPanel = findViewById(R.id.control_buttons_panel); 34342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mForceStopButton = (Button) btnPanel.findViewById(R.id.left_button); 34442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mForceStopButton.setText(R.string.force_stop); 34542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton = (Button)btnPanel.findViewById(R.id.right_button); 346cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn mForceStopButton.setEnabled(false); 347b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 34842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Initialize clear data and move install location buttons 34942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu View data_buttons_panel = findViewById(R.id.data_buttons_panel); 35042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton = (Button) data_buttons_panel.findViewById(R.id.left_button); 35142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mMoveAppButton = (Button) data_buttons_panel.findViewById(R.id.right_button); 352b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 353afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Cache section 354afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize = (TextView) findViewById(R.id.cache_size_text); 355afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(mComputingStr); 356afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheButton = (Button) findViewById(R.id.clear_cache_button); 35742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 35850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Get list of preferred activities 359afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mActivitiesButton = (Button)findViewById(R.id.clear_activities_button); 360afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project List<ComponentName> prefActList = new ArrayList<ComponentName>(); 361b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 36250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Intent list cannot be null. so pass empty list 363afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project List<IntentFilter> intentList = new ArrayList<IntentFilter>(); 364afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.getPreferredActivities(intentList, prefActList, packageName); 365afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(localLOGV) Log.i(TAG, "Have "+prefActList.size()+" number of activities in prefered list"); 366afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project TextView autoLaunchView = (TextView)findViewById(R.id.auto_launch); 367afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(prefActList.size() <= 0) { 36850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Disable clear activities button 369afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project autoLaunchView.setText(R.string.auto_launch_disable_text); 370afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mActivitiesButton.setEnabled(false); 371afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 372afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project autoLaunchView.setText(R.string.auto_launch_enable_text); 373afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mActivitiesButton.setOnClickListener(this); 374afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 375afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 37650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Security permissions section 377afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project LinearLayout permsView = (LinearLayout) findViewById(R.id.permissions_section); 378afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project AppSecurityPermissions asp = new AppSecurityPermissions(this, packageName); 379afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(asp.getPermissionCount() > 0) { 380afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project permsView.setVisibility(View.VISIBLE); 381afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Make the security sections header visible 382afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project LinearLayout securityList = (LinearLayout) permsView.findViewById( 383afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project R.id.security_settings_list); 384afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project securityList.addView(asp.getPermissionsView()); 385afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 386afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project permsView.setVisibility(View.GONE); 387afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 388afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 389f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu 39050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Utility method to set applicaiton label and icon. 391f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu private void setAppLabelAndIcon(PackageInfo pkgInfo) { 392f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu View appSnippet = findViewById(R.id.app_snippet); 393f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon); 394f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu icon.setImageDrawable(mAppInfo.loadIcon(mPm)); 395f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu // Set application name. 396f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu TextView label = (TextView) appSnippet.findViewById(R.id.app_name); 397f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu label.setText(mAppInfo.loadLabel(mPm)); 39850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Version number of application 399f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu mAppVersion = (TextView) appSnippet.findViewById(R.id.app_size); 400f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu 401f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu if (pkgInfo != null && pkgInfo.versionName != null) { 40250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppVersion.setVisibility(View.VISIBLE); 40350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppVersion.setText(getString(R.string.version_text, 4048e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes String.valueOf(pkgInfo.versionName))); 40550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } else { 406f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu mAppVersion.setVisibility(View.INVISIBLE); 40750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 40850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 40950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 41050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu @Override 41142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public void onResume() { 41242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu super.onResume(); 413b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 414b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown if (mAppInfo == null) { 415b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown setIntentAndFinish(true, true); 416b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown return; // onCreate must have failed, make sure to exit 417b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown } 418b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown if (! initAppInfo(mAppInfo.packageName)) { 419b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown return; // could not find package, finish called 420b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown } 421b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 422de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu PackageInfo pkgInfo = null; 42350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Get application info again to refresh changed properties of application 42450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu try { 4259f1900dc05773a0659030e21a8c2fa1641655669Dianne Hackborn pkgInfo = mPm.getPackageInfo(mAppInfo.packageName, 4269f1900dc05773a0659030e21a8c2fa1641655669Dianne Hackborn PackageManager.GET_UNINSTALLED_PACKAGES); 42750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } catch (NameNotFoundException e) { 42850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu Log.e(TAG, "Exception when retrieving package:" + mAppInfo.packageName, e); 42950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialogInner(DLG_APP_NOT_FOUND); 430b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown return; // could not find package, finish called 43150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 432b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 433cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn checkForceStop(); 434de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu setAppLabelAndIcon(pkgInfo); 435de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu refreshButtons(); 436b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 437de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu // Refresh size info 438de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu if (mAppInfo != null && mAppInfo.packageName != null) { 439de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver); 440de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } 441afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 44242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 443afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void setIntentAndFinish(boolean finish, boolean appChanged) { 444afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(localLOGV) Log.i(TAG, "appChanged="+appChanged); 445afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Intent intent = new Intent(); 446afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project intent.putExtra(ManageApplications.APP_CHG, appChanged); 447afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project setResult(ManageApplications.RESULT_OK, intent); 448afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(finish) { 449afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project finish(); 450afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 451afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 452afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 453afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 454afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to handle get size info notification from observer when 455afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * the async operation from PackageManager is complete. The current user data 456afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * info has to be refreshed in the manage applications screen as well as the current screen. 457afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 458afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void refreshSizeInfo(Message msg) { 459afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project boolean changed = false; 460afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project PackageStats newPs = msg.getData().getParcelable(ATTR_PACKAGE_STATS); 461afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project long newTot = newPs.cacheSize+newPs.codeSize+newPs.dataSize; 462afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(mSizeInfo == null) { 463afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSizeInfo = newPs; 464afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String str = getSizeStr(newTot); 465afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize.setText(str); 466afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize.setText(getSizeStr(newPs.codeSize)); 467afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize.setText(getSizeStr(newPs.dataSize)); 468afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(getSizeStr(newPs.cacheSize)); 469afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 470afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project long oldTot = mSizeInfo.cacheSize+mSizeInfo.codeSize+mSizeInfo.dataSize; 471afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newTot != oldTot) { 472afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String str = getSizeStr(newTot); 473afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize.setText(str); 474afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 475afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 476afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newPs.codeSize != mSizeInfo.codeSize) { 477afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize.setText(getSizeStr(newPs.codeSize)); 478afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 479afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 480afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newPs.dataSize != mSizeInfo.dataSize) { 481afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize.setText(getSizeStr(newPs.dataSize)); 482afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 483afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 484afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newPs.cacheSize != mSizeInfo.cacheSize) { 485afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(getSizeStr(newPs.cacheSize)); 486afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 487afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 488afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(changed) { 489afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSizeInfo = newPs; 490afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 491afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 49242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // If data size is zero disable clear data button 49342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (newPs.dataSize == 0) { 49442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(false); 495afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 49642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu long data = mSizeInfo.dataSize; 497afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project refreshCacheInfo(newPs.cacheSize); 498afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 499afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 500afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void refreshCacheInfo(long cacheSize) { 501afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Set cache info 502afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(getSizeStr(cacheSize)); 503afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (cacheSize <= 0) { 504afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheButton.setEnabled(false); 505afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 506afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheButton.setOnClickListener(this); 507afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 508afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 509afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 510afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 511afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to handle clear message notification from observer when 512afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * the async operation from PackageManager is complete 513afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 514afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void processClearMsg(Message msg) { 515afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int result = msg.arg1; 516afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String packageName = mAppInfo.packageName; 51742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.clear_user_data_text); 518afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(result == OP_SUCCESSFUL) { 51942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Log.i(TAG, "Cleared user data for package : "+packageName); 520afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.getPackageSizeInfo(packageName, mSizeObserver); 521afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 52242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(true); 523afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 524afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 525ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu 526de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu private void refreshButtons() { 527de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu if (!mMoveInProgress) { 528de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu initUninstallButtons(); 529de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu initDataButtons(); 530de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu initMoveButton(); 531de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } else { 532de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mMoveAppButton.setText(R.string.moving); 533de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mMoveAppButton.setEnabled(false); 534de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mUninstallButton.setEnabled(false); 535de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } 536de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } 537de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu 538ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private void processMoveMsg(Message msg) { 539ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu int result = msg.arg1; 540ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu String packageName = mAppInfo.packageName; 541de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu // Refresh the button attributes. 542de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mMoveInProgress = false; 543ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu if(result == PackageManager.MOVE_SUCCEEDED) { 544ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu Log.i(TAG, "Moved resources for " + packageName); 545de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu // Refresh size information again. 546b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown mPm.getPackageSizeInfo(packageName, mSizeObserver); 547ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } else { 5485cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu mMoveErrorCode = result; 5495cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu showDialogInner(DLG_MOVE_FAILED); 550ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 551b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 552b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown if (! initAppInfo(packageName)) { 553b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown return; // could not find package, finish called 554b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown } 555b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 556b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown refreshButtons(); 557ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 5585cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu 559afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 560afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to initiate clearing user data when the user clicks the clear data 561afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * button for a system package 562afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 56342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void initiateClearUserData() { 56442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(false); 56542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Invoke uninstall or clear user data based on sysPackage 566afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String packageName = mAppInfo.packageName; 56742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Log.i(TAG, "Clearing user data for package : " + packageName); 568afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(mClearDataObserver == null) { 569afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearDataObserver = new ClearUserDataObserver(); 570afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 571afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 572afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project boolean res = am.clearApplicationUserData(packageName, mClearDataObserver); 573afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(!res) { 57450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Clearing data failed for some obscure reason. Just log error for now 575afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Log.i(TAG, "Couldnt clear application user data for package:"+packageName); 57650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialogInner(DLG_CANNOT_CLEAR_DATA); 577afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 57842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.recompute_size); 579afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 580afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 581afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 58250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private void showDialogInner(int id) { 58350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu //removeDialog(id); 58450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialog(id); 58550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 58650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 58750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu @Override 58842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public Dialog onCreateDialog(int id, Bundle args) { 58950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu switch (id) { 59050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu case DLG_CLEAR_DATA: 59150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return new AlertDialog.Builder(this) 59250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setTitle(getString(R.string.clear_data_dlg_title)) 59350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 59450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setMessage(getString(R.string.clear_data_dlg_text)) 59542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setPositiveButton(R.string.dlg_ok, 59642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu new DialogInterface.OnClickListener() { 59742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 59842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Clear user data here 59942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu initiateClearUserData(); 60042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 60142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu }) 60242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setNegativeButton(R.string.dlg_cancel, null) 60350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .create(); 60450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu case DLG_FACTORY_RESET: 60550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return new AlertDialog.Builder(this) 60650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setTitle(getString(R.string.app_factory_reset_dlg_title)) 60750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 60850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setMessage(getString(R.string.app_factory_reset_dlg_text)) 60942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setPositiveButton(R.string.dlg_ok, 61042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu new DialogInterface.OnClickListener() { 61142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 61242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Clear user data here 61342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu uninstallPkg(mAppInfo.packageName); 61442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 61542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu }) 61642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setNegativeButton(R.string.dlg_cancel, null) 61750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .create(); 61850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu case DLG_APP_NOT_FOUND: 61950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return new AlertDialog.Builder(this) 62050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setTitle(getString(R.string.app_not_found_dlg_title)) 62150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 62250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setMessage(getString(R.string.app_not_found_dlg_title)) 62350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setNeutralButton(getString(R.string.dlg_ok), 62450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu new DialogInterface.OnClickListener() { 62550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 62650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu //force to recompute changed value 62750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setIntentAndFinish(true, true); 62850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 62950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu }) 63050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .create(); 63150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu case DLG_CANNOT_CLEAR_DATA: 63250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return new AlertDialog.Builder(this) 63350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setTitle(getString(R.string.clear_failed_dlg_title)) 63450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 63550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setMessage(getString(R.string.clear_failed_dlg_text)) 63650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setNeutralButton(R.string.dlg_ok, 63750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu new DialogInterface.OnClickListener() { 63850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 63942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(false); 64050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu //force to recompute changed value 64150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setIntentAndFinish(false, false); 64250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 64350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu }) 64450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .create(); 64542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu case DLG_FORCE_STOP: 64642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu return new AlertDialog.Builder(this) 64742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setTitle(getString(R.string.force_stop_dlg_title)) 64842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 64942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setMessage(getString(R.string.force_stop_dlg_text)) 65042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setPositiveButton(R.string.dlg_ok, 65142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu new DialogInterface.OnClickListener() { 65242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 65342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Force stop 65442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu forceStopPackage(mAppInfo.packageName); 65542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 65642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu }) 65742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setNegativeButton(R.string.dlg_cancel, null) 65842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .create(); 6595cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu case DLG_MOVE_FAILED: 6605cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu CharSequence msg = getString(R.string.move_app_failed_dlg_text, 6615cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu getMoveErrMsg(mMoveErrorCode)); 6625cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu return new AlertDialog.Builder(this) 6635cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu .setTitle(getString(R.string.move_app_failed_dlg_title)) 6645cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 6655cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu .setMessage(msg) 6665cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu .setNeutralButton(R.string.dlg_ok, null) 6675cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu .create(); 66850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 66950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return null; 67050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 67150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 67250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private void uninstallPkg(String packageName) { 67350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Create new intent to launch Uninstaller activity 67450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu Uri packageURI = Uri.parse("package:"+packageName); 67550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI); 67650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu startActivity(uninstallIntent); 67750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setIntentAndFinish(true, true); 67850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 67950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 68042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void forceStopPackage(String pkgName) { 68142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu ActivityManager am = (ActivityManager)getSystemService( 68242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Context.ACTIVITY_SERVICE); 68342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu am.forceStopPackage(pkgName); 684cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn checkForceStop(); 68542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 68642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 687cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() { 688cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn @Override 689cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn public void onReceive(Context context, Intent intent) { 690cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn mForceStopButton.setEnabled(getResultCode() != RESULT_CANCELED); 69197de6bccfe81655a16feb988da1d208f95a8d6e3Dianne Hackborn mForceStopButton.setOnClickListener(InstalledAppDetails.this); 692cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn } 693cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn }; 694cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn 695cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn private void checkForceStop() { 696cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART, 697cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn Uri.fromParts("package", mAppInfo.packageName, null)); 698cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppInfo.packageName }); 699cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn intent.putExtra(Intent.EXTRA_UID, mAppInfo.uid); 700cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null, 701cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn Activity.RESULT_CANCELED, null, null); 702cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn } 703cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn 704afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 705afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Method implementing functionality of buttons clicked 706afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * @see android.view.View.OnClickListener#onClick(android.view.View) 707afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 708afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onClick(View v) { 709afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String packageName = mAppInfo.packageName; 71042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if(v == mUninstallButton) { 71142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (mUpdatedSysApp) { 71250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialogInner(DLG_FACTORY_RESET); 71342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 71450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu uninstallPkg(packageName); 715afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 716afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if(v == mActivitiesButton) { 717afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.clearPackagePreferredActivities(packageName); 718afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mActivitiesButton.setEnabled(false); 71942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else if(v == mClearDataButton) { 72042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (mAppInfo.manageSpaceActivityName != null) { 72142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Intent intent = new Intent(Intent.ACTION_DEFAULT); 72242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu intent.setClassName(mAppInfo.packageName, mAppInfo.manageSpaceActivityName); 72342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu startActivityForResult(intent, -1); 72442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 72542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu showDialogInner(DLG_CLEAR_DATA); 72642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 727afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mClearCacheButton) { 728afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Lazy initialization of observer 729afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mClearCacheObserver == null) { 730afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheObserver = new ClearCacheObserver(); 731afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 732afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver); 733afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mForceStopButton) { 73442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu forceStopPackage(mAppInfo.packageName); 735ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } else if (v == mMoveAppButton) { 736ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu if (mPackageMoveObserver == null) { 737ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mPackageMoveObserver = new PackageMoveObserver(); 738ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 739d2b8efa494288ad01b1deb4449e39279bcd0d7fbSuchi Amalapurapu int moveFlags = (mAppInfo.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0 ? 740ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu PackageManager.MOVE_INTERNAL : PackageManager.MOVE_EXTERNAL_MEDIA; 741de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mMoveInProgress = true; 742de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu refreshButtons(); 743ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mPm.movePackage(mAppInfo.packageName, mPackageMoveObserver, moveFlags); 744afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 745afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 746afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 747afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 748