InstalledAppDetails.java revision afc4ab2ffbb8327ddce9907961295a32cbf49d0f
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; 25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.DialogInterface; 27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.IntentFilter; 29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.ApplicationInfo; 30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageDataObserver; 31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageStatsObserver; 32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager; 33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageStats; 34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException; 35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.Uri; 36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Handler; 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Message; 39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.format.Formatter; 40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Config; 41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log; 42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList; 43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List; 44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.ComponentName; 45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AppSecurityPermissions; 47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button; 48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView; 49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.LinearLayout; 50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView; 51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display application information from Settings. This activity presents 54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * extended information associated with a package like code, data, total size, permissions 55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * used by the application and also the set of default launchable activities. 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For system applications, an option to clear user data is displayed only if data size is > 0. 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * System applications that do not want clear user data do not have this option. 58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For non-system applications, there is no option to clear data. Instead there is an option to 59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * uninstall the application. 60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpublic class InstalledAppDetails extends Activity implements View.OnClickListener, DialogInterface.OnClickListener { 62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String TAG="InstalledAppDetails"; 63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int _UNKNOWN_APP=R.string.unknown; 64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private ApplicationInfo mAppInfo; 65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mAppButton; 66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mActivitiesButton; 67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private boolean mCanUninstall; 68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private boolean localLOGV=Config.LOGV || false; 69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mAppSnippetSize; 70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mTotalSize; 71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mAppSize; 72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mDataSize; 73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private PkgSizeObserver mSizeObserver; 74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private ClearUserDataObserver mClearDataObserver; 75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Views related to cache info 76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private View mCachePanel; 77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mCacheSize; 78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mClearCacheButton; 79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private ClearCacheObserver mClearCacheObserver; 80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mForceStopButton; 81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project PackageStats mSizeInfo; 83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mManageSpaceButton; 84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private PackageManager mPm; 85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //internal constants used in Handler 87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int OP_SUCCESSFUL = 1; 88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int OP_FAILED = 2; 89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int CLEAR_USER_DATA = 1; 90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int GET_PKG_SIZE = 2; 91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int CLEAR_CACHE = 3; 92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String ATTR_PACKAGE_STATS="PackageStats"; 93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // invalid size value used initially and also when size retrieval through PackageManager 95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // fails for whatever reason 96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int SIZE_INVALID = -1; 97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Resource strings 99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mInvalidSizeStr; 100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mComputingStr; 101afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mAppButtonText; 102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Possible btn states 104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private enum AppButtonStates { 105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project CLEAR_DATA, 106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project UNINSTALL, 107afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project NONE 108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 109afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private AppButtonStates mAppButtonState; 110afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 111afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Handler mHandler = new Handler() { 112afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void handleMessage(Message msg) { 113afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project switch (msg.what) { 114afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case CLEAR_USER_DATA: 115afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project processClearMsg(msg); 116afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case GET_PKG_SIZE: 118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project refreshSizeInfo(msg); 119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case CLEAR_CACHE: 121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Refresh size info 122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver); 123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project default: 125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }; 129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private boolean isUninstallable() { 131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (((mAppInfo.flags&ApplicationInfo.FLAG_SYSTEM) != 0) && 132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project ((mAppInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0)) { 133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return false; 134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return true; 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 int idx; 148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) { 149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Message msg = mHandler.obtainMessage(GET_PKG_SIZE); 150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Bundle data = new Bundle(); 151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project data.putParcelable(ATTR_PACKAGE_STATS, pStats); 152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project msg.setData(data); 153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mHandler.sendMessage(msg); 154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project class ClearCacheObserver extends IPackageDataObserver.Stub { 159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onRemoveCompleted(final String packageName, final boolean succeeded) { 160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final Message msg = mHandler.obtainMessage(CLEAR_CACHE); 161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED; 162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mHandler.sendMessage(msg); 163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String getSizeStr(long size) { 167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (size == SIZE_INVALID) { 168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return mInvalidSizeStr.toString(); 169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return Formatter.formatFileSize(this, size); 171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void setAppBtnState() { 174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project boolean visible = false; 175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(mCanUninstall) { 176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //app can clear user data 177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if((mAppInfo.flags & ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA) 178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project == ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA) { 179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButtonText = getText(R.string.clear_user_data_text); 180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButtonState = AppButtonStates.CLEAR_DATA; 181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project visible = true; 182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //hide button if diableClearUserData is set 184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project visible = false; 185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButtonState = AppButtonStates.NONE; 186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 188afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project visible = true; 189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButtonState = AppButtonStates.UNINSTALL; 190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButtonText = getText(R.string.uninstall_text); 191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(visible) { 193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButton.setText(mAppButtonText); 194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButton.setVisibility(View.VISIBLE); 195afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 196afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButton.setVisibility(View.GONE); 197afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 199afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** Called when the activity is first created. */ 201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project protected void onCreate(Bundle icicle) { 203afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(icicle); 204afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //get package manager 205afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm = getPackageManager(); 206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //get application's name from intent 207afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Intent intent = getIntent(); 208afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final String packageName = intent.getStringExtra(ManageApplications.APP_PKG_NAME); 209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mComputingStr = getText(R.string.computing_size); 210afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Try retrieving package stats again 211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project CharSequence totalSizeStr, appSizeStr, dataSizeStr; 212afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project totalSizeStr = appSizeStr = dataSizeStr = mComputingStr; 213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(localLOGV) Log.i(TAG, "Have to compute package sizes"); 214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSizeObserver = new PkgSizeObserver(); 215afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.getPackageSizeInfo(packageName, mSizeObserver); 216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project try { 218afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppInfo = mPm.getApplicationInfo(packageName, 219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project PackageManager.GET_UNINSTALLED_PACKAGES); 220afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } catch (NameNotFoundException e) { 221afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Log.e(TAG, "Exception when retrieving package:"+packageName, e); 222afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project displayErrorDialog(R.string.app_not_found_dlg_text, true, true); 223afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project setContentView(R.layout.installed_app_details); 225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project ((ImageView)findViewById(R.id.app_icon)).setImageDrawable(mAppInfo.loadIcon(mPm)); 226afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //set application name TODO version 227afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project CharSequence appName = mAppInfo.loadLabel(mPm); 228afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(appName == null) { 229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project appName = getString(_UNKNOWN_APP); 230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 231afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project ((TextView)findViewById(R.id.app_name)).setText(appName); 232afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSnippetSize = ((TextView)findViewById(R.id.app_size)); 233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSnippetSize.setText(totalSizeStr); 234afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //TODO download str and download url 235afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //set values on views 236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize = (TextView)findViewById(R.id.total_size_text); 237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize.setText(totalSizeStr); 238afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize = (TextView)findViewById(R.id.application_size_text); 239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize.setText(appSizeStr); 240afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize = (TextView)findViewById(R.id.data_size_text); 241afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize.setText(dataSizeStr); 242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButton = ((Button)findViewById(R.id.uninstall_button)); 244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //determine if app is a system app 245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCanUninstall = !isUninstallable(); 246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(localLOGV) Log.i(TAG, "Is systemPackage "+mCanUninstall); 247afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project setAppBtnState(); 248afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mManageSpaceButton = (Button)findViewById(R.id.manage_space_button); 249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(mAppInfo.manageSpaceActivityName != null) { 250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mManageSpaceButton.setVisibility(View.VISIBLE); 251afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mManageSpaceButton.setOnClickListener(this); 252afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 254afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Cache section 255afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCachePanel = findViewById(R.id.cache_panel); 256afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize = (TextView) findViewById(R.id.cache_size_text); 257afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(mComputingStr); 258afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheButton = (Button) findViewById(R.id.clear_cache_button); 259afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mForceStopButton = (Button) findViewById(R.id.force_stop_button); 260afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mForceStopButton.setOnClickListener(this); 261afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 262afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //clear activities 263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mActivitiesButton = (Button)findViewById(R.id.clear_activities_button); 264afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project List<ComponentName> prefActList = new ArrayList<ComponentName>(); 265afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //intent list cannot be null. so pass empty list 266afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project List<IntentFilter> intentList = new ArrayList<IntentFilter>(); 267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.getPreferredActivities(intentList, prefActList, packageName); 268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(localLOGV) Log.i(TAG, "Have "+prefActList.size()+" number of activities in prefered list"); 269afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project TextView autoLaunchView = (TextView)findViewById(R.id.auto_launch); 270afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(prefActList.size() <= 0) { 271afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //disable clear activities button 272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project autoLaunchView.setText(R.string.auto_launch_disable_text); 273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mActivitiesButton.setEnabled(false); 274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 275afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project autoLaunchView.setText(R.string.auto_launch_enable_text); 276afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mActivitiesButton.setOnClickListener(this); 277afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 278afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 279afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // security permissions section 280afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project LinearLayout permsView = (LinearLayout) findViewById(R.id.permissions_section); 281afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project AppSecurityPermissions asp = new AppSecurityPermissions(this, packageName); 282afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(asp.getPermissionCount() > 0) { 283afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project permsView.setVisibility(View.VISIBLE); 284afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Make the security sections header visible 285afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project LinearLayout securityList = (LinearLayout) permsView.findViewById( 286afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project R.id.security_settings_list); 287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project securityList.addView(asp.getPermissionsView()); 288afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 289afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project permsView.setVisibility(View.GONE); 290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 291afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 292afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 293afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void displayErrorDialog(int msgId, final boolean finish, final boolean changed) { 294afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //display confirmation dialog 295afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project new AlertDialog.Builder(this) 296afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .setTitle(getString(R.string.app_not_found_dlg_title)) 297afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .setIcon(android.R.drawable.ic_dialog_alert) 298afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .setMessage(getString(msgId)) 299afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .setNeutralButton(getString(R.string.dlg_ok), 300afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project new DialogInterface.OnClickListener() { 301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onClick(DialogInterface dialog, int which) { 302afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //force to recompute changed value 303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project setIntentAndFinish(finish, changed); 304afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project ) 307afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .show(); 308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 309afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void setIntentAndFinish(boolean finish, boolean appChanged) { 311afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(localLOGV) Log.i(TAG, "appChanged="+appChanged); 312afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Intent intent = new Intent(); 313afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project intent.putExtra(ManageApplications.APP_CHG, appChanged); 314afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project setResult(ManageApplications.RESULT_OK, intent); 315afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButton.setEnabled(false); 316afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(finish) { 317afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project finish(); 318afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 319afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 320afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 321afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 322afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to handle get size info notification from observer when 323afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * the async operation from PackageManager is complete. The current user data 324afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * info has to be refreshed in the manage applications screen as well as the current screen. 325afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 326afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void refreshSizeInfo(Message msg) { 327afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project boolean changed = false; 328afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project PackageStats newPs = msg.getData().getParcelable(ATTR_PACKAGE_STATS); 329afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project long newTot = newPs.cacheSize+newPs.codeSize+newPs.dataSize; 330afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(mSizeInfo == null) { 331afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSizeInfo = newPs; 332afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String str = getSizeStr(newTot); 333afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize.setText(str); 334afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSnippetSize.setText(str); 335afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize.setText(getSizeStr(newPs.codeSize)); 336afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize.setText(getSizeStr(newPs.dataSize)); 337afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(getSizeStr(newPs.cacheSize)); 338afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 339afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project long oldTot = mSizeInfo.cacheSize+mSizeInfo.codeSize+mSizeInfo.dataSize; 340afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newTot != oldTot) { 341afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String str = getSizeStr(newTot); 342afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mTotalSize.setText(str); 343afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSnippetSize.setText(str); 344afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 345afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 346afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newPs.codeSize != mSizeInfo.codeSize) { 347afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppSize.setText(getSizeStr(newPs.codeSize)); 348afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 349afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 350afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newPs.dataSize != mSizeInfo.dataSize) { 351afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mDataSize.setText(getSizeStr(newPs.dataSize)); 352afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 353afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 354afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(newPs.cacheSize != mSizeInfo.cacheSize) { 355afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(getSizeStr(newPs.cacheSize)); 356afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project changed = true; 357afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 358afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(changed) { 359afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mSizeInfo = newPs; 360afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 361afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 362afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 363afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project long data = mSizeInfo.dataSize; 364afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Disable button if data is 0 365afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(mAppButtonState != AppButtonStates.NONE){ 366afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButton.setText(mAppButtonText); 367afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if((mAppButtonState == AppButtonStates.CLEAR_DATA) && (data == 0)) { 368afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButton.setEnabled(false); 369afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 370afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButton.setEnabled(true); 371afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButton.setOnClickListener(this); 372afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 373afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 374afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project refreshCacheInfo(newPs.cacheSize); 375afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 376afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 377afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void refreshCacheInfo(long cacheSize) { 378afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Set cache info 379afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mCacheSize.setText(getSizeStr(cacheSize)); 380afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (cacheSize <= 0) { 381afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheButton.setEnabled(false); 382afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 383afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheButton.setOnClickListener(this); 384afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 385afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 386afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 387afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 388afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to handle clear message notification from observer when 389afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * the async operation from PackageManager is complete 390afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 391afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void processClearMsg(Message msg) { 392afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int result = msg.arg1; 393afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String packageName = mAppInfo.packageName; 394afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(result == OP_SUCCESSFUL) { 395afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Log.i(TAG, "Cleared user data for system package:"+packageName); 396afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.getPackageSizeInfo(packageName, mSizeObserver); 397afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 398afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButton.setText(R.string.clear_user_data_text); 399afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButton.setEnabled(true); 400afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 401afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 402afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 403afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 404afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to initiate clearing user data when the user clicks the clear data 405afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * button for a system package 406afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 407afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void initiateClearUserDataForSysPkg() { 408afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButton.setEnabled(false); 409afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //invoke uninstall or clear user data based on sysPackage 410afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String packageName = mAppInfo.packageName; 411afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Log.i(TAG, "Clearing user data for system package"); 412afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(mClearDataObserver == null) { 413afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearDataObserver = new ClearUserDataObserver(); 414afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 415afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 416afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project boolean res = am.clearApplicationUserData(packageName, mClearDataObserver); 417afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(!res) { 418afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //doesnt initiate clear. some error. should not happen but just log error for now 419afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Log.i(TAG, "Couldnt clear application user data for package:"+packageName); 420afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project displayErrorDialog(R.string.clear_data_failed, false, false); 421afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 422afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mAppButton.setText(R.string.recompute_size); 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 * Method implementing functionality of buttons clicked 428afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * @see android.view.View.OnClickListener#onClick(android.view.View) 429afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 430afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onClick(View v) { 431afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project String packageName = mAppInfo.packageName; 432afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(v == mAppButton) { 433afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(mCanUninstall) { 434afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //display confirmation dialog 435afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project new AlertDialog.Builder(this) 436afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .setTitle(getString(R.string.clear_data_dlg_title)) 437afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .setIcon(android.R.drawable.ic_dialog_alert) 438afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .setMessage(getString(R.string.clear_data_dlg_text)) 439afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .setPositiveButton(R.string.dlg_ok, this) 440afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .setNegativeButton(R.string.dlg_cancel, this) 441afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .show(); 442afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 443afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //create new intent to launch Uninstaller activity 444afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Uri packageURI = Uri.parse("package:"+packageName); 445afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI); 446afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project startActivity(uninstallIntent); 447afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project setIntentAndFinish(true, true); 448afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 449afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if(v == mActivitiesButton) { 450afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.clearPackagePreferredActivities(packageName); 451afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mActivitiesButton.setEnabled(false); 452afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if(v == mManageSpaceButton) { 453afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Intent intent = new Intent(Intent.ACTION_DEFAULT); 454afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project intent.setClassName(mAppInfo.packageName, mAppInfo.manageSpaceActivityName); 455afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project startActivityForResult(intent, -1); 456afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mClearCacheButton) { 457afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Lazy initialization of observer 458afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mClearCacheObserver == null) { 459afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheObserver = new ClearCacheObserver(); 460afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 461afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver); 462afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mForceStopButton) { 463afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project ActivityManager am = (ActivityManager)getSystemService( 464afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Context.ACTIVITY_SERVICE); 465afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project am.restartPackage(packageName); 466afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 467afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 468afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 469afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onClick(DialogInterface dialog, int which) { 470afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(which == AlertDialog.BUTTON_POSITIVE) { 471afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //invoke uninstall or clear user data based on sysPackage 472afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project initiateClearUserDataForSysPkg(); 473afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 474afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //cancel do nothing just retain existing screen 475afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 476afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 477afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 478afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 479