InstalledAppDetails.java revision 8e1b0fb77ce50ddc99a596da48b65190e2708362
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; 26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.DialogInterface; 28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.IntentFilter; 30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.ApplicationInfo; 31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageDataObserver; 3250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.content.pm.IPackageDeleteObserver; 33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageStatsObserver; 3450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.content.pm.PackageInfo; 35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager; 36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageStats; 37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException; 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.Uri; 39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Handler; 41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Message; 4250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.os.RemoteException; 43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.format.Formatter; 44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Config; 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 */ 65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpublic class InstalledAppDetails extends Activity implements View.OnClickListener, DialogInterface.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; 69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mAppButton; 70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mActivitiesButton; 7150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private boolean localLOGV = false; 7250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private TextView mAppVersion; 73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mTotalSize; 74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mAppSize; 75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mDataSize; 76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private PkgSizeObserver mSizeObserver; 77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private ClearUserDataObserver mClearDataObserver; 78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Views related to cache info 79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private View mCachePanel; 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; 84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project PackageStats mSizeInfo; 86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mManageSpaceButton; 87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private PackageManager mPm; 88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //internal constants used in Handler 90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int OP_SUCCESSFUL = 1; 91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int OP_FAILED = 2; 92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int CLEAR_USER_DATA = 1; 93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int GET_PKG_SIZE = 2; 94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int CLEAR_CACHE = 3; 95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String ATTR_PACKAGE_STATS="PackageStats"; 96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // invalid size value used initially and also when size retrieval through PackageManager 98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // fails for whatever reason 99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int SIZE_INVALID = -1; 100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 101afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Resource strings 102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mInvalidSizeStr; 103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mComputingStr; 104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mAppButtonText; 105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 10650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Dialog identifiers used in showDialog 10750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_BASE = 0; 10850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_CLEAR_DATA = DLG_BASE + 1; 10950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_FACTORY_RESET = DLG_BASE + 2; 11050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_APP_NOT_FOUND = DLG_BASE + 3; 11150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_CANNOT_CLEAR_DATA = DLG_BASE + 4; 11250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 113afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Possible btn states 114afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private enum AppButtonStates { 115afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project CLEAR_DATA, 116afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project UNINSTALL, 11750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu FACTORY_RESET, 118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project NONE 119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private AppButtonStates mAppButtonState; 121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Handler mHandler = new Handler() { 123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void handleMessage(Message msg) { 124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project switch (msg.what) { 125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case CLEAR_USER_DATA: 126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project processClearMsg(msg); 127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case GET_PKG_SIZE: 129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project refreshSizeInfo(msg); 130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case CLEAR_CACHE: 132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Refresh size info 133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver); 134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project default: 136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }; 140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project class ClearUserDataObserver extends IPackageDataObserver.Stub { 142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onRemoveCompleted(final String packageName, final boolean succeeded) { 143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA); 144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED; 145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mHandler.sendMessage(msg); 146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project class PkgSizeObserver extends IPackageStatsObserver.Stub { 150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public int idx; 151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) { 152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Message msg = mHandler.obtainMessage(GET_PKG_SIZE); 153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Bundle data = new Bundle(); 154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project data.putParcelable(ATTR_PACKAGE_STATS, pStats); 155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project msg.setData(data); 156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mHandler.sendMessage(msg); 157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 16050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project class ClearCacheObserver extends IPackageDataObserver.Stub { 162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onRemoveCompleted(final String packageName, final boolean succeeded) { 163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final Message msg = mHandler.obtainMessage(CLEAR_CACHE); 164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED; 165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mHandler.sendMessage(msg); 166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String getSizeStr(long size) { 170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (size == SIZE_INVALID) { 171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return mInvalidSizeStr.toString(); 172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return Formatter.formatFileSize(this, size); 174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** Called when the activity is first created. */ 177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project protected void onCreate(Bundle icicle) { 179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(icicle); 18050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Get package manager 181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm = getPackageManager(); 18250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Get application's name from intent 183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Intent intent = getIntent(); 184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final String packageName = intent.getStringExtra(ManageApplications.APP_PKG_NAME); 185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mComputingStr = getText(R.string.computing_size); 186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Try retrieving package stats again 187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project CharSequence totalSizeStr, appSizeStr, dataSizeStr; 188afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project totalSizeStr = appSizeStr = dataSizeStr = mComputingStr; 189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(localLOGV) Log.i(TAG, "Have to compute package sizes"); 190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSizeObserver = new PkgSizeObserver(); 191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project try { 192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppInfo = mPm.getApplicationInfo(packageName, 193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project PackageManager.GET_UNINSTALLED_PACKAGES); 194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } catch (NameNotFoundException e) { 195afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Log.e(TAG, "Exception when retrieving package:"+packageName, e); 19650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialogInner(DLG_APP_NOT_FOUND); 19750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return; 198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 19950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setContentView(R.layout.installed_app_details); 200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //TODO download str and download url 20150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Set default values on sizes 202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize = (TextView)findViewById(R.id.total_size_text); 203afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize.setText(totalSizeStr); 204afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize = (TextView)findViewById(R.id.application_size_text); 205afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize.setText(appSizeStr); 206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize = (TextView)findViewById(R.id.data_size_text); 207afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize.setText(dataSizeStr); 20850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Get AppButton 209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButton = ((Button)findViewById(R.id.uninstall_button)); 21050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Get ManageSpaceButton 211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mManageSpaceButton = (Button)findViewById(R.id.manage_space_button); 212afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(mAppInfo.manageSpaceActivityName != null) { 213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mManageSpaceButton.setVisibility(View.VISIBLE); 214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mManageSpaceButton.setOnClickListener(this); 215afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Cache section 217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCachePanel = findViewById(R.id.cache_panel); 218afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize = (TextView) findViewById(R.id.cache_size_text); 219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(mComputingStr); 220afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheButton = (Button) findViewById(R.id.clear_cache_button); 221afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mForceStopButton = (Button) findViewById(R.id.force_stop_button); 222afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mForceStopButton.setOnClickListener(this); 22350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Get list of preferred activities 224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mActivitiesButton = (Button)findViewById(R.id.clear_activities_button); 225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project List<ComponentName> prefActList = new ArrayList<ComponentName>(); 22650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Intent list cannot be null. so pass empty list 227afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project List<IntentFilter> intentList = new ArrayList<IntentFilter>(); 228afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.getPreferredActivities(intentList, prefActList, packageName); 229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(localLOGV) Log.i(TAG, "Have "+prefActList.size()+" number of activities in prefered list"); 230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project TextView autoLaunchView = (TextView)findViewById(R.id.auto_launch); 231afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(prefActList.size() <= 0) { 23250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Disable clear activities button 233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project autoLaunchView.setText(R.string.auto_launch_disable_text); 234afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mActivitiesButton.setEnabled(false); 235afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project autoLaunchView.setText(R.string.auto_launch_enable_text); 237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mActivitiesButton.setOnClickListener(this); 238afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 24050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Security permissions section 241afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project LinearLayout permsView = (LinearLayout) findViewById(R.id.permissions_section); 242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project AppSecurityPermissions asp = new AppSecurityPermissions(this, packageName); 243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(asp.getPermissionCount() > 0) { 244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project permsView.setVisibility(View.VISIBLE); 245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Make the security sections header visible 246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project LinearLayout securityList = (LinearLayout) permsView.findViewById( 247afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project R.id.security_settings_list); 248afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project securityList.addView(asp.getPermissionsView()); 249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project permsView.setVisibility(View.GONE); 251afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 252afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 25450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private void refreshAppAttributes(PackageInfo pkgInfo) { 25550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setAppLabelAndIcon(); 25650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Version number of application 25750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setAppVersion(pkgInfo); 25850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setAppBtnState(); 25950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Refresh size info 260a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu if (mAppInfo != null && mAppInfo.packageName != null) { 261a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver); 262a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu } 263a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu } 264a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu 26550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Utility method to set applicaiton label and icon. 26650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private void setAppLabelAndIcon() { 26750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu ((ImageView)findViewById(R.id.app_icon)).setImageDrawable(mAppInfo.loadIcon(mPm)); 26850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu //set application name TODO version 26950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu CharSequence appName = mAppInfo.loadLabel(mPm); 27050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu if(appName == null) { 27150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu appName = getString(_UNKNOWN_APP); 27250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 27350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu ((TextView)findViewById(R.id.app_name)).setText(appName); 27450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 27550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 27650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Utility method to set application version 27750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private void setAppVersion(PackageInfo pkgInfo) { 27850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Version number of application 27950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppVersion = ((TextView)findViewById(R.id.app_version)); 28050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu if (pkgInfo != null) { 28150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppVersion.setVisibility(View.VISIBLE); 28250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppVersion.setText(getString(R.string.version_text, 2838e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes String.valueOf(pkgInfo.versionName))); 28450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } else { 28550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppVersion.setVisibility(View.GONE); 28650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 28750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 28850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 28950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Utility method to set button state 29050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private void setAppBtnState() { 29150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu boolean visible = true; 29250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu if ((mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 29350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu if ((mAppInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) { 29450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppButtonState = AppButtonStates.FACTORY_RESET; 29550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppButtonText = getText(R.string.app_factory_reset); 29650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } else { 29750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu if ((mAppInfo.flags & ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA) == 0) { 29850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Hide button if diableClearUserData is set 29950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppButtonState = AppButtonStates.NONE; 30050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu visible = false; 30150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } else { 30250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppButtonState = AppButtonStates.CLEAR_DATA; 30350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppButtonText = getText(R.string.clear_user_data_text); 304afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 30550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 30650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } else { 30750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppButtonState = AppButtonStates.UNINSTALL; 30850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppButtonText = getText(R.string.uninstall_text); 30950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 31050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu if(visible) { 31150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppButton.setText(mAppButtonText); 31250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppButton.setVisibility(View.VISIBLE); 31350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } else { 31450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppButton.setVisibility(View.GONE); 31550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 31650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 31750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 31850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu @Override 31950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu public void onStart() { 32050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu super.onStart(); 32150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu PackageInfo pkgInfo; 32250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Get application info again to refresh changed properties of application 32350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu try { 32450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppInfo = mPm.getApplicationInfo(mAppInfo.packageName, 32550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu PackageManager.GET_UNINSTALLED_PACKAGES); 32650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu pkgInfo = mPm.getPackageInfo(mAppInfo.packageName, 0); 32750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } catch (NameNotFoundException e) { 32850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu Log.e(TAG, "Exception when retrieving package:" + mAppInfo.packageName, e); 32950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialogInner(DLG_APP_NOT_FOUND); 33050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return; 33150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 33250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu refreshAppAttributes(pkgInfo); 333afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 334afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 335afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void setIntentAndFinish(boolean finish, boolean appChanged) { 336afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(localLOGV) Log.i(TAG, "appChanged="+appChanged); 337afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Intent intent = new Intent(); 338afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project intent.putExtra(ManageApplications.APP_CHG, appChanged); 339afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project setResult(ManageApplications.RESULT_OK, intent); 340afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButton.setEnabled(false); 341afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(finish) { 342afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project finish(); 343afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 344afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 345afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 346afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 347afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to handle get size info notification from observer when 348afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * the async operation from PackageManager is complete. The current user data 349afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * info has to be refreshed in the manage applications screen as well as the current screen. 350afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 351afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void refreshSizeInfo(Message msg) { 352afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project boolean changed = false; 353afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project PackageStats newPs = msg.getData().getParcelable(ATTR_PACKAGE_STATS); 354afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project long newTot = newPs.cacheSize+newPs.codeSize+newPs.dataSize; 355afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(mSizeInfo == null) { 356afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSizeInfo = newPs; 357afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String str = getSizeStr(newTot); 358afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize.setText(str); 359afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize.setText(getSizeStr(newPs.codeSize)); 360afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize.setText(getSizeStr(newPs.dataSize)); 361afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(getSizeStr(newPs.cacheSize)); 362afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 363afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project long oldTot = mSizeInfo.cacheSize+mSizeInfo.codeSize+mSizeInfo.dataSize; 364afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newTot != oldTot) { 365afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String str = getSizeStr(newTot); 366afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize.setText(str); 367afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 368afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 369afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newPs.codeSize != mSizeInfo.codeSize) { 370afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize.setText(getSizeStr(newPs.codeSize)); 371afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 372afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 373afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newPs.dataSize != mSizeInfo.dataSize) { 374afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize.setText(getSizeStr(newPs.dataSize)); 375afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 376afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 377afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newPs.cacheSize != mSizeInfo.cacheSize) { 378afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(getSizeStr(newPs.cacheSize)); 379afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 380afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 381afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(changed) { 382afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSizeInfo = newPs; 383afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 384afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 385afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 386afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project long data = mSizeInfo.dataSize; 387afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Disable button if data is 0 388afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(mAppButtonState != AppButtonStates.NONE){ 389afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButton.setText(mAppButtonText); 390afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if((mAppButtonState == AppButtonStates.CLEAR_DATA) && (data == 0)) { 391afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButton.setEnabled(false); 392afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 393afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButton.setEnabled(true); 394afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButton.setOnClickListener(this); 395afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 396afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 397afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project refreshCacheInfo(newPs.cacheSize); 398afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 399afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 400afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void refreshCacheInfo(long cacheSize) { 401afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Set cache info 402afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(getSizeStr(cacheSize)); 403afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (cacheSize <= 0) { 404afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheButton.setEnabled(false); 405afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 406afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheButton.setOnClickListener(this); 407afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 408afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 409afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 410afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 411afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to handle clear message notification from observer when 412afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * the async operation from PackageManager is complete 413afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 414afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void processClearMsg(Message msg) { 415afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int result = msg.arg1; 416afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String packageName = mAppInfo.packageName; 417afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(result == OP_SUCCESSFUL) { 418afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Log.i(TAG, "Cleared user data for system package:"+packageName); 419afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.getPackageSizeInfo(packageName, mSizeObserver); 420afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 421afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButton.setText(R.string.clear_user_data_text); 422afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButton.setEnabled(true); 423afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 424afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 425afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 426afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 427afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to initiate clearing user data when the user clicks the clear data 428afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * button for a system package 429afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 430afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void initiateClearUserDataForSysPkg() { 431afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButton.setEnabled(false); 432afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //invoke uninstall or clear user data based on sysPackage 433afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String packageName = mAppInfo.packageName; 434afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Log.i(TAG, "Clearing user data for system package"); 435afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(mClearDataObserver == null) { 436afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearDataObserver = new ClearUserDataObserver(); 437afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 438afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 439afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project boolean res = am.clearApplicationUserData(packageName, mClearDataObserver); 440afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(!res) { 44150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Clearing data failed for some obscure reason. Just log error for now 442afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Log.i(TAG, "Couldnt clear application user data for package:"+packageName); 44350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialogInner(DLG_CANNOT_CLEAR_DATA); 444afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 445afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButton.setText(R.string.recompute_size); 446afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 447afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 448afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 44950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private void showDialogInner(int id) { 45050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu //removeDialog(id); 45150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialog(id); 45250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 45350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 45450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu @Override 45550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu public Dialog onCreateDialog(int id) { 45650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu switch (id) { 45750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu case DLG_CLEAR_DATA: 45850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return new AlertDialog.Builder(this) 45950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setTitle(getString(R.string.clear_data_dlg_title)) 46050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 46150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setMessage(getString(R.string.clear_data_dlg_text)) 46250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setPositiveButton(R.string.dlg_ok, this) 46350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setNegativeButton(R.string.dlg_cancel, this) 46450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .create(); 46550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu case DLG_FACTORY_RESET: 46650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return new AlertDialog.Builder(this) 46750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setTitle(getString(R.string.app_factory_reset_dlg_title)) 46850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 46950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setMessage(getString(R.string.app_factory_reset_dlg_text)) 47050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setPositiveButton(R.string.dlg_ok, this) 47150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setNegativeButton(R.string.dlg_cancel, this) 47250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .create(); 47350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu case DLG_APP_NOT_FOUND: 47450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return new AlertDialog.Builder(this) 47550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setTitle(getString(R.string.app_not_found_dlg_title)) 47650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 47750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setMessage(getString(R.string.app_not_found_dlg_title)) 47850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setNeutralButton(getString(R.string.dlg_ok), 47950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu new DialogInterface.OnClickListener() { 48050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 48150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu //force to recompute changed value 48250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setIntentAndFinish(true, true); 48350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 48450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu }) 48550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .create(); 48650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu case DLG_CANNOT_CLEAR_DATA: 48750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return new AlertDialog.Builder(this) 48850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setTitle(getString(R.string.clear_failed_dlg_title)) 48950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setIcon(android.R.drawable.ic_dialog_alert) 49050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setMessage(getString(R.string.clear_failed_dlg_text)) 49150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .setNeutralButton(R.string.dlg_ok, 49250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu new DialogInterface.OnClickListener() { 49350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 49450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu //force to recompute changed value 49550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setIntentAndFinish(false, false); 49650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 49750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu }) 49850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu .create(); 49950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 50050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu return null; 50150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 50250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 50350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private void uninstallPkg(String packageName) { 50450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Create new intent to launch Uninstaller activity 50550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu Uri packageURI = Uri.parse("package:"+packageName); 50650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI); 50750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu startActivity(uninstallIntent); 50850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu setIntentAndFinish(true, true); 50950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 51050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 511afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 512afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Method implementing functionality of buttons clicked 513afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * @see android.view.View.OnClickListener#onClick(android.view.View) 514afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 515afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onClick(View v) { 516afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String packageName = mAppInfo.packageName; 517afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(v == mAppButton) { 51850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu if (mAppButtonState == AppButtonStates.CLEAR_DATA) { 51950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialogInner(DLG_CLEAR_DATA); 52050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } else if (mAppButtonState == AppButtonStates.FACTORY_RESET) { 52150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu showDialogInner(DLG_FACTORY_RESET); 52250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } else if (mAppButtonState == AppButtonStates.UNINSTALL) { 52350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu uninstallPkg(packageName); 524afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 525afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if(v == mActivitiesButton) { 526afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.clearPackagePreferredActivities(packageName); 527afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mActivitiesButton.setEnabled(false); 528afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if(v == mManageSpaceButton) { 529afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Intent intent = new Intent(Intent.ACTION_DEFAULT); 530afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project intent.setClassName(mAppInfo.packageName, mAppInfo.manageSpaceActivityName); 531afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project startActivityForResult(intent, -1); 532afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mClearCacheButton) { 533afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Lazy initialization of observer 534afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mClearCacheObserver == null) { 535afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheObserver = new ClearCacheObserver(); 536afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 537afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver); 538afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mForceStopButton) { 539afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project ActivityManager am = (ActivityManager)getSystemService( 540afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Context.ACTIVITY_SERVICE); 541afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project am.restartPackage(packageName); 542afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 543afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 544afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 545afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onClick(DialogInterface dialog, int which) { 546afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(which == AlertDialog.BUTTON_POSITIVE) { 54750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu if (mAppButtonState == AppButtonStates.CLEAR_DATA) { 54850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Invoke uninstall or clear user data based on sysPackage 54950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu initiateClearUserDataForSysPkg(); 55050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } else if (mAppButtonState == AppButtonStates.FACTORY_RESET) { 55150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Initiate package installer to delete package 55250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu uninstallPkg(mAppInfo.packageName); 55350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 554afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 555afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //cancel do nothing just retain existing screen 556afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 557afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 558afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 559afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 560