InstalledAppDetails.java revision 97d07fa3aedde44368818551dc789eaff7bfb047
1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * use this file except in compliance with the License. You may obtain a copy 6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * of the License at 7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * 10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * License for the specific language governing permissions and limitations 14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * under the License. 15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 17728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornpackage com.android.settings.applications; 18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 193465b67740e17711af2b36b09e2250a02275d860Jake Hambyimport com.android.internal.telephony.ISms; 203465b67740e17711af2b36b09e2250a02275d860Jake Hambyimport com.android.internal.telephony.SmsUsageMonitor; 21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.settings.R; 223fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasaniimport com.android.settings.Utils; 2319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackbornimport com.android.settings.applications.ApplicationsState.AppEntry; 24728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Activity; 26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.ActivityManager; 27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.AlertDialog; 2850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.app.Dialog; 29f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.app.DialogFragment; 30f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.app.Fragment; 314a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandlerimport android.app.INotificationManager; 325c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackbornimport android.app.admin.DevicePolicyManager; 33c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurkaimport android.appwidget.AppWidgetManager; 34cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackbornimport android.content.BroadcastReceiver; 35c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurkaimport android.content.ComponentName; 36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.DialogInterface; 38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.IntentFilter; 40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.ApplicationInfo; 41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageDataObserver; 42ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapuimport android.content.pm.IPackageMoveObserver; 4350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.content.pm.PackageInfo; 44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager; 459db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackbornimport android.content.pm.ResolveInfo; 46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException; 47e458832c765ed5c3de836384338c7626c80b5686Dianne Hackbornimport android.content.res.Resources; 489d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwoodimport android.hardware.usb.IUsbManager; 49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.Uri; 509db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackbornimport android.os.AsyncTask; 51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 52ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornimport android.os.Environment; 53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Handler; 549d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwoodimport android.os.IBinder; 55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Message; 5650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.os.RemoteException; 579d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwoodimport android.os.ServiceManager; 583db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.os.UserHandle; 593db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.os.UserManager; 60ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornimport android.preference.PreferenceActivity; 61c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurkaimport android.text.SpannableString; 62c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurkaimport android.text.TextUtils; 63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.format.Formatter; 64c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurkaimport android.text.style.BulletSpan; 65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log; 669db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn 679db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackbornimport java.lang.ref.WeakReference; 68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList; 69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List; 70f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.LayoutInflater; 713db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.view.Menu; 723db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.view.MenuInflater; 733db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.view.MenuItem; 74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 75f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornimport android.view.ViewGroup; 763465b67740e17711af2b36b09e2250a02275d860Jake Hambyimport android.widget.AdapterView; 77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AppSecurityPermissions; 783465b67740e17711af2b36b09e2250a02275d860Jake Hambyimport android.widget.ArrayAdapter; 79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button; 80aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackbornimport android.widget.CheckBox; 81aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackbornimport android.widget.CompoundButton; 82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView; 83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.LinearLayout; 843465b67740e17711af2b36b09e2250a02275d860Jake Hambyimport android.widget.Spinner; 85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView; 86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display application information from Settings. This activity presents 89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * extended information associated with a package like code, data, total size, permissions 90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * used by the application and also the set of default launchable activities. 91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For system applications, an option to clear user data is displayed only if data size is > 0. 92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * System applications that do not want clear user data do not have this option. 93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For non-system applications, there is no option to clear data. Instead there is an option to 94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * uninstall the application. 95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 96f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackbornpublic class InstalledAppDetails extends Fragment 97aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn implements View.OnClickListener, CompoundButton.OnCheckedChangeListener, 98aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn ApplicationsState.Callbacks { 99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String TAG="InstalledAppDetails"; 1002f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn private static final boolean localLOGV = false; 1010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 102f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public static final String ARG_PACKAGE_NAME = "package"; 103f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 1040f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn private PackageManager mPm; 1053db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn private UserManager mUserManager; 1069d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood private IUsbManager mUsbManager; 107c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka private AppWidgetManager mAppWidgetManager; 1085c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn private DevicePolicyManager mDpm; 1093465b67740e17711af2b36b09e2250a02275d860Jake Hamby private ISms mSmsManager; 1100f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn private ApplicationsState mState; 111309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn private ApplicationsState.Session mSession; 1120f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn private ApplicationsState.AppEntry mAppEntry; 113ab616d477be693fc455329953711264af0ed7814Dianne Hackborn private boolean mInitialized; 114ab616d477be693fc455329953711264af0ed7814Dianne Hackborn private boolean mShowUninstalled; 1150f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn private PackageInfo mPackageInfo; 1166dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn private CanBeOnSdCardChecker mCanBeOnSdCardChecker; 117f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn private View mRootView; 11842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private Button mUninstallButton; 1199072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn private View mMoreControlButtons; 1209072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn private Button mSpecialDisableButton; 121de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu private boolean mMoveInProgress = false; 12242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private boolean mUpdatedSysApp = false; 123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mActivitiesButton; 124aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn private View mScreenCompatSection; 125aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn private CheckBox mAskCompatibilityCB; 126aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn private CheckBox mEnableCompatibilityCB; 1272f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn private boolean mCanClearData = true; 12850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private TextView mAppVersion; 129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mTotalSize; 130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mAppSize; 131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mDataSize; 132bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn private TextView mExternalCodeSize; 133bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn private TextView mExternalDataSize; 134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private ClearUserDataObserver mClearDataObserver; 135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Views related to cache info 136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mCacheSize; 137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mClearCacheButton; 138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private ClearCacheObserver mClearCacheObserver; 139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mForceStopButton; 14042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private Button mClearDataButton; 14142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private Button mMoveAppButton; 14270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler private CompoundButton mNotificationSwitch; 1434a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler 144ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private PackageMoveObserver mPackageMoveObserver; 1459072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn 1469072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn private boolean mDisableAfterUninstall; 1479072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn 1480f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn private boolean mHaveSizes = false; 1490f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn private long mLastCodeSize = -1; 1500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn private long mLastDataSize = -1; 151bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn private long mLastExternalCodeSize = -1; 152bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn private long mLastExternalDataSize = -1; 1530f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn private long mLastCacheSize = -1; 1540f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn private long mLastTotalSize = -1; 1550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //internal constants used in Handler 157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int OP_SUCCESSFUL = 1; 158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int OP_FAILED = 2; 159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int CLEAR_USER_DATA = 1; 160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int CLEAR_CACHE = 3; 161ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private static final int PACKAGE_MOVE = 4; 162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // invalid size value used initially and also when size retrieval through PackageManager 164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // fails for whatever reason 165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int SIZE_INVALID = -1; 166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Resource strings 168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mInvalidSizeStr; 169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mComputingStr; 170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 17150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Dialog identifiers used in showDialog 17250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_BASE = 0; 17350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_CLEAR_DATA = DLG_BASE + 1; 17450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_FACTORY_RESET = DLG_BASE + 2; 17550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_APP_NOT_FOUND = DLG_BASE + 3; 17650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_CANNOT_CLEAR_DATA = DLG_BASE + 4; 17742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private static final int DLG_FORCE_STOP = DLG_BASE + 5; 1785cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu private static final int DLG_MOVE_FAILED = DLG_BASE + 6; 179f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn private static final int DLG_DISABLE = DLG_BASE + 7; 18070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler private static final int DLG_DISABLE_NOTIFICATIONS = DLG_BASE + 8; 1819072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn private static final int DLG_SPECIAL_DISABLE = DLG_BASE + 9; 1823db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 1833db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn // Menu identifiers 1843db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public static final int UNINSTALL_ALL_USERS_MENU = 1; 1853db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 1863db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn // Result code identifiers 1873db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public static final int REQUEST_UNINSTALL = 1; 1883db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public static final int REQUEST_MANAGE_SPACE = 2; 1893db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Handler mHandler = new Handler() { 191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void handleMessage(Message msg) { 192f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn // If the fragment is gone, don't process any more messages. 193f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn if (getView() == null) { 19407f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn return; 19507f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn } 196afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project switch (msg.what) { 197afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case CLEAR_USER_DATA: 198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project processClearMsg(msg); 199afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case CLEAR_CACHE: 201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Refresh size info 2020f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mState.requestSize(mAppEntry.info.packageName); 203afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 204ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu case PACKAGE_MOVE: 205ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu processMoveMsg(msg); 206ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu break; 207afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project default: 208afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 210afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }; 212afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project class ClearUserDataObserver extends IPackageDataObserver.Stub { 214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onRemoveCompleted(final String packageName, final boolean succeeded) { 215afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA); 216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED; 217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mHandler.sendMessage(msg); 218afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 220afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 221afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project class ClearCacheObserver extends IPackageDataObserver.Stub { 222afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onRemoveCompleted(final String packageName, final boolean succeeded) { 223afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final Message msg = mHandler.obtainMessage(CLEAR_CACHE); 224ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu msg.arg1 = succeeded ? OP_SUCCESSFUL:OP_FAILED; 225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mHandler.sendMessage(msg); 226afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 227afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 228ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu 229ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu class PackageMoveObserver extends IPackageMoveObserver.Stub { 230ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu public void packageMoved(String packageName, int returnCode) throws RemoteException { 231ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu final Message msg = mHandler.obtainMessage(PACKAGE_MOVE); 232ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu msg.arg1 = returnCode; 233ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mHandler.sendMessage(msg); 234ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 235ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String getSizeStr(long size) { 238afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (size == SIZE_INVALID) { 239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return mInvalidSizeStr.toString(); 240afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 241f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return Formatter.formatFileSize(getActivity(), size); 242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 24442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void initDataButtons() { 2452f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn if ((mAppEntry.info.flags&(ApplicationInfo.FLAG_SYSTEM 2462f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn | ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA)) 2475c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn == ApplicationInfo.FLAG_SYSTEM 2485c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn || mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 24942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.clear_user_data_text); 2502f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn mClearDataButton.setEnabled(false); 2512f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn mCanClearData = false; 2522f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn } else { 2532f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn if (mAppEntry.info.manageSpaceActivityName != null) { 2542f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn mClearDataButton.setText(R.string.manage_space_text); 2552f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn } else { 2562f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn mClearDataButton.setText(R.string.clear_user_data_text); 2572f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn } 2582f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn mClearDataButton.setOnClickListener(this); 25942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 260ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 261ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu 2625cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu private CharSequence getMoveErrMsg(int errCode) { 2635cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu switch (errCode) { 2645cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu case PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE: 265f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return getActivity().getString(R.string.insufficient_storage); 2665cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu case PackageManager.MOVE_FAILED_DOESNT_EXIST: 267f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return getActivity().getString(R.string.does_not_exist); 2685cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu case PackageManager.MOVE_FAILED_FORWARD_LOCKED: 269f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return getActivity().getString(R.string.app_forward_locked); 2705cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu case PackageManager.MOVE_FAILED_INVALID_LOCATION: 271f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return getActivity().getString(R.string.invalid_location); 2725cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu case PackageManager.MOVE_FAILED_SYSTEM_PACKAGE: 273f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return getActivity().getString(R.string.system_package); 2749a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu case PackageManager.MOVE_FAILED_INTERNAL_ERROR: 2759a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu return ""; 2765cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu } 2779a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu return ""; 2785cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu } 2795cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu 280ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private void initMoveButton() { 281ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn if (Environment.isExternalStorageEmulated()) { 282ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mMoveAppButton.setVisibility(View.INVISIBLE); 283ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn return; 284ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 28542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu boolean dataOnly = false; 2860f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn dataOnly = (mPackageInfo == null) && (mAppEntry != null); 287ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu boolean moveDisable = true; 28842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (dataOnly) { 28942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mMoveAppButton.setText(R.string.move_app); 2900f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) { 29142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mMoveAppButton.setText(R.string.move_app_to_internal); 2924056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu // Always let apps move to internal storage from sdcard. 293ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu moveDisable = false; 29442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 29542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mMoveAppButton.setText(R.string.move_app_to_sdcard); 2966dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn mCanBeOnSdCardChecker.init(); 2976dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn moveDisable = !mCanBeOnSdCardChecker.check(mAppEntry.info); 298730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu } 299ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu if (moveDisable) { 300ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mMoveAppButton.setEnabled(false); 301ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } else { 302ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mMoveAppButton.setOnClickListener(this); 303ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mMoveAppButton.setEnabled(true); 304ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 30542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 30642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 30770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler private boolean isThisASystemPackage() { 30870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler try { 30970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler PackageInfo sys = mPm.getPackageInfo("android", PackageManager.GET_SIGNATURES); 31070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler return (mPackageInfo != null && mPackageInfo.signatures != null && 31170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler sys.signatures[0].equals(mPackageInfo.signatures[0])); 31270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } catch (PackageManager.NameNotFoundException e) { 31370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler return false; 31470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } 31570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } 31670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler 3179072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn private boolean handleDisableable(Button button) { 3189072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn boolean disableable = false; 3199072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn try { 3209072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn // Try to prevent the user from bricking their phone 3219072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn // by not allowing disabling of apps signed with the 3229072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn // system cert and any launcher app in the system. 3239072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn PackageInfo sys = mPm.getPackageInfo("android", 3249072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn PackageManager.GET_SIGNATURES); 3259072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn Intent intent = new Intent(Intent.ACTION_MAIN); 3269072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn intent.addCategory(Intent.CATEGORY_HOME); 3279072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn intent.setPackage(mAppEntry.info.packageName); 3289072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn List<ResolveInfo> homes = mPm.queryIntentActivities(intent, 0); 3299072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn if ((homes != null && homes.size() > 0) || isThisASystemPackage()) { 3309072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn // Disable button for core system applications. 3319072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn button.setText(R.string.disable_text); 3329072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } else if (mAppEntry.info.enabled) { 3339072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn button.setText(R.string.disable_text); 3349072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn disableable = true; 3359072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } else { 3369072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn button.setText(R.string.enable_text); 3379072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn disableable = true; 3389072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 3399072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } catch (PackageManager.NameNotFoundException e) { 3409072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn Log.w(TAG, "Unable to get package info", e); 3419072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 3429072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn return disableable; 3439072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 3449072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn 345de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu private void initUninstallButtons() { 3460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mUpdatedSysApp = (mAppEntry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0; 34742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu boolean enabled = true; 34842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (mUpdatedSysApp) { 34942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setText(R.string.app_factory_reset); 3509072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn boolean specialDisable = false; 3519072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 3529072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn specialDisable = handleDisableable(mSpecialDisableButton); 3539072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mSpecialDisableButton.setOnClickListener(this); 3549072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 3559072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mMoreControlButtons.setVisibility(specialDisable ? View.VISIBLE : View.GONE); 35642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 3579072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mMoreControlButtons.setVisibility(View.GONE); 3580f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 3599072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn enabled = handleDisableable(mUninstallButton); 3602e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn } else if ((mPackageInfo.applicationInfo.flags 3614de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn & ApplicationInfo.FLAG_INSTALLED) == 0 3624de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn && mUserManager.getUsers().size() >= 2) { 3634de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // When we have multiple users, there is a separate menu 3644de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // to uninstall for all users. 365c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn mUninstallButton.setText(R.string.uninstall_text); 366c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn enabled = false; 3679db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } else { 3689db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn mUninstallButton.setText(R.string.uninstall_text); 369b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu } 37042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 3715c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn // If this is a device admin, it can't be uninstall or disabled. 3725c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn // We do this here so the text of the button is still set correctly. 3735c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 3745c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn enabled = false; 3755c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn } 37642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setEnabled(enabled); 37742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (enabled) { 37842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Register listener 37942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setOnClickListener(this); 38042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 38142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 38242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 3834a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler private void initNotificationButton() { 3844a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler INotificationManager nm = INotificationManager.Stub.asInterface( 3854a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 3864a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler boolean enabled = true; // default on 3874a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler try { 3884a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler enabled = nm.areNotificationsEnabledForPackage(mAppEntry.info.packageName); 3894a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler } catch (android.os.RemoteException ex) { 3904a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler // this does not bode well 3914a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler } 3924a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler mNotificationSwitch.setChecked(enabled); 39370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler if (isThisASystemPackage()) { 39470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler mNotificationSwitch.setEnabled(false); 39570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } else { 39670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler mNotificationSwitch.setEnabled(true); 39770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler mNotificationSwitch.setOnCheckedChangeListener(this); 39870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } 3994a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler } 4004a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler 401afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** Called when the activity is first created. */ 402afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 403f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onCreate(Bundle icicle) { 404afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(icicle); 4053db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 406f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mState = ApplicationsState.getInstance(getActivity().getApplication()); 407309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSession = mState.newSession(this); 408f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mPm = getActivity().getPackageManager(); 4093db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn mUserManager = (UserManager)getActivity().getSystemService(Context.USER_SERVICE); 4109d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood IBinder b = ServiceManager.getService(Context.USB_SERVICE); 4119d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood mUsbManager = IUsbManager.Stub.asInterface(b); 412c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka mAppWidgetManager = AppWidgetManager.getInstance(getActivity()); 4135c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn mDpm = (DevicePolicyManager)getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE); 4143465b67740e17711af2b36b09e2250a02275d860Jake Hamby mSmsManager = ISms.Stub.asInterface(ServiceManager.getService("isms")); 4159d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood 4166dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn mCanBeOnSdCardChecker = new CanBeOnSdCardChecker(); 4170fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn 418c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn // Need to make sure we have loaded applications at this point. 419c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn mSession.resume(); 420c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn 4210fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn retrieveAppEntry(); 4220fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn 4230fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn setHasOptionsMenu(true); 424f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 425f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 426f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn @Override 42797d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey public View onCreateView( 42897d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 42997d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey final View view = inflater.inflate(R.layout.installed_app_details, container, false); 43097d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey Utils.prepareCustomPreferencesList(container, view, view, false); 43197d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey 43297d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey mRootView = view; 433f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mComputingStr = getActivity().getText(R.string.computing_size); 434b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 43550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Set default values on sizes 436f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mTotalSize = (TextView)view.findViewById(R.id.total_size_text); 437f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mAppSize = (TextView)view.findViewById(R.id.application_size_text); 438f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mDataSize = (TextView)view.findViewById(R.id.data_size_text); 439bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn mExternalCodeSize = (TextView)view.findViewById(R.id.external_code_size_text); 440bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn mExternalDataSize = (TextView)view.findViewById(R.id.external_data_size_text); 4411f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn 4421f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if (Environment.isExternalStorageEmulated()) { 4431f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn ((View)mExternalCodeSize.getParent()).setVisibility(View.GONE); 4441f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn ((View)mExternalDataSize.getParent()).setVisibility(View.GONE); 4451f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn } 4461f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn 44742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Get Control button panel 448f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn View btnPanel = view.findViewById(R.id.control_buttons_panel); 44942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mForceStopButton = (Button) btnPanel.findViewById(R.id.left_button); 45042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mForceStopButton.setText(R.string.force_stop); 45142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton = (Button)btnPanel.findViewById(R.id.right_button); 452cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn mForceStopButton.setEnabled(false); 453b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 4549072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn // Get More Control button panel 4559072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mMoreControlButtons = view.findViewById(R.id.more_control_buttons_panel); 4569072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mMoreControlButtons.findViewById(R.id.left_button).setVisibility(View.INVISIBLE); 4579072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mSpecialDisableButton = (Button)mMoreControlButtons.findViewById(R.id.right_button); 4589072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mMoreControlButtons.setVisibility(View.GONE); 4599072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn 46042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Initialize clear data and move install location buttons 461f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn View data_buttons_panel = view.findViewById(R.id.data_buttons_panel); 462313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn mClearDataButton = (Button) data_buttons_panel.findViewById(R.id.right_button); 463313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn mMoveAppButton = (Button) data_buttons_panel.findViewById(R.id.left_button); 464b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 4650f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn // Cache section 466f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mCacheSize = (TextView) view.findViewById(R.id.cache_size_text); 467f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mClearCacheButton = (Button) view.findViewById(R.id.clear_cache_button); 468f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 469f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mActivitiesButton = (Button)view.findViewById(R.id.clear_activities_button); 4700f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 471aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn // Screen compatibility control 472aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mScreenCompatSection = view.findViewById(R.id.screen_compatibility_section); 473aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mAskCompatibilityCB = (CheckBox)view.findViewById(R.id.ask_compatibility_cb); 474aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mEnableCompatibilityCB = (CheckBox)view.findViewById(R.id.enable_compatibility_cb); 4754a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler 47670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler mNotificationSwitch = (CompoundButton) view.findViewById(R.id.notification_switch); 477aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn 478f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return view; 479afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 480f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu 4813db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 4823db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 4833db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn menu.add(0, UNINSTALL_ALL_USERS_MENU, 1, R.string.uninstall_all_users_text) 4843db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 4853db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4863db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 4873db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 4883db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public void onPrepareOptionsMenu(Menu menu) { 4893db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn boolean showIt = true; 4903db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (mUpdatedSysApp) { 4913db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 4920fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn } else if (mAppEntry == null) { 4930fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn showIt = false; 4943db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 4953db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 49654b3f501ca4a7ff88ead39247d2277d2efc82bb6Jeff Sharkey } else if (mPackageInfo == null || mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 4973db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 4983db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if (UserHandle.myUserId() != 0) { 4993db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 5007a1c4cdfae66e8b110de3988e65586871a969c04Amith Yamasani } else if (mUserManager.getUsers().size() < 2) { 5013db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 5023db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 5033db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn menu.findItem(UNINSTALL_ALL_USERS_MENU).setVisible(showIt); 5043db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 5053db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 5063db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 5073db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public boolean onOptionsItemSelected(MenuItem item) { 5083db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn int menuId = item.getItemId(); 5093db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (menuId == UNINSTALL_ALL_USERS_MENU) { 5109072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn uninstallPkg(mAppEntry.info.packageName, true, false); 5113db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn return true; 5123db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 5133db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn return false; 5143db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 5153db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 5163db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 5173db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public void onActivityResult(int requestCode, int resultCode, Intent data) { 5183db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn super.onActivityResult(requestCode, resultCode, data); 5193db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (requestCode == REQUEST_UNINSTALL) { 5209072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn if (mDisableAfterUninstall) { 5219072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mDisableAfterUninstall = false; 5229072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn try { 5239072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn ApplicationInfo ainfo = getActivity().getPackageManager().getApplicationInfo( 5249072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mAppEntry.info.packageName, PackageManager.GET_UNINSTALLED_PACKAGES 5259072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn | PackageManager.GET_DISABLED_COMPONENTS); 5269072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn if ((ainfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0) { 5279072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn new DisableChanger(this, mAppEntry.info, 5289072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) 5299072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn .execute((Object)null); 5309072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 5319072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } catch (NameNotFoundException e) { 5329072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 5339072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 5343db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (!refreshUi()) { 5353db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn setIntentAndFinish(true, true); 5363db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 5373db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 5383db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 5393db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 54050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Utility method to set applicaiton label and icon. 541f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu private void setAppLabelAndIcon(PackageInfo pkgInfo) { 54297d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey final View appSnippet = mRootView.findViewById(R.id.app_snippet); 54397d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey appSnippet.setPadding(0, appSnippet.getPaddingTop(), 0, appSnippet.getPaddingBottom()); 54497d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey 545f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon); 5460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mState.ensureIcon(mAppEntry); 5470f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn icon.setImageDrawable(mAppEntry.icon); 548f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu // Set application name. 549f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu TextView label = (TextView) appSnippet.findViewById(R.id.app_name); 5500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn label.setText(mAppEntry.label); 55150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Version number of application 552f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu mAppVersion = (TextView) appSnippet.findViewById(R.id.app_size); 553f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu 554f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu if (pkgInfo != null && pkgInfo.versionName != null) { 55550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppVersion.setVisibility(View.VISIBLE); 556f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mAppVersion.setText(getActivity().getString(R.string.version_text, 5578e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes String.valueOf(pkgInfo.versionName))); 55850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } else { 559f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu mAppVersion.setVisibility(View.INVISIBLE); 56050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 56150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 56250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 56350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu @Override 56442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public void onResume() { 56542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu super.onResume(); 566b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 567309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSession.resume(); 5680f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (!refreshUi()) { 569b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown setIntentAndFinish(true, true); 570b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown } 5710f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5720f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5730f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn @Override 5740f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn public void onPause() { 5750f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn super.onPause(); 576309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSession.pause(); 5770f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5780f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5790f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn @Override 5800f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn public void onAllSizesComputed() { 5810f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5820f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5830f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn @Override 5840f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn public void onPackageIconChanged() { 5850f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5860f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5870f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn @Override 5880f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn public void onPackageListChanged() { 5890f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn refreshUi(); 5900f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5910f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5920f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn @Override 59319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn public void onRebuildComplete(ArrayList<AppEntry> apps) { 59419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } 59519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn 59619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn @Override 5970f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn public void onPackageSizeChanged(String packageName) { 5980f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (packageName.equals(mAppEntry.info.packageName)) { 5990f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn refreshSizeInfo(); 6000f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 6010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 6020f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 6030f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn @Override 6040f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn public void onRunningStateChanged(boolean running) { 6050f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 6060f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 6070fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn private String retrieveAppEntry() { 6080c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy final Bundle args = getArguments(); 6090c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy String packageName = (args != null) ? args.getString(ARG_PACKAGE_NAME) : null; 610f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn if (packageName == null) { 6110c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy Intent intent = (args == null) ? 6120c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy getActivity().getIntent() : (Intent) args.getParcelable("intent"); 613f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn if (intent != null) { 614f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn packageName = intent.getData().getSchemeSpecificPart(); 615f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 616f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 6170f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mAppEntry = mState.getEntry(packageName); 618347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey if (mAppEntry != null) { 619347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey // Get application info again to refresh changed properties of application 620347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey try { 621347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey mPackageInfo = mPm.getPackageInfo(mAppEntry.info.packageName, 622347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey PackageManager.GET_DISABLED_COMPONENTS | 623347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey PackageManager.GET_UNINSTALLED_PACKAGES | 624347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey PackageManager.GET_SIGNATURES); 625347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey } catch (NameNotFoundException e) { 626347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey Log.e(TAG, "Exception when retrieving package:" + mAppEntry.info.packageName, e); 627347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey } 628347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey } else { 629347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey Log.w(TAG, "Missing AppEntry; maybe reinstalling?"); 630347188667b984fb43e8f973b105ddbde4a8fdb8bJeff Sharkey mPackageInfo = null; 631b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani } 632b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani 6330fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn return packageName; 6340fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn } 6350fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn 6360fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn private boolean refreshUi() { 6370fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn if (mMoveInProgress) { 6380fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn return true; 6390fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn } 6400fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn final String packageName = retrieveAppEntry(); 6410fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn 6420f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (mAppEntry == null) { 6430f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return false; // onCreate must have failed, make sure to exit 644b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown } 645b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani 646b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani if (mPackageInfo == null) { 6470f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return false; // onCreate must have failed, make sure to exit 64850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 649b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani 6500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn // Get list of preferred activities 6510f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn List<ComponentName> prefActList = new ArrayList<ComponentName>(); 652b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 6530f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn // Intent list cannot be null. so pass empty list 6540f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn List<IntentFilter> intentList = new ArrayList<IntentFilter>(); 6550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mPm.getPreferredActivities(intentList, prefActList, packageName); 656c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (localLOGV) 657c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka Log.i(TAG, "Have " + prefActList.size() + " number of activities in preferred list"); 6589d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood boolean hasUsbDefaults = false; 6599d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood try { 660be32d4b408a2fd0ec25bdd4f0e67cba2f23a4edbJeff Sharkey hasUsbDefaults = mUsbManager.hasDefaults(packageName, UserHandle.myUserId()); 6619d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood } catch (RemoteException e) { 6629d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood Log.e(TAG, "mUsbManager.hasDefaults", e); 6639d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood } 664c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka boolean hasBindAppWidgetPermission = 665c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka mAppWidgetManager.hasBindAppWidgetPermission(mAppEntry.info.packageName); 666c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka 667c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka TextView autoLaunchTitleView = (TextView) mRootView.findViewById(R.id.auto_launch_title); 668c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka TextView autoLaunchView = (TextView) mRootView.findViewById(R.id.auto_launch); 669c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka boolean autoLaunchEnabled = prefActList.size() > 0 || hasUsbDefaults; 670c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (!autoLaunchEnabled && !hasBindAppWidgetPermission) { 671c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka resetLaunchDefaultsUi(autoLaunchTitleView, autoLaunchView); 6720f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } else { 673c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka boolean useBullets = hasBindAppWidgetPermission && autoLaunchEnabled; 674c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka 675c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (hasBindAppWidgetPermission) { 676c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka autoLaunchTitleView.setText(R.string.auto_launch_label_generic); 677c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } else { 678c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka autoLaunchTitleView.setText(R.string.auto_launch_label); 679c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } 680c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka 681c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka CharSequence text = null; 682c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka int bulletIndent = getResources() 683c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka .getDimensionPixelSize(R.dimen.installed_app_details_bullet_offset); 684c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (autoLaunchEnabled) { 685c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka CharSequence autoLaunchEnableText = getText(R.string.auto_launch_enable_text); 686c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka SpannableString s = new SpannableString(autoLaunchEnableText); 687c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (useBullets) { 688c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka s.setSpan(new BulletSpan(bulletIndent), 0, autoLaunchEnableText.length(), 0); 689c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } 690c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka text = (text == null) ? 691c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka TextUtils.concat(s, "\n") : TextUtils.concat(text, "\n", s, "\n"); 692c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } 693c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (hasBindAppWidgetPermission) { 694c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka CharSequence alwaysAllowBindAppWidgetsText = 695c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka getText(R.string.always_allow_bind_appwidgets_text); 696c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka SpannableString s = new SpannableString(alwaysAllowBindAppWidgetsText); 697c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (useBullets) { 698c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka s.setSpan(new BulletSpan(bulletIndent), 699c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka 0, alwaysAllowBindAppWidgetsText.length(), 0); 700c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } 701c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka text = (text == null) ? 702c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka TextUtils.concat(s, "\n") : TextUtils.concat(text, "\n", s, "\n"); 703c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } 704c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka autoLaunchView.setText(text); 7050f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mActivitiesButton.setEnabled(true); 7060f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mActivitiesButton.setOnClickListener(this); 7070f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 708aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn 709aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn // Screen compatibility section. 710aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn ActivityManager am = (ActivityManager) 711aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn getActivity().getSystemService(Context.ACTIVITY_SERVICE); 712aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn int compatMode = am.getPackageScreenCompatMode(packageName); 71313bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn // For now these are always off; this is the old UI model which we 71413bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn // are no longer using. 71513bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn if (false && (compatMode == ActivityManager.COMPAT_MODE_DISABLED 71613bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn || compatMode == ActivityManager.COMPAT_MODE_ENABLED)) { 717aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mScreenCompatSection.setVisibility(View.VISIBLE); 718aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mAskCompatibilityCB.setChecked(am.getPackageAskScreenCompat(packageName)); 719aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mAskCompatibilityCB.setOnCheckedChangeListener(this); 720aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mEnableCompatibilityCB.setChecked(compatMode == ActivityManager.COMPAT_MODE_ENABLED); 721aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mEnableCompatibilityCB.setOnCheckedChangeListener(this); 722aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } else { 723aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mScreenCompatSection.setVisibility(View.GONE); 724aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } 725aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn 7260f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn // Security permissions section 727f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn LinearLayout permsView = (LinearLayout) mRootView.findViewById(R.id.permissions_section); 728f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn AppSecurityPermissions asp = new AppSecurityPermissions(getActivity(), packageName); 7293465b67740e17711af2b36b09e2250a02275d860Jake Hamby int premiumSmsPermission = getPremiumSmsPermission(packageName); 7303465b67740e17711af2b36b09e2250a02275d860Jake Hamby // Premium SMS permission implies the app also has SEND_SMS permission, so the original 7313465b67740e17711af2b36b09e2250a02275d860Jake Hamby // application permissions list doesn't have to be shown/hidden separately. The premium 7323465b67740e17711af2b36b09e2250a02275d860Jake Hamby // SMS subsection should only be visible if the app has tried to send to a premium SMS. 7333465b67740e17711af2b36b09e2250a02275d860Jake Hamby if (asp.getPermissionCount() > 0 7343465b67740e17711af2b36b09e2250a02275d860Jake Hamby || premiumSmsPermission != SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN) { 7350f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn permsView.setVisibility(View.VISIBLE); 7363465b67740e17711af2b36b09e2250a02275d860Jake Hamby } else { 7373465b67740e17711af2b36b09e2250a02275d860Jake Hamby permsView.setVisibility(View.GONE); 7383465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 7393465b67740e17711af2b36b09e2250a02275d860Jake Hamby // Premium SMS permission subsection 7403465b67740e17711af2b36b09e2250a02275d860Jake Hamby TextView securityBillingDesc = (TextView) permsView.findViewById( 7413465b67740e17711af2b36b09e2250a02275d860Jake Hamby R.id.security_settings_billing_desc); 7423465b67740e17711af2b36b09e2250a02275d860Jake Hamby LinearLayout securityBillingList = (LinearLayout) permsView.findViewById( 7433465b67740e17711af2b36b09e2250a02275d860Jake Hamby R.id.security_settings_billing_list); 7443465b67740e17711af2b36b09e2250a02275d860Jake Hamby if (premiumSmsPermission != SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN) { 7453465b67740e17711af2b36b09e2250a02275d860Jake Hamby // Show the premium SMS permission selector 7463465b67740e17711af2b36b09e2250a02275d860Jake Hamby securityBillingDesc.setVisibility(View.VISIBLE); 7473465b67740e17711af2b36b09e2250a02275d860Jake Hamby securityBillingList.setVisibility(View.VISIBLE); 7483465b67740e17711af2b36b09e2250a02275d860Jake Hamby Spinner spinner = (Spinner) permsView.findViewById( 7493465b67740e17711af2b36b09e2250a02275d860Jake Hamby R.id.security_settings_premium_sms_list); 7503465b67740e17711af2b36b09e2250a02275d860Jake Hamby ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), 7513465b67740e17711af2b36b09e2250a02275d860Jake Hamby R.array.security_settings_premium_sms_values, 7523465b67740e17711af2b36b09e2250a02275d860Jake Hamby android.R.layout.simple_spinner_item); 7533465b67740e17711af2b36b09e2250a02275d860Jake Hamby adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 7543465b67740e17711af2b36b09e2250a02275d860Jake Hamby spinner.setAdapter(adapter); 7553465b67740e17711af2b36b09e2250a02275d860Jake Hamby // List items are in the same order as SmsUsageMonitor constants, offset by 1. 7563465b67740e17711af2b36b09e2250a02275d860Jake Hamby spinner.setSelection(premiumSmsPermission - 1); 7573465b67740e17711af2b36b09e2250a02275d860Jake Hamby spinner.setOnItemSelectedListener(new PremiumSmsSelectionListener( 7583465b67740e17711af2b36b09e2250a02275d860Jake Hamby packageName, mSmsManager)); 7593465b67740e17711af2b36b09e2250a02275d860Jake Hamby } else { 7603465b67740e17711af2b36b09e2250a02275d860Jake Hamby // Hide the premium SMS permission selector 7613465b67740e17711af2b36b09e2250a02275d860Jake Hamby securityBillingDesc.setVisibility(View.GONE); 7623465b67740e17711af2b36b09e2250a02275d860Jake Hamby securityBillingList.setVisibility(View.GONE); 7633465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 7643465b67740e17711af2b36b09e2250a02275d860Jake Hamby // App permissions subsection 7653465b67740e17711af2b36b09e2250a02275d860Jake Hamby if (asp.getPermissionCount() > 0) { 7660f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn // Make the security sections header visible 7670f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn LinearLayout securityList = (LinearLayout) permsView.findViewById( 7680f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn R.id.security_settings_list); 7690f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn securityList.removeAllViews(); 7700f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn securityList.addView(asp.getPermissionsView()); 771e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn // If this app is running under a shared user ID with other apps, 772e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn // update the description to explain this. 773e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn String[] packages = mPm.getPackagesForUid(mPackageInfo.applicationInfo.uid); 774e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn if (packages != null && packages.length > 1) { 775e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn ArrayList<CharSequence> pnames = new ArrayList<CharSequence>(); 776e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn for (int i=0; i<packages.length; i++) { 777e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn String pkg = packages[i]; 778e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn if (mPackageInfo.packageName.equals(pkg)) { 779e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn continue; 780e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 781e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn try { 782e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn ApplicationInfo ainfo = mPm.getApplicationInfo(pkg, 0); 783e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn pnames.add(ainfo.loadLabel(mPm)); 784e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } catch (PackageManager.NameNotFoundException e) { 785e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 786e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 787e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn final int N = pnames.size(); 788e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn if (N > 0) { 789e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn final Resources res = getActivity().getResources(); 790e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn String appListStr; 791e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn if (N == 1) { 792e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn appListStr = pnames.get(0).toString(); 793e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } else if (N == 2) { 794e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn appListStr = res.getString(R.string.join_two_items, pnames.get(0), 795e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn pnames.get(1)); 796e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } else { 797e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn appListStr = pnames.get(N-2).toString(); 798e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn for (int i=N-3; i>=0; i--) { 799e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn appListStr = res.getString(i == 0 ? R.string.join_many_items_first 800e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn : R.string.join_many_items_middle, pnames.get(i), appListStr); 801e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 802e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn appListStr = res.getString(R.string.join_many_items_last, 803e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn appListStr, pnames.get(N-1)); 804e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 805e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn TextView descr = (TextView) mRootView.findViewById( 806e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn R.id.security_settings_desc); 807e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn descr.setText(res.getString(R.string.security_settings_desc_multi, 808e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn mPackageInfo.applicationInfo.loadLabel(mPm), appListStr)); 809e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 810e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 811de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } 8120f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 8130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn checkForceStop(); 8140f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn setAppLabelAndIcon(mPackageInfo); 8150f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn refreshButtons(); 8160f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn refreshSizeInfo(); 817ab616d477be693fc455329953711264af0ed7814Dianne Hackborn 818ab616d477be693fc455329953711264af0ed7814Dianne Hackborn if (!mInitialized) { 819ab616d477be693fc455329953711264af0ed7814Dianne Hackborn // First time init: are we displaying an uninstalled app? 820ab616d477be693fc455329953711264af0ed7814Dianne Hackborn mInitialized = true; 821ab616d477be693fc455329953711264af0ed7814Dianne Hackborn mShowUninstalled = (mAppEntry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0; 8224de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn } else { 8234de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // All other times: if the app no longer exists then we want 8244de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // to go away. 8259072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn try { 8269072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn ApplicationInfo ainfo = getActivity().getPackageManager().getApplicationInfo( 8279072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mAppEntry.info.packageName, PackageManager.GET_UNINSTALLED_PACKAGES 8289072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn | PackageManager.GET_DISABLED_COMPONENTS); 8294de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn if (!mShowUninstalled) { 8304de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // If we did not start out with the app uninstalled, then 8314de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // it transitioning to the uninstalled state for the current 8324de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // user means we should go away as well. 8334de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn return (ainfo.flags&ApplicationInfo.FLAG_INSTALLED) != 0; 8344de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn } 8359072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } catch (NameNotFoundException e) { 8369072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn return false; 8379072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 838ab616d477be693fc455329953711264af0ed7814Dianne Hackborn } 839ab616d477be693fc455329953711264af0ed7814Dianne Hackborn 8400f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return true; 841afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 8423465b67740e17711af2b36b09e2250a02275d860Jake Hamby 8433465b67740e17711af2b36b09e2250a02275d860Jake Hamby private static class PremiumSmsSelectionListener implements AdapterView.OnItemSelectedListener { 8443465b67740e17711af2b36b09e2250a02275d860Jake Hamby private final String mPackageName; 8453465b67740e17711af2b36b09e2250a02275d860Jake Hamby private final ISms mSmsManager; 8463465b67740e17711af2b36b09e2250a02275d860Jake Hamby 8473465b67740e17711af2b36b09e2250a02275d860Jake Hamby PremiumSmsSelectionListener(String packageName, ISms smsManager) { 8483465b67740e17711af2b36b09e2250a02275d860Jake Hamby mPackageName = packageName; 8493465b67740e17711af2b36b09e2250a02275d860Jake Hamby mSmsManager = smsManager; 8503465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 8513465b67740e17711af2b36b09e2250a02275d860Jake Hamby 8523465b67740e17711af2b36b09e2250a02275d860Jake Hamby @Override 8533465b67740e17711af2b36b09e2250a02275d860Jake Hamby public void onItemSelected(AdapterView<?> parent, View view, int position, 8543465b67740e17711af2b36b09e2250a02275d860Jake Hamby long id) { 8553465b67740e17711af2b36b09e2250a02275d860Jake Hamby if (position >= 0 && position < 3) { 8563465b67740e17711af2b36b09e2250a02275d860Jake Hamby Log.d(TAG, "Selected premium SMS policy " + position); 8573465b67740e17711af2b36b09e2250a02275d860Jake Hamby setPremiumSmsPermission(mPackageName, (position + 1)); 8583465b67740e17711af2b36b09e2250a02275d860Jake Hamby } else { 8593465b67740e17711af2b36b09e2250a02275d860Jake Hamby Log.e(TAG, "Error: unknown premium SMS policy " + position); 8603465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 8613465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 8623465b67740e17711af2b36b09e2250a02275d860Jake Hamby 8633465b67740e17711af2b36b09e2250a02275d860Jake Hamby @Override 8643465b67740e17711af2b36b09e2250a02275d860Jake Hamby public void onNothingSelected(AdapterView<?> parent) { 8653465b67740e17711af2b36b09e2250a02275d860Jake Hamby // Ignored 8663465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 8673465b67740e17711af2b36b09e2250a02275d860Jake Hamby 8683465b67740e17711af2b36b09e2250a02275d860Jake Hamby private void setPremiumSmsPermission(String packageName, int permission) { 8693465b67740e17711af2b36b09e2250a02275d860Jake Hamby try { 8703465b67740e17711af2b36b09e2250a02275d860Jake Hamby if (mSmsManager != null) { 8713465b67740e17711af2b36b09e2250a02275d860Jake Hamby mSmsManager.setPremiumSmsPermission(packageName, permission); 8723465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 8733465b67740e17711af2b36b09e2250a02275d860Jake Hamby } catch (RemoteException ex) { 8743465b67740e17711af2b36b09e2250a02275d860Jake Hamby // ignored 8753465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 8763465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 8773465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 8780f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 879c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka private void resetLaunchDefaultsUi(TextView title, TextView autoLaunchView) { 880c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka title.setText(R.string.auto_launch_label); 881c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka autoLaunchView.setText(R.string.auto_launch_disable_text); 882c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka // Disable clear activities button 883c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka mActivitiesButton.setEnabled(false); 884c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } 885c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka 886afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void setIntentAndFinish(boolean finish, boolean appChanged) { 887afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(localLOGV) Log.i(TAG, "appChanged="+appChanged); 888afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Intent intent = new Intent(); 889afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project intent.putExtra(ManageApplications.APP_CHG, appChanged); 890ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn PreferenceActivity pa = (PreferenceActivity)getActivity(); 891ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn pa.finishPreferencePanel(this, Activity.RESULT_OK, intent); 892afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 893afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 8940f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn private void refreshSizeInfo() { 8950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (mAppEntry.size == ApplicationsState.SIZE_INVALID 8960f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn || mAppEntry.size == ApplicationsState.SIZE_UNKNOWN) { 8970f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mLastCodeSize = mLastDataSize = mLastCacheSize = mLastTotalSize = -1; 8980f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (!mHaveSizes) { 8990f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mAppSize.setText(mComputingStr); 9000f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mDataSize.setText(mComputingStr); 9010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mCacheSize.setText(mComputingStr); 9020f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mTotalSize.setText(mComputingStr); 9030f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 9040f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearDataButton.setEnabled(false); 9050f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearCacheButton.setEnabled(false); 9060f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 907afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 9080f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mHaveSizes = true; 9091f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn long codeSize = mAppEntry.codeSize; 9101f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn long dataSize = mAppEntry.dataSize; 9111f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if (Environment.isExternalStorageEmulated()) { 9121f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn codeSize += mAppEntry.externalCodeSize; 9131f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn dataSize += mAppEntry.externalDataSize; 9141f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn } else { 9151f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if (mLastExternalCodeSize != mAppEntry.externalCodeSize) { 9161f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mLastExternalCodeSize = mAppEntry.externalCodeSize; 9171f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mExternalCodeSize.setText(getSizeStr(mAppEntry.externalCodeSize)); 9181f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn } 9191f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if (mLastExternalDataSize != mAppEntry.externalDataSize) { 9201f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mLastExternalDataSize = mAppEntry.externalDataSize; 9211f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mExternalDataSize.setText(getSizeStr( mAppEntry.externalDataSize)); 9221f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn } 923afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 9241f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if (mLastCodeSize != codeSize) { 9251f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mLastCodeSize = codeSize; 9261f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mAppSize.setText(getSizeStr(codeSize)); 927bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn } 9281f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if (mLastDataSize != dataSize) { 9291f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mLastDataSize = dataSize; 9301f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mDataSize.setText(getSizeStr(dataSize)); 931424acfb7ad469efb0a51c69fc8713cc96e2357b0Kenny Root } 932313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn long cacheSize = mAppEntry.cacheSize + mAppEntry.externalCacheSize; 933313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn if (mLastCacheSize != cacheSize) { 934313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn mLastCacheSize = cacheSize; 935313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn mCacheSize.setText(getSizeStr(cacheSize)); 936afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 9370f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (mLastTotalSize != mAppEntry.size) { 9380f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mLastTotalSize = mAppEntry.size; 9390f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mTotalSize.setText(getSizeStr(mAppEntry.size)); 940afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 9410f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 9421f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if ((mAppEntry.dataSize+ mAppEntry.externalDataSize) <= 0 || !mCanClearData) { 9430f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearDataButton.setEnabled(false); 9440f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } else { 9450f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearDataButton.setEnabled(true); 9460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearDataButton.setOnClickListener(this); 9470f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 948313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn if (cacheSize <= 0) { 9490f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearCacheButton.setEnabled(false); 9500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } else { 9510f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearCacheButton.setEnabled(true); 9520f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearCacheButton.setOnClickListener(this); 953afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 954afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 955afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 956afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 957afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 958afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to handle clear message notification from observer when 959afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * the async operation from PackageManager is complete 960afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 961afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void processClearMsg(Message msg) { 962afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int result = msg.arg1; 9630f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn String packageName = mAppEntry.info.packageName; 96442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.clear_user_data_text); 965afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(result == OP_SUCCESSFUL) { 96642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Log.i(TAG, "Cleared user data for package : "+packageName); 9670f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mState.requestSize(mAppEntry.info.packageName); 968afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 96942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(true); 970afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 9719db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn checkForceStop(); 972afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 973ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu 974de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu private void refreshButtons() { 975de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu if (!mMoveInProgress) { 976de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu initUninstallButtons(); 977de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu initDataButtons(); 978de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu initMoveButton(); 9794a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler initNotificationButton(); 980de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } else { 981de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mMoveAppButton.setText(R.string.moving); 982de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mMoveAppButton.setEnabled(false); 983de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mUninstallButton.setEnabled(false); 9849072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mSpecialDisableButton.setEnabled(false); 985de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } 986de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } 987de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu 988ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private void processMoveMsg(Message msg) { 989ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu int result = msg.arg1; 9900f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn String packageName = mAppEntry.info.packageName; 991de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu // Refresh the button attributes. 992de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mMoveInProgress = false; 9930f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (result == PackageManager.MOVE_SUCCEEDED) { 994ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu Log.i(TAG, "Moved resources for " + packageName); 995de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu // Refresh size information again. 9960f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mState.requestSize(mAppEntry.info.packageName); 997ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } else { 998f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn showDialogInner(DLG_MOVE_FAILED, result); 999ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 10000f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn refreshUi(); 1001ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 10025cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu 1003afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 1004afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to initiate clearing user data when the user clicks the clear data 1005afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * button for a system package 1006afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 100742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void initiateClearUserData() { 100842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(false); 100942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Invoke uninstall or clear user data based on sysPackage 10100f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn String packageName = mAppEntry.info.packageName; 101142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Log.i(TAG, "Clearing user data for package : " + packageName); 10120f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (mClearDataObserver == null) { 1013afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearDataObserver = new ClearUserDataObserver(); 1014afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1015f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn ActivityManager am = (ActivityManager) 1016f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getActivity().getSystemService(Context.ACTIVITY_SERVICE); 1017afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project boolean res = am.clearApplicationUserData(packageName, mClearDataObserver); 10180f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (!res) { 101950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Clearing data failed for some obscure reason. Just log error for now 1020afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Log.i(TAG, "Couldnt clear application user data for package:"+packageName); 1021f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn showDialogInner(DLG_CANNOT_CLEAR_DATA, 0); 1022afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 102342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.recompute_size); 1024afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1025afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1026afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1027f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn private void showDialogInner(int id, int moveErrorCode) { 1028f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn DialogFragment newFragment = MyAlertDialogFragment.newInstance(id, moveErrorCode); 1029f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn newFragment.setTargetFragment(this, 0); 1030f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn newFragment.show(getFragmentManager(), "dialog " + id); 103150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 103250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 1033f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public static class MyAlertDialogFragment extends DialogFragment { 1034f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 1035f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public static MyAlertDialogFragment newInstance(int id, int moveErrorCode) { 1036f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn MyAlertDialogFragment frag = new MyAlertDialogFragment(); 1037f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn Bundle args = new Bundle(); 1038f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn args.putInt("id", id); 1039f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn args.putInt("moveError", moveErrorCode); 1040f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn frag.setArguments(args); 1041f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return frag; 1042f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 1043f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 1044f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn InstalledAppDetails getOwner() { 1045f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return (InstalledAppDetails)getTargetFragment(); 1046f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 1047f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 1048f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn @Override 1049f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public Dialog onCreateDialog(Bundle savedInstanceState) { 1050f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn int id = getArguments().getInt("id"); 1051f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn int moveErrorCode = getArguments().getInt("moveError"); 1052f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn switch (id) { 1053f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn case DLG_CLEAR_DATA: 1054f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return new AlertDialog.Builder(getActivity()) 1055f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setTitle(getActivity().getText(R.string.clear_data_dlg_title)) 1056e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 1057f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setMessage(getActivity().getText(R.string.clear_data_dlg_text)) 1058f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setPositiveButton(R.string.dlg_ok, 1059f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn new DialogInterface.OnClickListener() { 1060f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onClick(DialogInterface dialog, int which) { 1061f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn // Clear user data here 1062f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getOwner().initiateClearUserData(); 1063f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 1064f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn }) 1065f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setNegativeButton(R.string.dlg_cancel, null) 1066f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .create(); 1067f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn case DLG_FACTORY_RESET: 1068f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return new AlertDialog.Builder(getActivity()) 1069f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setTitle(getActivity().getText(R.string.app_factory_reset_dlg_title)) 1070e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 1071f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setMessage(getActivity().getText(R.string.app_factory_reset_dlg_text)) 1072f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setPositiveButton(R.string.dlg_ok, 1073f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn new DialogInterface.OnClickListener() { 1074f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onClick(DialogInterface dialog, int which) { 1075f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn // Clear user data here 10769072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn getOwner().uninstallPkg(getOwner().mAppEntry.info.packageName, 10779072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn false, false); 1078f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 1079f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn }) 1080f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setNegativeButton(R.string.dlg_cancel, null) 1081f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .create(); 1082f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn case DLG_APP_NOT_FOUND: 1083f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return new AlertDialog.Builder(getActivity()) 1084f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setTitle(getActivity().getText(R.string.app_not_found_dlg_title)) 1085e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 1086f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setMessage(getActivity().getText(R.string.app_not_found_dlg_title)) 1087f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setNeutralButton(getActivity().getText(R.string.dlg_ok), 1088f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn new DialogInterface.OnClickListener() { 1089f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onClick(DialogInterface dialog, int which) { 1090f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn //force to recompute changed value 1091f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getOwner().setIntentAndFinish(true, true); 1092f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 1093f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn }) 1094f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .create(); 1095f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn case DLG_CANNOT_CLEAR_DATA: 1096f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return new AlertDialog.Builder(getActivity()) 1097f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setTitle(getActivity().getText(R.string.clear_failed_dlg_title)) 1098e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 1099f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setMessage(getActivity().getText(R.string.clear_failed_dlg_text)) 1100f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setNeutralButton(R.string.dlg_ok, 1101f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn new DialogInterface.OnClickListener() { 1102f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onClick(DialogInterface dialog, int which) { 1103f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getOwner().mClearDataButton.setEnabled(false); 1104f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn //force to recompute changed value 1105f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getOwner().setIntentAndFinish(false, false); 1106f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 1107f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn }) 1108f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .create(); 1109f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn case DLG_FORCE_STOP: 1110f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return new AlertDialog.Builder(getActivity()) 1111f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setTitle(getActivity().getText(R.string.force_stop_dlg_title)) 1112e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 1113f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setMessage(getActivity().getText(R.string.force_stop_dlg_text)) 1114f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setPositiveButton(R.string.dlg_ok, 1115f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn new DialogInterface.OnClickListener() { 1116f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onClick(DialogInterface dialog, int which) { 1117f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn // Force stop 1118f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getOwner().forceStopPackage(getOwner().mAppEntry.info.packageName); 1119f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 1120f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn }) 1121f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setNegativeButton(R.string.dlg_cancel, null) 1122f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .create(); 1123f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn case DLG_MOVE_FAILED: 1124f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn CharSequence msg = getActivity().getString(R.string.move_app_failed_dlg_text, 1125f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getOwner().getMoveErrMsg(moveErrorCode)); 1126f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return new AlertDialog.Builder(getActivity()) 1127f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setTitle(getActivity().getText(R.string.move_app_failed_dlg_title)) 1128e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 1129f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setMessage(msg) 1130f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setNeutralButton(R.string.dlg_ok, null) 1131f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .create(); 1132f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn case DLG_DISABLE: 1133f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn return new AlertDialog.Builder(getActivity()) 1134f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .setTitle(getActivity().getText(R.string.app_disable_dlg_title)) 1135e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 1136f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .setMessage(getActivity().getText(R.string.app_disable_dlg_text)) 1137f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .setPositiveButton(R.string.dlg_ok, 1138f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn new DialogInterface.OnClickListener() { 1139f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn public void onClick(DialogInterface dialog, int which) { 1140f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn // Disable the app 1141f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn new DisableChanger(getOwner(), getOwner().mAppEntry.info, 1142f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) 1143f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .execute((Object)null); 1144f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn } 1145f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn }) 1146f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .setNegativeButton(R.string.dlg_cancel, null) 1147f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .create(); 114870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler case DLG_DISABLE_NOTIFICATIONS: 114970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler return new AlertDialog.Builder(getActivity()) 115070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler .setTitle(getActivity().getText(R.string.app_disable_notifications_dlg_title)) 1151c8272b075275f81ddfb9cef2f92514b7ce3365deBjörn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 115270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler .setMessage(getActivity().getText(R.string.app_disable_notifications_dlg_text)) 115370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler .setPositiveButton(R.string.dlg_ok, 115470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler new DialogInterface.OnClickListener() { 115570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler public void onClick(DialogInterface dialog, int which) { 115670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler // Disable the package's notifications 115770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler getOwner().setNotificationsEnabled(false); 115870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } 115970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler }) 116070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler .setNegativeButton(R.string.dlg_cancel, 116170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler new DialogInterface.OnClickListener() { 116270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler public void onClick(DialogInterface dialog, int which) { 116370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler // Re-enable the checkbox 116470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler getOwner().mNotificationSwitch.setChecked(true); 116570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } 116670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler }) 116770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler .create(); 11689072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn case DLG_SPECIAL_DISABLE: 11699072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn return new AlertDialog.Builder(getActivity()) 11709072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn .setTitle(getActivity().getText(R.string.app_special_disable_dlg_title)) 11719072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn .setIconAttribute(android.R.attr.alertDialogIcon) 11729072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn .setMessage(getActivity().getText(R.string.app_special_disable_dlg_text)) 11739072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn .setPositiveButton(R.string.dlg_ok, 11749072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn new DialogInterface.OnClickListener() { 11759072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn public void onClick(DialogInterface dialog, int which) { 11769072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn // Clear user data here 11779072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn getOwner().uninstallPkg(getOwner().mAppEntry.info.packageName, 11789072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn false, true); 11799072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 11809072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn }) 11819072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn .setNegativeButton(R.string.dlg_cancel, null) 11829072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn .create(); 1183f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 1184f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn throw new IllegalArgumentException("unknown id " + id); 1185f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 118650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 118750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 11889072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn private void uninstallPkg(String packageName, boolean allUsers, boolean andDisable) { 118950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Create new intent to launch Uninstaller activity 119050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu Uri packageURI = Uri.parse("package:"+packageName); 11913db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageURI); 11923db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, allUsers); 11933db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn startActivityForResult(uninstallIntent, REQUEST_UNINSTALL); 11949072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mDisableAfterUninstall = andDisable; 119550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 119650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 119742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void forceStopPackage(String pkgName) { 1198f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn ActivityManager am = (ActivityManager)getActivity().getSystemService( 119942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Context.ACTIVITY_SERVICE); 120042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu am.forceStopPackage(pkgName); 1201c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn mState.invalidatePackage(pkgName); 1202c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn ApplicationsState.AppEntry newEnt = mState.getEntry(pkgName); 1203c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn if (newEnt != null) { 1204c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn mAppEntry = newEnt; 1205c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn } 1206cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn checkForceStop(); 120742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 120842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 1209cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() { 1210cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn @Override 1211cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn public void onReceive(Context context, Intent intent) { 1212861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn updateForceStopButton(getResultCode() != Activity.RESULT_CANCELED); 1213cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn } 1214cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn }; 1215861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn 1216861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn private void updateForceStopButton(boolean enabled) { 1217861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn mForceStopButton.setEnabled(enabled); 1218861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn mForceStopButton.setOnClickListener(InstalledAppDetails.this); 1219861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn } 1220cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn 1221cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn private void checkForceStop() { 12225c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 12235c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn // User can't force stop device admin. 12245c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn updateForceStopButton(false); 12255c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn } else if ((mAppEntry.info.flags&ApplicationInfo.FLAG_STOPPED) == 0) { 1226861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn // If the app isn't explicitly stopped, then always show the 1227861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn // force stop button. 1228861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn updateForceStopButton(true); 1229861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn } else { 12305c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART, 12315c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn Uri.fromParts("package", mAppEntry.info.packageName, null)); 12325c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName }); 12335c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid); 1234c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn intent.putExtra(Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(mAppEntry.info.uid)); 1235861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn getActivity().sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null, 1236861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn Activity.RESULT_CANCELED, null, null); 1237861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn } 1238cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn } 123970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler 12409db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn static class DisableChanger extends AsyncTask<Object, Object, Object> { 12419db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn final PackageManager mPm; 12429db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn final WeakReference<InstalledAppDetails> mActivity; 12439db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn final ApplicationInfo mInfo; 12449db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn final int mState; 12459db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn 12469db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn DisableChanger(InstalledAppDetails activity, ApplicationInfo info, int state) { 12479db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn mPm = activity.mPm; 12489db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn mActivity = new WeakReference<InstalledAppDetails>(activity); 12499db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn mInfo = info; 12509db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn mState = state; 12519db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 12529db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn 12539db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn @Override 12549db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn protected Object doInBackground(Object... params) { 12559db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn mPm.setApplicationEnabledSetting(mInfo.packageName, mState, 0); 12569db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn return null; 12579db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 12589db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 12599db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn 126070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler private void setNotificationsEnabled(boolean enabled) { 126170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler String packageName = mAppEntry.info.packageName; 126270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler INotificationManager nm = INotificationManager.Stub.asInterface( 126370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 126470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler try { 126570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler final boolean enable = mNotificationSwitch.isChecked(); 126670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler nm.setNotificationsEnabledForPackage(packageName, enabled); 126770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } catch (android.os.RemoteException ex) { 126870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler mNotificationSwitch.setChecked(!enabled); // revert 126970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } 127070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } 127170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler 12723465b67740e17711af2b36b09e2250a02275d860Jake Hamby private int getPremiumSmsPermission(String packageName) { 12733465b67740e17711af2b36b09e2250a02275d860Jake Hamby try { 12743465b67740e17711af2b36b09e2250a02275d860Jake Hamby if (mSmsManager != null) { 12753465b67740e17711af2b36b09e2250a02275d860Jake Hamby return mSmsManager.getPremiumSmsPermission(packageName); 12763465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 12773465b67740e17711af2b36b09e2250a02275d860Jake Hamby } catch (RemoteException ex) { 12783465b67740e17711af2b36b09e2250a02275d860Jake Hamby // ignored 12793465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 12803465b67740e17711af2b36b09e2250a02275d860Jake Hamby return SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN; 12813465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 12823465b67740e17711af2b36b09e2250a02275d860Jake Hamby 1283afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 1284afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Method implementing functionality of buttons clicked 1285afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * @see android.view.View.OnClickListener#onClick(android.view.View) 1286afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 1287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onClick(View v) { 12880f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn String packageName = mAppEntry.info.packageName; 128942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if(v == mUninstallButton) { 129042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (mUpdatedSysApp) { 1291f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn showDialogInner(DLG_FACTORY_RESET, 0); 129242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 12930f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 1294f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn if (mAppEntry.info.enabled) { 1295f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn showDialogInner(DLG_DISABLE, 0); 1296f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn } else { 1297f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn new DisableChanger(this, mAppEntry.info, 1298f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) 1299f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .execute((Object)null); 1300f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn } 13012e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_INSTALLED) == 0) { 13024de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn uninstallPkg(packageName, true, false); 13039db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } else { 13049072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn uninstallPkg(packageName, false, false); 13059db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 1306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 13079072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } else if(v == mSpecialDisableButton) { 13089072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn showDialogInner(DLG_SPECIAL_DISABLE, 0); 1309afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if(v == mActivitiesButton) { 1310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.clearPackagePreferredActivities(packageName); 13119d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood try { 1312be32d4b408a2fd0ec25bdd4f0e67cba2f23a4edbJeff Sharkey mUsbManager.clearDefaults(packageName, UserHandle.myUserId()); 13139d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood } catch (RemoteException e) { 13149d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood Log.e(TAG, "mUsbManager.clearDefaults", e); 13159d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood } 1316c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka mAppWidgetManager.setBindAppWidgetPermission(packageName, false); 1317c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka TextView autoLaunchTitleView = 1318c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka (TextView) mRootView.findViewById(R.id.auto_launch_title); 1319c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka TextView autoLaunchView = (TextView) mRootView.findViewById(R.id.auto_launch); 1320c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka resetLaunchDefaultsUi(autoLaunchTitleView, autoLaunchView); 132142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else if(v == mClearDataButton) { 13220f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (mAppEntry.info.manageSpaceActivityName != null) { 13233fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani if (!Utils.isMonkeyRunning()) { 13243fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani Intent intent = new Intent(Intent.ACTION_DEFAULT); 13253fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani intent.setClassName(mAppEntry.info.packageName, 13263fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani mAppEntry.info.manageSpaceActivityName); 13273db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn startActivityForResult(intent, REQUEST_MANAGE_SPACE); 13283fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani } 132942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 1330f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn showDialogInner(DLG_CLEAR_DATA, 0); 133142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 1332afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mClearCacheButton) { 1333afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Lazy initialization of observer 1334afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mClearCacheObserver == null) { 1335afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheObserver = new ClearCacheObserver(); 1336afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1337afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver); 1338afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mForceStopButton) { 1339f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn showDialogInner(DLG_FORCE_STOP, 0); 13409db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn //forceStopPackage(mAppInfo.packageName); 1341ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } else if (v == mMoveAppButton) { 1342ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu if (mPackageMoveObserver == null) { 1343ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mPackageMoveObserver = new PackageMoveObserver(); 1344ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 13450f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn int moveFlags = (mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0 ? 1346ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu PackageManager.MOVE_INTERNAL : PackageManager.MOVE_EXTERNAL_MEDIA; 1347de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mMoveInProgress = true; 1348de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu refreshButtons(); 13490f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mPm.movePackage(mAppEntry.info.packageName, mPackageMoveObserver, moveFlags); 1350afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1351afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1352aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn 1353aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn @Override 1354aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 1355aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn String packageName = mAppEntry.info.packageName; 1356aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn ActivityManager am = (ActivityManager) 1357aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn getActivity().getSystemService(Context.ACTIVITY_SERVICE); 1358aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn if (buttonView == mAskCompatibilityCB) { 1359aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn am.setPackageAskScreenCompat(packageName, isChecked); 1360aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } else if (buttonView == mEnableCompatibilityCB) { 1361aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn am.setPackageScreenCompatMode(packageName, isChecked ? 1362aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn ActivityManager.COMPAT_MODE_ENABLED : ActivityManager.COMPAT_MODE_DISABLED); 13634a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler } else if (buttonView == mNotificationSwitch) { 136470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler if (!isChecked) { 136570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler showDialogInner(DLG_DISABLE_NOTIFICATIONS, 0); 136670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } else { 136770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler setNotificationsEnabled(true); 13684a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler } 1369aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } 1370aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } 1371afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 1372afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1373