InstalledAppDetails.java revision cb497546ba55ef98fb561dd9a07c7a485a918f4b
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) { 31750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setAppLabelAndIcon(); 31842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu initControlButtons(); 31942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu initDataButtons(); 32050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Version number of application 32150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setAppVersion(pkgInfo); 32250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Refresh size info 323a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu if (mAppInfo != null && mAppInfo.packageName != null) { 324a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver); 325a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu } 326a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu } 327a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu 32850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Utility method to set applicaiton label and icon. 32950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private void setAppLabelAndIcon() { 33050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu ((ImageView)findViewById(R.id.app_icon)).setImageDrawable(mAppInfo.loadIcon(mPm)); 33150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu //set application name TODO version 33250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu CharSequence appName = mAppInfo.loadLabel(mPm); 33350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu if(appName == null) { 33450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu appName = getString(_UNKNOWN_APP); 33550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 33650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu ((TextView)findViewById(R.id.app_name)).setText(appName); 33750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 33850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 33950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Utility method to set application version 34050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private void setAppVersion(PackageInfo pkgInfo) { 34150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Version number of application 34250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppVersion = ((TextView)findViewById(R.id.app_version)); 34350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu if (pkgInfo != null) { 34450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppVersion.setVisibility(View.VISIBLE); 34550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppVersion.setText(getString(R.string.version_text, 3468e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes String.valueOf(pkgInfo.versionName))); 34750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } else { 34850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppVersion.setVisibility(View.GONE); 34950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 35050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 35150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 35250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu @Override 35342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public void onResume() { 35442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu super.onResume(); 35550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu PackageInfo pkgInfo; 35650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Get application info again to refresh changed properties of application 35750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu try { 35850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppInfo = mPm.getApplicationInfo(mAppInfo.packageName, 35950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu PackageManager.GET_UNINSTALLED_PACKAGES); 3609f1900dc05773a0659030e21a8c2fa1641655669Dianne Hackborn pkgInfo = mPm.getPackageInfo(mAppInfo.packageName, 3619f1900dc05773a0659030e21a8c2fa1641655669Dianne Hackborn PackageManager.GET_UNINSTALLED_PACKAGES); 36250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } catch (NameNotFoundException e) { 36350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu Log.e(TAG, "Exception when retrieving package:" + mAppInfo.packageName, e); 36450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialogInner(DLG_APP_NOT_FOUND); 36550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return; 36650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 367cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn checkForceStop(); 36850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu refreshAppAttributes(pkgInfo); 369afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 37042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 371afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void setIntentAndFinish(boolean finish, boolean appChanged) { 372afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(localLOGV) Log.i(TAG, "appChanged="+appChanged); 373afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Intent intent = new Intent(); 374afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project intent.putExtra(ManageApplications.APP_CHG, appChanged); 375afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project setResult(ManageApplications.RESULT_OK, intent); 376afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(finish) { 377afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project finish(); 378afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 379afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 380afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 381afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 382afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to handle get size info notification from observer when 383afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * the async operation from PackageManager is complete. The current user data 384afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * info has to be refreshed in the manage applications screen as well as the current screen. 385afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 386afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void refreshSizeInfo(Message msg) { 387afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project boolean changed = false; 388afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project PackageStats newPs = msg.getData().getParcelable(ATTR_PACKAGE_STATS); 389afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project long newTot = newPs.cacheSize+newPs.codeSize+newPs.dataSize; 390afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(mSizeInfo == null) { 391afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSizeInfo = newPs; 392afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String str = getSizeStr(newTot); 393afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize.setText(str); 394afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize.setText(getSizeStr(newPs.codeSize)); 395afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize.setText(getSizeStr(newPs.dataSize)); 396afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(getSizeStr(newPs.cacheSize)); 397afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 398afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project long oldTot = mSizeInfo.cacheSize+mSizeInfo.codeSize+mSizeInfo.dataSize; 399afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newTot != oldTot) { 400afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String str = getSizeStr(newTot); 401afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize.setText(str); 402afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 403afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 404afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newPs.codeSize != mSizeInfo.codeSize) { 405afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize.setText(getSizeStr(newPs.codeSize)); 406afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 407afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 408afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newPs.dataSize != mSizeInfo.dataSize) { 409afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize.setText(getSizeStr(newPs.dataSize)); 410afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 411afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 412afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newPs.cacheSize != mSizeInfo.cacheSize) { 413afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(getSizeStr(newPs.cacheSize)); 414afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 415afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 416afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(changed) { 417afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSizeInfo = newPs; 418afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 419afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 42042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // If data size is zero disable clear data button 42142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (newPs.dataSize == 0) { 42242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(false); 423afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 42442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu long data = mSizeInfo.dataSize; 425afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project refreshCacheInfo(newPs.cacheSize); 426afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 427afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 428afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void refreshCacheInfo(long cacheSize) { 429afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Set cache info 430afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(getSizeStr(cacheSize)); 431afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (cacheSize <= 0) { 432afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheButton.setEnabled(false); 433afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 434afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheButton.setOnClickListener(this); 435afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 436afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 437afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 438afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 439afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to handle clear message notification from observer when 440afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * the async operation from PackageManager is complete 441afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 442afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void processClearMsg(Message msg) { 443afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int result = msg.arg1; 444afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String packageName = mAppInfo.packageName; 44542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.clear_user_data_text); 446afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(result == OP_SUCCESSFUL) { 44742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Log.i(TAG, "Cleared user data for package : "+packageName); 448afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.getPackageSizeInfo(packageName, mSizeObserver); 449afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 45042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(true); 451afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 452afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 453ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu 454ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private void processMoveMsg(Message msg) { 455ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu int result = msg.arg1; 456ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu String packageName = mAppInfo.packageName; 457ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu if(result == PackageManager.MOVE_SUCCEEDED) { 458ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu Log.i(TAG, "Moved resources for " + packageName); 459ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu try { 460ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu // Reset flags 461ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mAppInfo = mPm.getApplicationInfo(packageName, 462ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu PackageManager.GET_UNINSTALLED_PACKAGES); 463ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu initMoveButton(); 464ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } catch (NameNotFoundException e) { 465ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu // TODO error handling 466ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 467ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } else { 468ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu // TODO Present a dialog indicating failure. 469ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 470ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 471afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 472afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 473afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to initiate clearing user data when the user clicks the clear data 474afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * button for a system package 475afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 47642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void initiateClearUserData() { 47742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(false); 47842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Invoke uninstall or clear user data based on sysPackage 479afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String packageName = mAppInfo.packageName; 48042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Log.i(TAG, "Clearing user data for package : " + packageName); 481afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(mClearDataObserver == null) { 482afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearDataObserver = new ClearUserDataObserver(); 483afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 484afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 485afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project boolean res = am.clearApplicationUserData(packageName, mClearDataObserver); 486afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(!res) { 48750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Clearing data failed for some obscure reason. Just log error for now 488afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Log.i(TAG, "Couldnt clear application user data for package:"+packageName); 48950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialogInner(DLG_CANNOT_CLEAR_DATA); 490afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 49142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.recompute_size); 492afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 493afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 494afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 49550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private void showDialogInner(int id) { 49650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu //removeDialog(id); 49750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialog(id); 49850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 49950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 50050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu @Override 50142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public Dialog onCreateDialog(int id, Bundle args) { 50250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu switch (id) { 50350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu case DLG_CLEAR_DATA: 50450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return new AlertDialog.Builder(this) 50550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setTitle(getString(R.string.clear_data_dlg_title)) 50650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 50750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setMessage(getString(R.string.clear_data_dlg_text)) 50842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setPositiveButton(R.string.dlg_ok, 50942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu new DialogInterface.OnClickListener() { 51042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 51142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Clear user data here 51242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu initiateClearUserData(); 51342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 51442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu }) 51542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setNegativeButton(R.string.dlg_cancel, null) 51650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .create(); 51750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu case DLG_FACTORY_RESET: 51850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return new AlertDialog.Builder(this) 51950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setTitle(getString(R.string.app_factory_reset_dlg_title)) 52050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 52150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setMessage(getString(R.string.app_factory_reset_dlg_text)) 52242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setPositiveButton(R.string.dlg_ok, 52342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu new DialogInterface.OnClickListener() { 52442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 52542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Clear user data here 52642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu uninstallPkg(mAppInfo.packageName); 52742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 52842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu }) 52942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setNegativeButton(R.string.dlg_cancel, null) 53050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .create(); 53150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu case DLG_APP_NOT_FOUND: 53250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return new AlertDialog.Builder(this) 53350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setTitle(getString(R.string.app_not_found_dlg_title)) 53450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 53550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setMessage(getString(R.string.app_not_found_dlg_title)) 53650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setNeutralButton(getString(R.string.dlg_ok), 53750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu new DialogInterface.OnClickListener() { 53850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 53950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu //force to recompute changed value 54050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setIntentAndFinish(true, true); 54150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 54250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu }) 54350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .create(); 54450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu case DLG_CANNOT_CLEAR_DATA: 54550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return new AlertDialog.Builder(this) 54650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setTitle(getString(R.string.clear_failed_dlg_title)) 54750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 54850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setMessage(getString(R.string.clear_failed_dlg_text)) 54950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setNeutralButton(R.string.dlg_ok, 55050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu new DialogInterface.OnClickListener() { 55150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 55242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(false); 55350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu //force to recompute changed value 55450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setIntentAndFinish(false, false); 55550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 55650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu }) 55750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .create(); 55842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu case DLG_FORCE_STOP: 55942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu return new AlertDialog.Builder(this) 56042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setTitle(getString(R.string.force_stop_dlg_title)) 56142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 56242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setMessage(getString(R.string.force_stop_dlg_text)) 56342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setPositiveButton(R.string.dlg_ok, 56442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu new DialogInterface.OnClickListener() { 56542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 56642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Force stop 56742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu forceStopPackage(mAppInfo.packageName); 56842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 56942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu }) 57042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .setNegativeButton(R.string.dlg_cancel, null) 57142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu .create(); 57250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 57350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return null; 57450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 57550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 57650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private void uninstallPkg(String packageName) { 57750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Create new intent to launch Uninstaller activity 57850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu Uri packageURI = Uri.parse("package:"+packageName); 57950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI); 58050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu startActivity(uninstallIntent); 58150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setIntentAndFinish(true, true); 58250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 58350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 58442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void forceStopPackage(String pkgName) { 58542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu ActivityManager am = (ActivityManager)getSystemService( 58642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Context.ACTIVITY_SERVICE); 58742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu am.forceStopPackage(pkgName); 588cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn checkForceStop(); 58942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 59042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 591cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() { 592cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn @Override 593cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn public void onReceive(Context context, Intent intent) { 594cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn mForceStopButton.setEnabled(getResultCode() != RESULT_CANCELED); 595cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn } 596cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn }; 597cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn 598cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn private void checkForceStop() { 599cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART, 600cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn Uri.fromParts("package", mAppInfo.packageName, null)); 601cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppInfo.packageName }); 602cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn intent.putExtra(Intent.EXTRA_UID, mAppInfo.uid); 603cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null, 604cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn Activity.RESULT_CANCELED, null, null); 605cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn } 606cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn 607afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 608afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Method implementing functionality of buttons clicked 609afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * @see android.view.View.OnClickListener#onClick(android.view.View) 610afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 611afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onClick(View v) { 612afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String packageName = mAppInfo.packageName; 61342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if(v == mUninstallButton) { 61442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (mUpdatedSysApp) { 61550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialogInner(DLG_FACTORY_RESET); 61642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 61750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu uninstallPkg(packageName); 618afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 619afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if(v == mActivitiesButton) { 620afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.clearPackagePreferredActivities(packageName); 621afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mActivitiesButton.setEnabled(false); 62242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else if(v == mClearDataButton) { 62342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (mAppInfo.manageSpaceActivityName != null) { 62442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Intent intent = new Intent(Intent.ACTION_DEFAULT); 62542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu intent.setClassName(mAppInfo.packageName, mAppInfo.manageSpaceActivityName); 62642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu startActivityForResult(intent, -1); 62742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 62842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu showDialogInner(DLG_CLEAR_DATA); 62942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 630afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mClearCacheButton) { 631afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Lazy initialization of observer 632afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mClearCacheObserver == null) { 633afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheObserver = new ClearCacheObserver(); 634afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 635afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver); 636afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mForceStopButton) { 63742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // TODO Once framework supports a pre-broadcast to 63842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // actually find out if an application will be restarted right 63942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // after its killed, there is no way we can determine if 64042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // a force stop will really kill the app. So just ignore 64142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // the dialog for now and force stop the package. Please note 64242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // that the button cannot be enabled or disabled since 64342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // we do not have this info for now. 64442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu forceStopPackage(mAppInfo.packageName); 645ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } else if (v == mMoveAppButton) { 646ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu if (mPackageMoveObserver == null) { 647ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mPackageMoveObserver = new PackageMoveObserver(); 648ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 649ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu int moveFlags = (mAppInfo.flags & ApplicationInfo.FLAG_ON_SDCARD) != 0 ? 650ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu PackageManager.MOVE_INTERNAL : PackageManager.MOVE_EXTERNAL_MEDIA; 651ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mMoveAppButton.setText(R.string.moving); 652ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mMoveAppButton.setEnabled(false); 653ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mPm.movePackage(mAppInfo.packageName, mPackageMoveObserver, moveFlags); 654afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 655afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 656afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 657afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 658