InstalledAppDetails.java revision f4c4b59f13a0cadd55832004e56ff7b6d827f7f0
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; 37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageStats; 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException; 39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.Uri; 40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Handler; 42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Message; 4350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.os.RemoteException; 44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.format.Formatter; 45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log; 46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList; 47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List; 48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.ComponentName; 49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AppSecurityPermissions; 51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button; 52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView; 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.LinearLayout; 54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView; 55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display application information from Settings. This activity presents 58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * extended information associated with a package like code, data, total size, permissions 59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * used by the application and also the set of default launchable activities. 60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For system applications, an option to clear user data is displayed only if data size is > 0. 61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * System applications that do not want clear user data do not have this option. 62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For non-system applications, there is no option to clear data. Instead there is an option to 63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * uninstall the application. 64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 6542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapupublic class InstalledAppDetails extends Activity implements View.OnClickListener { 66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String TAG="InstalledAppDetails"; 67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int _UNKNOWN_APP=R.string.unknown; 68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private ApplicationInfo mAppInfo; 6942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private Button mUninstallButton; 7042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private boolean mUpdatedSysApp = false; 71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mActivitiesButton; 7250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private boolean localLOGV = false; 7350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private TextView mAppVersion; 74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mTotalSize; 75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mAppSize; 76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mDataSize; 77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private PkgSizeObserver mSizeObserver; 78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private ClearUserDataObserver mClearDataObserver; 79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Views related to cache info 80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mCacheSize; 81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mClearCacheButton; 82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private ClearCacheObserver mClearCacheObserver; 83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mForceStopButton; 8442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private Button mClearDataButton; 8542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private Button mMoveAppButton; 86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project PackageStats mSizeInfo; 88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private PackageManager mPm; 89ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private PackageMoveObserver mPackageMoveObserver; 90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //internal constants used in Handler 92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int OP_SUCCESSFUL = 1; 93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int OP_FAILED = 2; 94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int CLEAR_USER_DATA = 1; 95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int GET_PKG_SIZE = 2; 96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int CLEAR_CACHE = 3; 97ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private static final int PACKAGE_MOVE = 4; 98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String ATTR_PACKAGE_STATS="PackageStats"; 99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // invalid size value used initially and also when size retrieval through PackageManager 101afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // fails for whatever reason 102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int SIZE_INVALID = -1; 103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Resource strings 105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mInvalidSizeStr; 106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mComputingStr; 107afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 10850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Dialog identifiers used in showDialog 10950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_BASE = 0; 11050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_CLEAR_DATA = DLG_BASE + 1; 11150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_FACTORY_RESET = DLG_BASE + 2; 11250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_APP_NOT_FOUND = DLG_BASE + 3; 11350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_CANNOT_CLEAR_DATA = DLG_BASE + 4; 11442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private static final int DLG_FORCE_STOP = DLG_BASE + 5; 115afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 116afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Handler mHandler = new Handler() { 117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void handleMessage(Message msg) { 118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project switch (msg.what) { 119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case CLEAR_USER_DATA: 120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project processClearMsg(msg); 121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case GET_PKG_SIZE: 123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project refreshSizeInfo(msg); 124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case CLEAR_CACHE: 126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Refresh size info 127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver); 128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 129ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu case PACKAGE_MOVE: 130ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu processMoveMsg(msg); 131ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu break; 132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project default: 133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }; 137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project class ClearUserDataObserver extends IPackageDataObserver.Stub { 139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onRemoveCompleted(final String packageName, final boolean succeeded) { 140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA); 141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED; 142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mHandler.sendMessage(msg); 143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project class PkgSizeObserver extends IPackageStatsObserver.Stub { 147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) { 148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Message msg = mHandler.obtainMessage(GET_PKG_SIZE); 149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Bundle data = new Bundle(); 150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project data.putParcelable(ATTR_PACKAGE_STATS, pStats); 151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project msg.setData(data); 152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mHandler.sendMessage(msg); 153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 15650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project class ClearCacheObserver extends IPackageDataObserver.Stub { 158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onRemoveCompleted(final String packageName, final boolean succeeded) { 159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final Message msg = mHandler.obtainMessage(CLEAR_CACHE); 160ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu msg.arg1 = succeeded ? OP_SUCCESSFUL:OP_FAILED; 161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mHandler.sendMessage(msg); 162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 164ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu 165ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu class PackageMoveObserver extends IPackageMoveObserver.Stub { 166ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu public void packageMoved(String packageName, int returnCode) throws RemoteException { 167ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu final Message msg = mHandler.obtainMessage(PACKAGE_MOVE); 168ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu msg.arg1 = returnCode; 169ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mHandler.sendMessage(msg); 170ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 171ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String getSizeStr(long size) { 174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (size == SIZE_INVALID) { 175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return mInvalidSizeStr.toString(); 176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return Formatter.formatFileSize(this, size); 178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 18042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void initDataButtons() { 18142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (mAppInfo.manageSpaceActivityName != null) { 18242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.manage_space_text); 18342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 18442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.clear_user_data_text); 18542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 18642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setOnClickListener(this); 187ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu initMoveButton(); 188ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 189ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu 190ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private void initMoveButton() { 19142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu String pkgName = mAppInfo.packageName; 19242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu boolean dataOnly = false; 19342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu ApplicationInfo info1 = null; 19442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 19542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu try { 19642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu info1 = mPm.getApplicationInfo(pkgName, 0); 19742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } catch (NameNotFoundException e) { 19842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 19942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu dataOnly = (info1 == null) && (mAppInfo != null); 200ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu boolean moveDisable = true; 20142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (dataOnly) { 20242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mMoveAppButton.setText(R.string.move_app); 20342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else if ((mAppInfo.flags & ApplicationInfo.FLAG_ON_SDCARD) != 0) { 20442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mMoveAppButton.setText(R.string.move_app_to_internal); 205ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu moveDisable = false; 20642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 207ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu moveDisable = (mAppInfo.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0 || 208ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu (mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0; 20942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mMoveAppButton.setText(R.string.move_app_to_sdcard); 21042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 211ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu if (moveDisable) { 212ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mMoveAppButton.setEnabled(false); 213ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } else { 214ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mMoveAppButton.setOnClickListener(this); 215ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mMoveAppButton.setEnabled(true); 216ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 21742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 21842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 21942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void initControlButtons() { 22042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUpdatedSysApp = (mAppInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0; 22142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu boolean enabled = true; 22242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (mUpdatedSysApp) { 22342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setText(R.string.app_factory_reset); 22442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else if ((mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0){ 22542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setText(R.string.uninstall_text); 22642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 22742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Disable uninstall for system apps 22842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu enabled = false; 22942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 23042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setEnabled(enabled); 23142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (enabled) { 23242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Register listener 23342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setOnClickListener(this); 23442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 23542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 23642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** Called when the activity is first created. */ 238afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project protected void onCreate(Bundle icicle) { 240afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(icicle); 24150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Get package manager 242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm = getPackageManager(); 24350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Get application's name from intent 244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Intent intent = getIntent(); 245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final String packageName = intent.getStringExtra(ManageApplications.APP_PKG_NAME); 246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mComputingStr = getText(R.string.computing_size); 247afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Try retrieving package stats again 248afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project CharSequence totalSizeStr, appSizeStr, dataSizeStr; 249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project totalSizeStr = appSizeStr = dataSizeStr = mComputingStr; 250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(localLOGV) Log.i(TAG, "Have to compute package sizes"); 251afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSizeObserver = new PkgSizeObserver(); 252afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project try { 253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppInfo = mPm.getApplicationInfo(packageName, 254afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project PackageManager.GET_UNINSTALLED_PACKAGES); 255afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } catch (NameNotFoundException e) { 256afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Log.e(TAG, "Exception when retrieving package:"+packageName, e); 25750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialogInner(DLG_APP_NOT_FOUND); 25850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return; 259afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 26050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setContentView(R.layout.installed_app_details); 261afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //TODO download str and download url 26250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Set default values on sizes 263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize = (TextView)findViewById(R.id.total_size_text); 264afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize.setText(totalSizeStr); 265afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize = (TextView)findViewById(R.id.application_size_text); 266afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize.setText(appSizeStr); 267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize = (TextView)findViewById(R.id.data_size_text); 268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize.setText(dataSizeStr); 26942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Get Control button panel 27042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu View btnPanel = findViewById(R.id.control_buttons_panel); 27142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mForceStopButton = (Button) btnPanel.findViewById(R.id.left_button); 27242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mForceStopButton.setText(R.string.force_stop); 27342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton = (Button)btnPanel.findViewById(R.id.right_button); 274cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn mForceStopButton.setEnabled(false); 27542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu initControlButtons(); 27642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Initialize clear data and move install location buttons 27742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu View data_buttons_panel = findViewById(R.id.data_buttons_panel); 27842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton = (Button) data_buttons_panel.findViewById(R.id.left_button); 27942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mMoveAppButton = (Button) data_buttons_panel.findViewById(R.id.right_button); 280afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Cache section 281afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize = (TextView) findViewById(R.id.cache_size_text); 282afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(mComputingStr); 283afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheButton = (Button) findViewById(R.id.clear_cache_button); 28442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 28550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Get list of preferred activities 286afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mActivitiesButton = (Button)findViewById(R.id.clear_activities_button); 287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project List<ComponentName> prefActList = new ArrayList<ComponentName>(); 28850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Intent list cannot be null. so pass empty list 289afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project List<IntentFilter> intentList = new ArrayList<IntentFilter>(); 290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.getPreferredActivities(intentList, prefActList, packageName); 291afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(localLOGV) Log.i(TAG, "Have "+prefActList.size()+" number of activities in prefered list"); 292afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project TextView autoLaunchView = (TextView)findViewById(R.id.auto_launch); 293afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(prefActList.size() <= 0) { 29450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Disable clear activities button 295afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project autoLaunchView.setText(R.string.auto_launch_disable_text); 296afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mActivitiesButton.setEnabled(false); 297afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 298afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project autoLaunchView.setText(R.string.auto_launch_enable_text); 299afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mActivitiesButton.setOnClickListener(this); 300afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 30250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Security permissions section 303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project LinearLayout permsView = (LinearLayout) findViewById(R.id.permissions_section); 304afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project AppSecurityPermissions asp = new AppSecurityPermissions(this, packageName); 305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(asp.getPermissionCount() > 0) { 306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project permsView.setVisibility(View.VISIBLE); 307afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Make the security sections header visible 308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project LinearLayout securityList = (LinearLayout) permsView.findViewById( 309afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project R.id.security_settings_list); 310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project securityList.addView(asp.getPermissionsView()); 311afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 312afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project permsView.setVisibility(View.GONE); 313afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 314afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 315afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 31650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private void refreshAppAttributes(PackageInfo pkgInfo) { 317f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu setAppLabelAndIcon(pkgInfo); 31842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu initControlButtons(); 31942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu initDataButtons(); 32050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Refresh size info 321a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu if (mAppInfo != null && mAppInfo.packageName != null) { 322a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver); 323a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu } 324a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu } 325f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu 32650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Utility method to set applicaiton label and icon. 327f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu private void setAppLabelAndIcon(PackageInfo pkgInfo) { 328f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu View appSnippet = findViewById(R.id.app_snippet); 329f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon); 330f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu icon.setImageDrawable(mAppInfo.loadIcon(mPm)); 331f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu // Set application name. 332f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu TextView label = (TextView) appSnippet.findViewById(R.id.app_name); 333f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu label.setText(mAppInfo.loadLabel(mPm)); 33450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Version number of application 335f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu mAppVersion = (TextView) appSnippet.findViewById(R.id.app_size); 336f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu 337f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu if (pkgInfo != null && pkgInfo.versionName != null) { 33850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppVersion.setVisibility(View.VISIBLE); 33950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppVersion.setText(getString(R.string.version_text, 3408e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes String.valueOf(pkgInfo.versionName))); 34150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } else { 342f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu mAppVersion.setVisibility(View.INVISIBLE); 34350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 34450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 34550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 34650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu @Override 34742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public void onResume() { 34842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu super.onResume(); 34950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu PackageInfo pkgInfo; 35050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Get application info again to refresh changed properties of application 35150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu try { 35250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppInfo = mPm.getApplicationInfo(mAppInfo.packageName, 35350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu PackageManager.GET_UNINSTALLED_PACKAGES); 3549f1900dc05773a0659030e21a8c2fa1641655669Dianne Hackborn pkgInfo = mPm.getPackageInfo(mAppInfo.packageName, 3559f1900dc05773a0659030e21a8c2fa1641655669Dianne Hackborn PackageManager.GET_UNINSTALLED_PACKAGES); 35650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } catch (NameNotFoundException e) { 35750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu Log.e(TAG, "Exception when retrieving package:" + mAppInfo.packageName, e); 35850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialogInner(DLG_APP_NOT_FOUND); 35950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return; 36050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 361cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn checkForceStop(); 36250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu refreshAppAttributes(pkgInfo); 363afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 36442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 365afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void setIntentAndFinish(boolean finish, boolean appChanged) { 366afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(localLOGV) Log.i(TAG, "appChanged="+appChanged); 367afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Intent intent = new Intent(); 368afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project intent.putExtra(ManageApplications.APP_CHG, appChanged); 369afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project setResult(ManageApplications.RESULT_OK, intent); 370afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(finish) { 371afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project finish(); 372afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 373afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 374afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 375afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 376afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to handle get size info notification from observer when 377afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * the async operation from PackageManager is complete. The current user data 378afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * info has to be refreshed in the manage applications screen as well as the current screen. 379afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 380afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void refreshSizeInfo(Message msg) { 381afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project boolean changed = false; 382afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project PackageStats newPs = msg.getData().getParcelable(ATTR_PACKAGE_STATS); 383afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project long newTot = newPs.cacheSize+newPs.codeSize+newPs.dataSize; 384afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(mSizeInfo == null) { 385afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSizeInfo = newPs; 386afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String str = getSizeStr(newTot); 387afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize.setText(str); 388afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize.setText(getSizeStr(newPs.codeSize)); 389afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize.setText(getSizeStr(newPs.dataSize)); 390afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(getSizeStr(newPs.cacheSize)); 391afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 392afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project long oldTot = mSizeInfo.cacheSize+mSizeInfo.codeSize+mSizeInfo.dataSize; 393afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newTot != oldTot) { 394afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String str = getSizeStr(newTot); 395afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize.setText(str); 396afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 397afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 398afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newPs.codeSize != mSizeInfo.codeSize) { 399afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize.setText(getSizeStr(newPs.codeSize)); 400afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 401afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 402afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newPs.dataSize != mSizeInfo.dataSize) { 403afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize.setText(getSizeStr(newPs.dataSize)); 404afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 405afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 406afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newPs.cacheSize != mSizeInfo.cacheSize) { 407afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(getSizeStr(newPs.cacheSize)); 408afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 409afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 410afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(changed) { 411afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSizeInfo = newPs; 412afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 413afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 41442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // If data size is zero disable clear data button 41542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (newPs.dataSize == 0) { 41642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(false); 417afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 41842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu long data = mSizeInfo.dataSize; 419afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project refreshCacheInfo(newPs.cacheSize); 420afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 421afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 422afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void refreshCacheInfo(long cacheSize) { 423afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Set cache info 424afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(getSizeStr(cacheSize)); 425afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (cacheSize <= 0) { 426afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheButton.setEnabled(false); 427afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 428afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheButton.setOnClickListener(this); 429afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 430afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 431afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 432afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 433afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to handle clear message notification from observer when 434afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * the async operation from PackageManager is complete 435afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 436afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void processClearMsg(Message msg) { 437afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int result = msg.arg1; 438afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String packageName = mAppInfo.packageName; 43942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.clear_user_data_text); 440afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(result == OP_SUCCESSFUL) { 44142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Log.i(TAG, "Cleared user data for package : "+packageName); 442afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.getPackageSizeInfo(packageName, mSizeObserver); 443afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 44442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(true); 445afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 446afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 447ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu 448ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private void processMoveMsg(Message msg) { 449ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu int result = msg.arg1; 450ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu String packageName = mAppInfo.packageName; 451ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu if(result == PackageManager.MOVE_SUCCEEDED) { 452ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu Log.i(TAG, "Moved resources for " + packageName); 453ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu try { 454ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu // Reset flags 455ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mAppInfo = mPm.getApplicationInfo(packageName, 456ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu PackageManager.GET_UNINSTALLED_PACKAGES); 457ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu initMoveButton(); 458ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } catch (NameNotFoundException e) { 459ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu // TODO error handling 460ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 461ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } else { 462ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu // TODO Present a dialog indicating failure. 463ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 464ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 465afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 466afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 467afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to initiate clearing user data when the user clicks the clear data 468afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * button for a system package 469afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 47042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void initiateClearUserData() { 47142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(false); 47242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Invoke uninstall or clear user data based on sysPackage 473afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String packageName = mAppInfo.packageName; 47442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Log.i(TAG, "Clearing user data for package : " + packageName); 475afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(mClearDataObserver == null) { 476afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearDataObserver = new ClearUserDataObserver(); 477afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 478afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 479afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project boolean res = am.clearApplicationUserData(packageName, mClearDataObserver); 480afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(!res) { 48150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Clearing data failed for some obscure reason. Just log error for now 482afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Log.i(TAG, "Couldnt clear application user data for package:"+packageName); 48350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialogInner(DLG_CANNOT_CLEAR_DATA); 484afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 48542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.recompute_size); 486afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 487afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 488afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 48950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private void showDialogInner(int id) { 49050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu //removeDialog(id); 49150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialog(id); 49250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 49350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 49450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu @Override 49542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public Dialog onCreateDialog(int id, Bundle args) { 49650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu switch (id) { 49750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu case DLG_CLEAR_DATA: 49850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return new AlertDialog.Builder(this) 49950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setTitle(getString(R.string.clear_data_dlg_title)) 50050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 50150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setMessage(getString(R.string.clear_data_dlg_text)) 50242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setPositiveButton(R.string.dlg_ok, 50342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu new DialogInterface.OnClickListener() { 50442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 50542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Clear user data here 50642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu initiateClearUserData(); 50742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 50842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu }) 50942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setNegativeButton(R.string.dlg_cancel, null) 51050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .create(); 51150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu case DLG_FACTORY_RESET: 51250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return new AlertDialog.Builder(this) 51350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setTitle(getString(R.string.app_factory_reset_dlg_title)) 51450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 51550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setMessage(getString(R.string.app_factory_reset_dlg_text)) 51642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setPositiveButton(R.string.dlg_ok, 51742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu new DialogInterface.OnClickListener() { 51842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 51942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Clear user data here 52042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu uninstallPkg(mAppInfo.packageName); 52142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 52242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu }) 52342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setNegativeButton(R.string.dlg_cancel, null) 52450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .create(); 52550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu case DLG_APP_NOT_FOUND: 52650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return new AlertDialog.Builder(this) 52750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setTitle(getString(R.string.app_not_found_dlg_title)) 52850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 52950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setMessage(getString(R.string.app_not_found_dlg_title)) 53050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setNeutralButton(getString(R.string.dlg_ok), 53150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu new DialogInterface.OnClickListener() { 53250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 53350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu //force to recompute changed value 53450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setIntentAndFinish(true, true); 53550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 53650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu }) 53750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .create(); 53850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu case DLG_CANNOT_CLEAR_DATA: 53950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return new AlertDialog.Builder(this) 54050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setTitle(getString(R.string.clear_failed_dlg_title)) 54150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 54250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setMessage(getString(R.string.clear_failed_dlg_text)) 54350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setNeutralButton(R.string.dlg_ok, 54450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu new DialogInterface.OnClickListener() { 54550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 54642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(false); 54750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu //force to recompute changed value 54850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setIntentAndFinish(false, false); 54950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 55050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu }) 55150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .create(); 55242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu case DLG_FORCE_STOP: 55342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu return new AlertDialog.Builder(this) 55442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setTitle(getString(R.string.force_stop_dlg_title)) 55542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 55642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setMessage(getString(R.string.force_stop_dlg_text)) 55742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setPositiveButton(R.string.dlg_ok, 55842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu new DialogInterface.OnClickListener() { 55942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 56042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Force stop 56142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu forceStopPackage(mAppInfo.packageName); 56242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 56342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu }) 56442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setNegativeButton(R.string.dlg_cancel, null) 56542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .create(); 56650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 56750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return null; 56850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 56950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 57050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private void uninstallPkg(String packageName) { 57150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Create new intent to launch Uninstaller activity 57250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu Uri packageURI = Uri.parse("package:"+packageName); 57350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI); 57450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu startActivity(uninstallIntent); 57550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setIntentAndFinish(true, true); 57650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 57750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 57842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void forceStopPackage(String pkgName) { 57942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu ActivityManager am = (ActivityManager)getSystemService( 58042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Context.ACTIVITY_SERVICE); 58142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu am.forceStopPackage(pkgName); 582cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn checkForceStop(); 58342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 58442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 585cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() { 586cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn @Override 587cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn public void onReceive(Context context, Intent intent) { 588cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn mForceStopButton.setEnabled(getResultCode() != RESULT_CANCELED); 58997de6bccfe81655a16feb988da1d208f95a8d6e3Dianne Hackborn mForceStopButton.setOnClickListener(InstalledAppDetails.this); 590cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn } 591cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn }; 592cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn 593cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn private void checkForceStop() { 594cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART, 595cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn Uri.fromParts("package", mAppInfo.packageName, null)); 596cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppInfo.packageName }); 597cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn intent.putExtra(Intent.EXTRA_UID, mAppInfo.uid); 598cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null, 599cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn Activity.RESULT_CANCELED, null, null); 600cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn } 601cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn 602afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 603afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Method implementing functionality of buttons clicked 604afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * @see android.view.View.OnClickListener#onClick(android.view.View) 605afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 606afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onClick(View v) { 607afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String packageName = mAppInfo.packageName; 60842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if(v == mUninstallButton) { 60942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (mUpdatedSysApp) { 61050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialogInner(DLG_FACTORY_RESET); 61142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 61250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu uninstallPkg(packageName); 613afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 614afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if(v == mActivitiesButton) { 615afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.clearPackagePreferredActivities(packageName); 616afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mActivitiesButton.setEnabled(false); 61742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else if(v == mClearDataButton) { 61842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (mAppInfo.manageSpaceActivityName != null) { 61942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Intent intent = new Intent(Intent.ACTION_DEFAULT); 62042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu intent.setClassName(mAppInfo.packageName, mAppInfo.manageSpaceActivityName); 62142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu startActivityForResult(intent, -1); 62242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 62342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu showDialogInner(DLG_CLEAR_DATA); 62442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 625afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mClearCacheButton) { 626afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Lazy initialization of observer 627afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mClearCacheObserver == null) { 628afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheObserver = new ClearCacheObserver(); 629afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 630afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver); 631afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mForceStopButton) { 63242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu forceStopPackage(mAppInfo.packageName); 633ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } else if (v == mMoveAppButton) { 634ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu if (mPackageMoveObserver == null) { 635ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mPackageMoveObserver = new PackageMoveObserver(); 636ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 637ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu int moveFlags = (mAppInfo.flags & ApplicationInfo.FLAG_ON_SDCARD) != 0 ? 638ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu PackageManager.MOVE_INTERNAL : PackageManager.MOVE_EXTERNAL_MEDIA; 639ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mMoveAppButton.setText(R.string.moving); 640ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mMoveAppButton.setEnabled(false); 641ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mPm.movePackage(mAppInfo.packageName, mPackageMoveObserver, moveFlags); 642afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 643afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 644afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 645afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 646