InstalledAppDetails.java revision 0fca4296ac08fcf42b58fac3a016ea068fcf6257
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; 1130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn private PackageInfo mPackageInfo; 1146dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn private CanBeOnSdCardChecker mCanBeOnSdCardChecker; 115f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn private View mRootView; 11642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private Button mUninstallButton; 117de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu private boolean mMoveInProgress = false; 11842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private boolean mUpdatedSysApp = false; 119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mActivitiesButton; 120aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn private View mScreenCompatSection; 121aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn private CheckBox mAskCompatibilityCB; 122aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn private CheckBox mEnableCompatibilityCB; 1232f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn private boolean mCanClearData = true; 12450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private TextView mAppVersion; 125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mTotalSize; 126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mAppSize; 127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mDataSize; 128bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn private TextView mExternalCodeSize; 129bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn private TextView mExternalDataSize; 130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private ClearUserDataObserver mClearDataObserver; 131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Views related to cache info 132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private TextView mCacheSize; 133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mClearCacheButton; 134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private ClearCacheObserver mClearCacheObserver; 135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mForceStopButton; 13642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private Button mClearDataButton; 13742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private Button mMoveAppButton; 13870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler private CompoundButton mNotificationSwitch; 1394a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler 140ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private PackageMoveObserver mPackageMoveObserver; 141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1420f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn private boolean mHaveSizes = false; 1430f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn private long mLastCodeSize = -1; 1440f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn private long mLastDataSize = -1; 145bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn private long mLastExternalCodeSize = -1; 146bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn private long mLastExternalDataSize = -1; 1470f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn private long mLastCacheSize = -1; 1480f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn private long mLastTotalSize = -1; 1490f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project //internal constants used in Handler 151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int OP_SUCCESSFUL = 1; 152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int OP_FAILED = 2; 153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int CLEAR_USER_DATA = 1; 154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int CLEAR_CACHE = 3; 155ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private static final int PACKAGE_MOVE = 4; 156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // invalid size value used initially and also when size retrieval through PackageManager 158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // fails for whatever reason 159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final int SIZE_INVALID = -1; 160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Resource strings 162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mInvalidSizeStr; 163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private CharSequence mComputingStr; 164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 16550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Dialog identifiers used in showDialog 16650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_BASE = 0; 16750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_CLEAR_DATA = DLG_BASE + 1; 16850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_FACTORY_RESET = DLG_BASE + 2; 16950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_APP_NOT_FOUND = DLG_BASE + 3; 17050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private static final int DLG_CANNOT_CLEAR_DATA = DLG_BASE + 4; 17142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private static final int DLG_FORCE_STOP = DLG_BASE + 5; 1725cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu private static final int DLG_MOVE_FAILED = DLG_BASE + 6; 173f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn private static final int DLG_DISABLE = DLG_BASE + 7; 17470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler private static final int DLG_DISABLE_NOTIFICATIONS = DLG_BASE + 8; 1753db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 1763db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn // Menu identifiers 1773db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public static final int UNINSTALL_ALL_USERS_MENU = 1; 1783db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 1793db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn // Result code identifiers 1803db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public static final int REQUEST_UNINSTALL = 1; 1813db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public static final int REQUEST_MANAGE_SPACE = 2; 1823db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Handler mHandler = new Handler() { 184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void handleMessage(Message msg) { 185f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn // If the fragment is gone, don't process any more messages. 186f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn if (getView() == null) { 18707f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn return; 18807f636059a2fb45f2d8284fedbbbba2c78b05157Dianne Hackborn } 189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project switch (msg.what) { 190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case CLEAR_USER_DATA: 191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project processClearMsg(msg); 192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case CLEAR_CACHE: 194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Refresh size info 1950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mState.requestSize(mAppEntry.info.packageName); 196afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 197ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu case PACKAGE_MOVE: 198ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu processMoveMsg(msg); 199ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu break; 200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project default: 201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project break; 202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 203afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 204afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project }; 205afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project class ClearUserDataObserver extends IPackageDataObserver.Stub { 207afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onRemoveCompleted(final String packageName, final boolean succeeded) { 208afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA); 209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED; 210afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mHandler.sendMessage(msg); 211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 212afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project class ClearCacheObserver extends IPackageDataObserver.Stub { 215afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onRemoveCompleted(final String packageName, final boolean succeeded) { 216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project final Message msg = mHandler.obtainMessage(CLEAR_CACHE); 217ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu msg.arg1 = succeeded ? OP_SUCCESSFUL:OP_FAILED; 218afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mHandler.sendMessage(msg); 219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 220afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 221ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu 222ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu class PackageMoveObserver extends IPackageMoveObserver.Stub { 223ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu public void packageMoved(String packageName, int returnCode) throws RemoteException { 224ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu final Message msg = mHandler.obtainMessage(PACKAGE_MOVE); 225ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu msg.arg1 = returnCode; 226ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mHandler.sendMessage(msg); 227ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 228ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private String getSizeStr(long size) { 231afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (size == SIZE_INVALID) { 232afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return mInvalidSizeStr.toString(); 233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 234f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return Formatter.formatFileSize(getActivity(), size); 235afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 23742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void initDataButtons() { 2382f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn if ((mAppEntry.info.flags&(ApplicationInfo.FLAG_SYSTEM 2392f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn | ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA)) 2405c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn == ApplicationInfo.FLAG_SYSTEM 2415c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn || mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 24242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.clear_user_data_text); 2432f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn mClearDataButton.setEnabled(false); 2442f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn mCanClearData = false; 2452f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn } else { 2462f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn if (mAppEntry.info.manageSpaceActivityName != null) { 2472f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn mClearDataButton.setText(R.string.manage_space_text); 2482f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn } else { 2492f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn mClearDataButton.setText(R.string.clear_user_data_text); 2502f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn } 2512f144fc07d3f202b83ffb6064a223bbadef65114Dianne Hackborn mClearDataButton.setOnClickListener(this); 25242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 253ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 254ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu 2555cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu private CharSequence getMoveErrMsg(int errCode) { 2565cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu switch (errCode) { 2575cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu case PackageManager.MOVE_FAILED_INSUFFICIENT_STORAGE: 258f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return getActivity().getString(R.string.insufficient_storage); 2595cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu case PackageManager.MOVE_FAILED_DOESNT_EXIST: 260f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return getActivity().getString(R.string.does_not_exist); 2615cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu case PackageManager.MOVE_FAILED_FORWARD_LOCKED: 262f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return getActivity().getString(R.string.app_forward_locked); 2635cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu case PackageManager.MOVE_FAILED_INVALID_LOCATION: 264f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return getActivity().getString(R.string.invalid_location); 2655cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu case PackageManager.MOVE_FAILED_SYSTEM_PACKAGE: 266f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return getActivity().getString(R.string.system_package); 2679a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu case PackageManager.MOVE_FAILED_INTERNAL_ERROR: 2689a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu return ""; 2695cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu } 2709a3a1a4e58c03a81368ebe5411f334c5c9a3a89bSuchi Amalapurapu return ""; 2715cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu } 2725cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu 273ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private void initMoveButton() { 274ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn if (Environment.isExternalStorageEmulated()) { 275ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn mMoveAppButton.setVisibility(View.INVISIBLE); 276ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn return; 277ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn } 27842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu boolean dataOnly = false; 2790f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn dataOnly = (mPackageInfo == null) && (mAppEntry != null); 280ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu boolean moveDisable = true; 28142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (dataOnly) { 28242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mMoveAppButton.setText(R.string.move_app); 2830f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) { 28442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mMoveAppButton.setText(R.string.move_app_to_internal); 2854056459e9e6bf766168aff4cfe41b0a28a843323Suchi Amalapurapu // Always let apps move to internal storage from sdcard. 286ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu moveDisable = false; 28742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 28842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mMoveAppButton.setText(R.string.move_app_to_sdcard); 2896dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn mCanBeOnSdCardChecker.init(); 2906dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn moveDisable = !mCanBeOnSdCardChecker.check(mAppEntry.info); 291730eb7e5ffa56cae2224a836f489b8e1e94b1f09Suchi Amalapurapu } 292ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu if (moveDisable) { 293ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mMoveAppButton.setEnabled(false); 294ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } else { 295ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mMoveAppButton.setOnClickListener(this); 296ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mMoveAppButton.setEnabled(true); 297ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 29842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 29942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 30070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler private boolean isThisASystemPackage() { 30170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler try { 30270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler PackageInfo sys = mPm.getPackageInfo("android", PackageManager.GET_SIGNATURES); 30370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler return (mPackageInfo != null && mPackageInfo.signatures != null && 30470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler sys.signatures[0].equals(mPackageInfo.signatures[0])); 30570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } catch (PackageManager.NameNotFoundException e) { 30670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler return false; 30770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } 30870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } 30970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler 310de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu private void initUninstallButtons() { 3110f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mUpdatedSysApp = (mAppEntry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0; 31242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu boolean enabled = true; 31342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (mUpdatedSysApp) { 31442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setText(R.string.app_factory_reset); 31542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 3160f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 317b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu enabled = false; 3183db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn try { 3193db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn // Try to prevent the user from bricking their phone 3203db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn // by not allowing disabling of apps signed with the 3213db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn // system cert and any launcher app in the system. 3223db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn PackageInfo sys = mPm.getPackageInfo("android", 3233db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn PackageManager.GET_SIGNATURES); 3243db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn Intent intent = new Intent(Intent.ACTION_MAIN); 3253db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn intent.addCategory(Intent.CATEGORY_HOME); 3263db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn intent.setPackage(mAppEntry.info.packageName); 3273db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn List<ResolveInfo> homes = mPm.queryIntentActivities(intent, 0); 3283db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if ((homes != null && homes.size() > 0) || isThisASystemPackage()) { 3293db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn // Disable button for core system applications. 3303db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn mUninstallButton.setText(R.string.disable_text); 3313db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if (mAppEntry.info.enabled) { 3323db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn mUninstallButton.setText(R.string.disable_text); 3333db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn enabled = true; 3343db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else { 3353db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn mUninstallButton.setText(R.string.enable_text); 3363db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn enabled = true; 3379db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 3383db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } catch (PackageManager.NameNotFoundException e) { 3393db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn Log.w(TAG, "Unable to get package info", e); 3409db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 3412e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn } else if ((mPackageInfo.applicationInfo.flags 3422e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn & ApplicationInfo.FLAG_INSTALLED) == 0) { 3432e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn mUninstallButton.setText(R.string.install_text); 3449db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } else { 3459db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn mUninstallButton.setText(R.string.uninstall_text); 346b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu } 34742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 3485c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn // If this is a device admin, it can't be uninstall or disabled. 3495c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn // We do this here so the text of the button is still set correctly. 3505c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 3515c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn enabled = false; 3525c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn } 35342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setEnabled(enabled); 35442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (enabled) { 35542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Register listener 35642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setOnClickListener(this); 35742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 35842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 35942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 3604a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler private void initNotificationButton() { 3614a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler INotificationManager nm = INotificationManager.Stub.asInterface( 3624a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 3634a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler boolean enabled = true; // default on 3644a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler try { 3654a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler enabled = nm.areNotificationsEnabledForPackage(mAppEntry.info.packageName); 3664a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler } catch (android.os.RemoteException ex) { 3674a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler // this does not bode well 3684a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler } 3694a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler mNotificationSwitch.setChecked(enabled); 37070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler if (isThisASystemPackage()) { 37170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler mNotificationSwitch.setEnabled(false); 37270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } else { 37370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler mNotificationSwitch.setEnabled(true); 37470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler mNotificationSwitch.setOnCheckedChangeListener(this); 37570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } 3764a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler } 3774a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler 378afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** Called when the activity is first created. */ 379afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 380f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onCreate(Bundle icicle) { 381afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(icicle); 3823db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 383f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mState = ApplicationsState.getInstance(getActivity().getApplication()); 384309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSession = mState.newSession(this); 385f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mPm = getActivity().getPackageManager(); 3863db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn mUserManager = (UserManager)getActivity().getSystemService(Context.USER_SERVICE); 3879d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood IBinder b = ServiceManager.getService(Context.USB_SERVICE); 3889d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood mUsbManager = IUsbManager.Stub.asInterface(b); 389c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka mAppWidgetManager = AppWidgetManager.getInstance(getActivity()); 3905c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn mDpm = (DevicePolicyManager)getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE); 3913465b67740e17711af2b36b09e2250a02275d860Jake Hamby mSmsManager = ISms.Stub.asInterface(ServiceManager.getService("isms")); 3929d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood 3936dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn mCanBeOnSdCardChecker = new CanBeOnSdCardChecker(); 3940fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn 3950fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn retrieveAppEntry(); 3960fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn 3970fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn setHasOptionsMenu(true); 398f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 399f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 400f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn @Override 401f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 402f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn View view = mRootView = inflater.inflate(R.layout.installed_app_details, null); 4036dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn 404f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mComputingStr = getActivity().getText(R.string.computing_size); 405b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 40650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Set default values on sizes 407f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mTotalSize = (TextView)view.findViewById(R.id.total_size_text); 408f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mAppSize = (TextView)view.findViewById(R.id.application_size_text); 409f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mDataSize = (TextView)view.findViewById(R.id.data_size_text); 410bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn mExternalCodeSize = (TextView)view.findViewById(R.id.external_code_size_text); 411bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn mExternalDataSize = (TextView)view.findViewById(R.id.external_data_size_text); 4121f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn 4131f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if (Environment.isExternalStorageEmulated()) { 4141f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn ((View)mExternalCodeSize.getParent()).setVisibility(View.GONE); 4151f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn ((View)mExternalDataSize.getParent()).setVisibility(View.GONE); 4161f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn } 4171f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn 41842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Get Control button panel 419f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn View btnPanel = view.findViewById(R.id.control_buttons_panel); 42042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mForceStopButton = (Button) btnPanel.findViewById(R.id.left_button); 42142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mForceStopButton.setText(R.string.force_stop); 42242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton = (Button)btnPanel.findViewById(R.id.right_button); 423cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn mForceStopButton.setEnabled(false); 424b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 42542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Initialize clear data and move install location buttons 426f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn View data_buttons_panel = view.findViewById(R.id.data_buttons_panel); 427313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn mClearDataButton = (Button) data_buttons_panel.findViewById(R.id.right_button); 428313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn mMoveAppButton = (Button) data_buttons_panel.findViewById(R.id.left_button); 429b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 4300f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn // Cache section 431f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mCacheSize = (TextView) view.findViewById(R.id.cache_size_text); 432f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mClearCacheButton = (Button) view.findViewById(R.id.clear_cache_button); 433f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 434f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mActivitiesButton = (Button)view.findViewById(R.id.clear_activities_button); 4350f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 436aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn // Screen compatibility control 437aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mScreenCompatSection = view.findViewById(R.id.screen_compatibility_section); 438aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mAskCompatibilityCB = (CheckBox)view.findViewById(R.id.ask_compatibility_cb); 439aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mEnableCompatibilityCB = (CheckBox)view.findViewById(R.id.enable_compatibility_cb); 4404a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler 44170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler mNotificationSwitch = (CompoundButton) view.findViewById(R.id.notification_switch); 442aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn 443f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return view; 444afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 445f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu 4463db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 4473db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 4483db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn menu.add(0, UNINSTALL_ALL_USERS_MENU, 1, R.string.uninstall_all_users_text) 4493db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 4503db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4513db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 4523db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 4533db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public void onPrepareOptionsMenu(Menu menu) { 4543db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn boolean showIt = true; 4553db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (mUpdatedSysApp) { 4563db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 4570fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn } else if (mAppEntry == null) { 4580fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn showIt = false; 4593db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 4603db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 4613db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 4623db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 4633db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if (UserHandle.myUserId() != 0) { 4643db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 4653db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if (mUserManager.getUsers().size() < 1) { 4663db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 4673db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4683db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn menu.findItem(UNINSTALL_ALL_USERS_MENU).setVisible(showIt); 4693db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4703db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 4713db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 4723db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public boolean onOptionsItemSelected(MenuItem item) { 4733db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn int menuId = item.getItemId(); 4743db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (menuId == UNINSTALL_ALL_USERS_MENU) { 4753db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn uninstallPkg(mAppEntry.info.packageName, true); 4763db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn return true; 4773db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4783db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn return false; 4793db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4803db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 4813db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 4823db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public void onActivityResult(int requestCode, int resultCode, Intent data) { 4833db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn super.onActivityResult(requestCode, resultCode, data); 4843db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (requestCode == REQUEST_UNINSTALL) { 4853db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (!refreshUi()) { 4863db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn setIntentAndFinish(true, true); 4873db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4883db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4893db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4903db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 49150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Utility method to set applicaiton label and icon. 492f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu private void setAppLabelAndIcon(PackageInfo pkgInfo) { 493f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn View appSnippet = mRootView.findViewById(R.id.app_snippet); 494f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon); 4950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mState.ensureIcon(mAppEntry); 4960f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn icon.setImageDrawable(mAppEntry.icon); 497f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu // Set application name. 498f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu TextView label = (TextView) appSnippet.findViewById(R.id.app_name); 4990f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn label.setText(mAppEntry.label); 50050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Version number of application 501f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu mAppVersion = (TextView) appSnippet.findViewById(R.id.app_size); 502f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu 503f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu if (pkgInfo != null && pkgInfo.versionName != null) { 50450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppVersion.setVisibility(View.VISIBLE); 505f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mAppVersion.setText(getActivity().getString(R.string.version_text, 5068e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes String.valueOf(pkgInfo.versionName))); 50750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } else { 508f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu mAppVersion.setVisibility(View.INVISIBLE); 50950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 51050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 51150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 51250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu @Override 51342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public void onResume() { 51442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu super.onResume(); 515b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 516309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSession.resume(); 5170f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (!refreshUi()) { 518b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown setIntentAndFinish(true, true); 519b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown } 5200f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5210f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5220f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn @Override 5230f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn public void onPause() { 5240f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn super.onPause(); 525309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSession.pause(); 5260f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5270f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5280f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn @Override 5290f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn public void onAllSizesComputed() { 5300f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5310f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5320f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn @Override 5330f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn public void onPackageIconChanged() { 5340f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5350f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5360f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn @Override 5370f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn public void onPackageListChanged() { 5380f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn refreshUi(); 5390f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5400f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5410f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn @Override 54219df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn public void onRebuildComplete(ArrayList<AppEntry> apps) { 54319df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } 54419df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn 54519df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn @Override 5460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn public void onPackageSizeChanged(String packageName) { 5470f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (packageName.equals(mAppEntry.info.packageName)) { 5480f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn refreshSizeInfo(); 5490f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5510f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5520f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn @Override 5530f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn public void onRunningStateChanged(boolean running) { 5540f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5560fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn private String retrieveAppEntry() { 5570c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy final Bundle args = getArguments(); 5580c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy String packageName = (args != null) ? args.getString(ARG_PACKAGE_NAME) : null; 559f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn if (packageName == null) { 5600c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy Intent intent = (args == null) ? 5610c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy getActivity().getIntent() : (Intent) args.getParcelable("intent"); 562f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn if (intent != null) { 563f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn packageName = intent.getData().getSchemeSpecificPart(); 564f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 565f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 5660f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mAppEntry = mState.getEntry(packageName); 5670fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn return packageName; 5680fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn } 5690fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn 5700fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn private boolean refreshUi() { 5710fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn if (mMoveInProgress) { 5720fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn return true; 5730fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn } 5740fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn final String packageName = retrieveAppEntry(); 5750fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn 5760f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (mAppEntry == null) { 5770f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return false; // onCreate must have failed, make sure to exit 578b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown } 579b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 58050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Get application info again to refresh changed properties of application 58150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu try { 5820f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mPackageInfo = mPm.getPackageInfo(mAppEntry.info.packageName, 5830f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn PackageManager.GET_DISABLED_COMPONENTS | 5840f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn PackageManager.GET_UNINSTALLED_PACKAGES | 5850f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn PackageManager.GET_SIGNATURES); 58650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } catch (NameNotFoundException e) { 5870f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn Log.e(TAG, "Exception when retrieving package:" + mAppEntry.info.packageName, e); 5880f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return false; // onCreate must have failed, make sure to exit 58950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 590b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 5910f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn // Get list of preferred activities 5920f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn List<ComponentName> prefActList = new ArrayList<ComponentName>(); 593b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 5940f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn // Intent list cannot be null. so pass empty list 5950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn List<IntentFilter> intentList = new ArrayList<IntentFilter>(); 5960f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mPm.getPreferredActivities(intentList, prefActList, packageName); 597c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (localLOGV) 598c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka Log.i(TAG, "Have " + prefActList.size() + " number of activities in preferred list"); 5999d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood boolean hasUsbDefaults = false; 6009d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood try { 6012715376cfa4d220f183623a5f35214d1bd537376Mike Lockwood hasUsbDefaults = mUsbManager.hasDefaults(packageName); 6029d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood } catch (RemoteException e) { 6039d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood Log.e(TAG, "mUsbManager.hasDefaults", e); 6049d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood } 605c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka boolean hasBindAppWidgetPermission = 606c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka mAppWidgetManager.hasBindAppWidgetPermission(mAppEntry.info.packageName); 607c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka 608c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka TextView autoLaunchTitleView = (TextView) mRootView.findViewById(R.id.auto_launch_title); 609c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka TextView autoLaunchView = (TextView) mRootView.findViewById(R.id.auto_launch); 610c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka boolean autoLaunchEnabled = prefActList.size() > 0 || hasUsbDefaults; 611c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (!autoLaunchEnabled && !hasBindAppWidgetPermission) { 612c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka resetLaunchDefaultsUi(autoLaunchTitleView, autoLaunchView); 6130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } else { 614c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka boolean useBullets = hasBindAppWidgetPermission && autoLaunchEnabled; 615c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka 616c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (hasBindAppWidgetPermission) { 617c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka autoLaunchTitleView.setText(R.string.auto_launch_label_generic); 618c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } else { 619c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka autoLaunchTitleView.setText(R.string.auto_launch_label); 620c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } 621c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka 622c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka CharSequence text = null; 623c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka int bulletIndent = getResources() 624c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka .getDimensionPixelSize(R.dimen.installed_app_details_bullet_offset); 625c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (autoLaunchEnabled) { 626c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka CharSequence autoLaunchEnableText = getText(R.string.auto_launch_enable_text); 627c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka SpannableString s = new SpannableString(autoLaunchEnableText); 628c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (useBullets) { 629c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka s.setSpan(new BulletSpan(bulletIndent), 0, autoLaunchEnableText.length(), 0); 630c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } 631c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka text = (text == null) ? 632c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka TextUtils.concat(s, "\n") : TextUtils.concat(text, "\n", s, "\n"); 633c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } 634c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (hasBindAppWidgetPermission) { 635c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka CharSequence alwaysAllowBindAppWidgetsText = 636c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka getText(R.string.always_allow_bind_appwidgets_text); 637c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka SpannableString s = new SpannableString(alwaysAllowBindAppWidgetsText); 638c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (useBullets) { 639c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka s.setSpan(new BulletSpan(bulletIndent), 640c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka 0, alwaysAllowBindAppWidgetsText.length(), 0); 641c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } 642c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka text = (text == null) ? 643c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka TextUtils.concat(s, "\n") : TextUtils.concat(text, "\n", s, "\n"); 644c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } 645c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka autoLaunchView.setText(text); 6460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mActivitiesButton.setEnabled(true); 6470f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mActivitiesButton.setOnClickListener(this); 6480f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 649aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn 650aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn // Screen compatibility section. 651aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn ActivityManager am = (ActivityManager) 652aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn getActivity().getSystemService(Context.ACTIVITY_SERVICE); 653aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn int compatMode = am.getPackageScreenCompatMode(packageName); 65413bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn // For now these are always off; this is the old UI model which we 65513bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn // are no longer using. 65613bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn if (false && (compatMode == ActivityManager.COMPAT_MODE_DISABLED 65713bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn || compatMode == ActivityManager.COMPAT_MODE_ENABLED)) { 658aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mScreenCompatSection.setVisibility(View.VISIBLE); 659aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mAskCompatibilityCB.setChecked(am.getPackageAskScreenCompat(packageName)); 660aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mAskCompatibilityCB.setOnCheckedChangeListener(this); 661aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mEnableCompatibilityCB.setChecked(compatMode == ActivityManager.COMPAT_MODE_ENABLED); 662aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mEnableCompatibilityCB.setOnCheckedChangeListener(this); 663aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } else { 664aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mScreenCompatSection.setVisibility(View.GONE); 665aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } 666aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn 6670f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn // Security permissions section 668f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn LinearLayout permsView = (LinearLayout) mRootView.findViewById(R.id.permissions_section); 669f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn AppSecurityPermissions asp = new AppSecurityPermissions(getActivity(), packageName); 6703465b67740e17711af2b36b09e2250a02275d860Jake Hamby int premiumSmsPermission = getPremiumSmsPermission(packageName); 6713465b67740e17711af2b36b09e2250a02275d860Jake Hamby // Premium SMS permission implies the app also has SEND_SMS permission, so the original 6723465b67740e17711af2b36b09e2250a02275d860Jake Hamby // application permissions list doesn't have to be shown/hidden separately. The premium 6733465b67740e17711af2b36b09e2250a02275d860Jake Hamby // SMS subsection should only be visible if the app has tried to send to a premium SMS. 6743465b67740e17711af2b36b09e2250a02275d860Jake Hamby if (asp.getPermissionCount() > 0 6753465b67740e17711af2b36b09e2250a02275d860Jake Hamby || premiumSmsPermission != SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN) { 6760f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn permsView.setVisibility(View.VISIBLE); 6773465b67740e17711af2b36b09e2250a02275d860Jake Hamby } else { 6783465b67740e17711af2b36b09e2250a02275d860Jake Hamby permsView.setVisibility(View.GONE); 6793465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 6803465b67740e17711af2b36b09e2250a02275d860Jake Hamby // Premium SMS permission subsection 6813465b67740e17711af2b36b09e2250a02275d860Jake Hamby TextView securityBillingDesc = (TextView) permsView.findViewById( 6823465b67740e17711af2b36b09e2250a02275d860Jake Hamby R.id.security_settings_billing_desc); 6833465b67740e17711af2b36b09e2250a02275d860Jake Hamby LinearLayout securityBillingList = (LinearLayout) permsView.findViewById( 6843465b67740e17711af2b36b09e2250a02275d860Jake Hamby R.id.security_settings_billing_list); 6853465b67740e17711af2b36b09e2250a02275d860Jake Hamby if (premiumSmsPermission != SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN) { 6863465b67740e17711af2b36b09e2250a02275d860Jake Hamby // Show the premium SMS permission selector 6873465b67740e17711af2b36b09e2250a02275d860Jake Hamby securityBillingDesc.setVisibility(View.VISIBLE); 6883465b67740e17711af2b36b09e2250a02275d860Jake Hamby securityBillingList.setVisibility(View.VISIBLE); 6893465b67740e17711af2b36b09e2250a02275d860Jake Hamby Spinner spinner = (Spinner) permsView.findViewById( 6903465b67740e17711af2b36b09e2250a02275d860Jake Hamby R.id.security_settings_premium_sms_list); 6913465b67740e17711af2b36b09e2250a02275d860Jake Hamby ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), 6923465b67740e17711af2b36b09e2250a02275d860Jake Hamby R.array.security_settings_premium_sms_values, 6933465b67740e17711af2b36b09e2250a02275d860Jake Hamby android.R.layout.simple_spinner_item); 6943465b67740e17711af2b36b09e2250a02275d860Jake Hamby adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 6953465b67740e17711af2b36b09e2250a02275d860Jake Hamby spinner.setAdapter(adapter); 6963465b67740e17711af2b36b09e2250a02275d860Jake Hamby // List items are in the same order as SmsUsageMonitor constants, offset by 1. 6973465b67740e17711af2b36b09e2250a02275d860Jake Hamby spinner.setSelection(premiumSmsPermission - 1); 6983465b67740e17711af2b36b09e2250a02275d860Jake Hamby spinner.setOnItemSelectedListener(new PremiumSmsSelectionListener( 6993465b67740e17711af2b36b09e2250a02275d860Jake Hamby packageName, mSmsManager)); 7003465b67740e17711af2b36b09e2250a02275d860Jake Hamby } else { 7013465b67740e17711af2b36b09e2250a02275d860Jake Hamby // Hide the premium SMS permission selector 7023465b67740e17711af2b36b09e2250a02275d860Jake Hamby securityBillingDesc.setVisibility(View.GONE); 7033465b67740e17711af2b36b09e2250a02275d860Jake Hamby securityBillingList.setVisibility(View.GONE); 7043465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 7053465b67740e17711af2b36b09e2250a02275d860Jake Hamby // App permissions subsection 7063465b67740e17711af2b36b09e2250a02275d860Jake Hamby if (asp.getPermissionCount() > 0) { 7070f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn // Make the security sections header visible 7080f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn LinearLayout securityList = (LinearLayout) permsView.findViewById( 7090f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn R.id.security_settings_list); 7100f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn securityList.removeAllViews(); 7110f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn securityList.addView(asp.getPermissionsView()); 712e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn // If this app is running under a shared user ID with other apps, 713e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn // update the description to explain this. 714e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn String[] packages = mPm.getPackagesForUid(mPackageInfo.applicationInfo.uid); 715e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn if (packages != null && packages.length > 1) { 716e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn ArrayList<CharSequence> pnames = new ArrayList<CharSequence>(); 717e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn for (int i=0; i<packages.length; i++) { 718e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn String pkg = packages[i]; 719e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn if (mPackageInfo.packageName.equals(pkg)) { 720e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn continue; 721e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 722e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn try { 723e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn ApplicationInfo ainfo = mPm.getApplicationInfo(pkg, 0); 724e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn pnames.add(ainfo.loadLabel(mPm)); 725e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } catch (PackageManager.NameNotFoundException e) { 726e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 727e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 728e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn final int N = pnames.size(); 729e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn if (N > 0) { 730e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn final Resources res = getActivity().getResources(); 731e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn String appListStr; 732e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn if (N == 1) { 733e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn appListStr = pnames.get(0).toString(); 734e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } else if (N == 2) { 735e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn appListStr = res.getString(R.string.join_two_items, pnames.get(0), 736e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn pnames.get(1)); 737e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } else { 738e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn appListStr = pnames.get(N-2).toString(); 739e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn for (int i=N-3; i>=0; i--) { 740e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn appListStr = res.getString(i == 0 ? R.string.join_many_items_first 741e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn : R.string.join_many_items_middle, pnames.get(i), appListStr); 742e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 743e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn appListStr = res.getString(R.string.join_many_items_last, 744e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn appListStr, pnames.get(N-1)); 745e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 746e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn TextView descr = (TextView) mRootView.findViewById( 747e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn R.id.security_settings_desc); 748e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn descr.setText(res.getString(R.string.security_settings_desc_multi, 749e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn mPackageInfo.applicationInfo.loadLabel(mPm), appListStr)); 750e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 751e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 752de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } 7530f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 7540f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn checkForceStop(); 7550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn setAppLabelAndIcon(mPackageInfo); 7560f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn refreshButtons(); 7570f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn refreshSizeInfo(); 7580f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return true; 759afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 7603465b67740e17711af2b36b09e2250a02275d860Jake Hamby 7613465b67740e17711af2b36b09e2250a02275d860Jake Hamby private static class PremiumSmsSelectionListener implements AdapterView.OnItemSelectedListener { 7623465b67740e17711af2b36b09e2250a02275d860Jake Hamby private final String mPackageName; 7633465b67740e17711af2b36b09e2250a02275d860Jake Hamby private final ISms mSmsManager; 7643465b67740e17711af2b36b09e2250a02275d860Jake Hamby 7653465b67740e17711af2b36b09e2250a02275d860Jake Hamby PremiumSmsSelectionListener(String packageName, ISms smsManager) { 7663465b67740e17711af2b36b09e2250a02275d860Jake Hamby mPackageName = packageName; 7673465b67740e17711af2b36b09e2250a02275d860Jake Hamby mSmsManager = smsManager; 7683465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 7693465b67740e17711af2b36b09e2250a02275d860Jake Hamby 7703465b67740e17711af2b36b09e2250a02275d860Jake Hamby @Override 7713465b67740e17711af2b36b09e2250a02275d860Jake Hamby public void onItemSelected(AdapterView<?> parent, View view, int position, 7723465b67740e17711af2b36b09e2250a02275d860Jake Hamby long id) { 7733465b67740e17711af2b36b09e2250a02275d860Jake Hamby if (position >= 0 && position < 3) { 7743465b67740e17711af2b36b09e2250a02275d860Jake Hamby Log.d(TAG, "Selected premium SMS policy " + position); 7753465b67740e17711af2b36b09e2250a02275d860Jake Hamby setPremiumSmsPermission(mPackageName, (position + 1)); 7763465b67740e17711af2b36b09e2250a02275d860Jake Hamby } else { 7773465b67740e17711af2b36b09e2250a02275d860Jake Hamby Log.e(TAG, "Error: unknown premium SMS policy " + position); 7783465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 7793465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 7803465b67740e17711af2b36b09e2250a02275d860Jake Hamby 7813465b67740e17711af2b36b09e2250a02275d860Jake Hamby @Override 7823465b67740e17711af2b36b09e2250a02275d860Jake Hamby public void onNothingSelected(AdapterView<?> parent) { 7833465b67740e17711af2b36b09e2250a02275d860Jake Hamby // Ignored 7843465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 7853465b67740e17711af2b36b09e2250a02275d860Jake Hamby 7863465b67740e17711af2b36b09e2250a02275d860Jake Hamby private void setPremiumSmsPermission(String packageName, int permission) { 7873465b67740e17711af2b36b09e2250a02275d860Jake Hamby try { 7883465b67740e17711af2b36b09e2250a02275d860Jake Hamby if (mSmsManager != null) { 7893465b67740e17711af2b36b09e2250a02275d860Jake Hamby mSmsManager.setPremiumSmsPermission(packageName, permission); 7903465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 7913465b67740e17711af2b36b09e2250a02275d860Jake Hamby } catch (RemoteException ex) { 7923465b67740e17711af2b36b09e2250a02275d860Jake Hamby // ignored 7933465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 7943465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 7953465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 7960f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 797c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka private void resetLaunchDefaultsUi(TextView title, TextView autoLaunchView) { 798c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka title.setText(R.string.auto_launch_label); 799c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka autoLaunchView.setText(R.string.auto_launch_disable_text); 800c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka // Disable clear activities button 801c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka mActivitiesButton.setEnabled(false); 802c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } 803c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka 804afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void setIntentAndFinish(boolean finish, boolean appChanged) { 805afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(localLOGV) Log.i(TAG, "appChanged="+appChanged); 806afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Intent intent = new Intent(); 807afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project intent.putExtra(ManageApplications.APP_CHG, appChanged); 808ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn PreferenceActivity pa = (PreferenceActivity)getActivity(); 809ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn pa.finishPreferencePanel(this, Activity.RESULT_OK, intent); 810afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 811afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 8120f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn private void refreshSizeInfo() { 8130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (mAppEntry.size == ApplicationsState.SIZE_INVALID 8140f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn || mAppEntry.size == ApplicationsState.SIZE_UNKNOWN) { 8150f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mLastCodeSize = mLastDataSize = mLastCacheSize = mLastTotalSize = -1; 8160f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (!mHaveSizes) { 8170f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mAppSize.setText(mComputingStr); 8180f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mDataSize.setText(mComputingStr); 8190f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mCacheSize.setText(mComputingStr); 8200f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mTotalSize.setText(mComputingStr); 8210f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 8220f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearDataButton.setEnabled(false); 8230f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearCacheButton.setEnabled(false); 8240f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 825afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 8260f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mHaveSizes = true; 8271f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn long codeSize = mAppEntry.codeSize; 8281f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn long dataSize = mAppEntry.dataSize; 8291f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if (Environment.isExternalStorageEmulated()) { 8301f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn codeSize += mAppEntry.externalCodeSize; 8311f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn dataSize += mAppEntry.externalDataSize; 8321f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn } else { 8331f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if (mLastExternalCodeSize != mAppEntry.externalCodeSize) { 8341f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mLastExternalCodeSize = mAppEntry.externalCodeSize; 8351f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mExternalCodeSize.setText(getSizeStr(mAppEntry.externalCodeSize)); 8361f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn } 8371f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if (mLastExternalDataSize != mAppEntry.externalDataSize) { 8381f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mLastExternalDataSize = mAppEntry.externalDataSize; 8391f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mExternalDataSize.setText(getSizeStr( mAppEntry.externalDataSize)); 8401f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn } 841afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 8421f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if (mLastCodeSize != codeSize) { 8431f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mLastCodeSize = codeSize; 8441f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mAppSize.setText(getSizeStr(codeSize)); 845bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn } 8461f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if (mLastDataSize != dataSize) { 8471f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mLastDataSize = dataSize; 8481f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mDataSize.setText(getSizeStr(dataSize)); 849424acfb7ad469efb0a51c69fc8713cc96e2357b0Kenny Root } 850313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn long cacheSize = mAppEntry.cacheSize + mAppEntry.externalCacheSize; 851313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn if (mLastCacheSize != cacheSize) { 852313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn mLastCacheSize = cacheSize; 853313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn mCacheSize.setText(getSizeStr(cacheSize)); 854afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 8550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (mLastTotalSize != mAppEntry.size) { 8560f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mLastTotalSize = mAppEntry.size; 8570f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mTotalSize.setText(getSizeStr(mAppEntry.size)); 858afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 8590f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 8601f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if ((mAppEntry.dataSize+ mAppEntry.externalDataSize) <= 0 || !mCanClearData) { 8610f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearDataButton.setEnabled(false); 8620f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } else { 8630f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearDataButton.setEnabled(true); 8640f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearDataButton.setOnClickListener(this); 8650f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 866313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn if (cacheSize <= 0) { 8670f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearCacheButton.setEnabled(false); 8680f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } else { 8690f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearCacheButton.setEnabled(true); 8700f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearCacheButton.setOnClickListener(this); 871afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 872afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 873afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 874afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 875afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 876afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to handle clear message notification from observer when 877afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * the async operation from PackageManager is complete 878afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 879afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void processClearMsg(Message msg) { 880afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int result = msg.arg1; 8810f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn String packageName = mAppEntry.info.packageName; 88242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.clear_user_data_text); 883afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(result == OP_SUCCESSFUL) { 88442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Log.i(TAG, "Cleared user data for package : "+packageName); 8850f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mState.requestSize(mAppEntry.info.packageName); 886afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 88742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(true); 888afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 8899db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn checkForceStop(); 890afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 891ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu 892de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu private void refreshButtons() { 893de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu if (!mMoveInProgress) { 894de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu initUninstallButtons(); 895de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu initDataButtons(); 896de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu initMoveButton(); 8974a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler initNotificationButton(); 898de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } else { 899de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mMoveAppButton.setText(R.string.moving); 900de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mMoveAppButton.setEnabled(false); 901de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mUninstallButton.setEnabled(false); 902de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } 903de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } 904de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu 905ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private void processMoveMsg(Message msg) { 906ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu int result = msg.arg1; 9070f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn String packageName = mAppEntry.info.packageName; 908de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu // Refresh the button attributes. 909de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mMoveInProgress = false; 9100f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (result == PackageManager.MOVE_SUCCEEDED) { 911ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu Log.i(TAG, "Moved resources for " + packageName); 912de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu // Refresh size information again. 9130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mState.requestSize(mAppEntry.info.packageName); 914ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } else { 915f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn showDialogInner(DLG_MOVE_FAILED, result); 916ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 9170f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn refreshUi(); 918ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 9195cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu 920afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 921afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to initiate clearing user data when the user clicks the clear data 922afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * button for a system package 923afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 92442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void initiateClearUserData() { 92542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(false); 92642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Invoke uninstall or clear user data based on sysPackage 9270f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn String packageName = mAppEntry.info.packageName; 92842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Log.i(TAG, "Clearing user data for package : " + packageName); 9290f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (mClearDataObserver == null) { 930afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearDataObserver = new ClearUserDataObserver(); 931afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 932f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn ActivityManager am = (ActivityManager) 933f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getActivity().getSystemService(Context.ACTIVITY_SERVICE); 934afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project boolean res = am.clearApplicationUserData(packageName, mClearDataObserver); 9350f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (!res) { 93650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Clearing data failed for some obscure reason. Just log error for now 937afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Log.i(TAG, "Couldnt clear application user data for package:"+packageName); 938f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn showDialogInner(DLG_CANNOT_CLEAR_DATA, 0); 939afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 94042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.recompute_size); 941afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 942afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 943afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 944f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn private void showDialogInner(int id, int moveErrorCode) { 945f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn DialogFragment newFragment = MyAlertDialogFragment.newInstance(id, moveErrorCode); 946f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn newFragment.setTargetFragment(this, 0); 947f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn newFragment.show(getFragmentManager(), "dialog " + id); 94850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 94950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 950f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public static class MyAlertDialogFragment extends DialogFragment { 951f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 952f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public static MyAlertDialogFragment newInstance(int id, int moveErrorCode) { 953f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn MyAlertDialogFragment frag = new MyAlertDialogFragment(); 954f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn Bundle args = new Bundle(); 955f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn args.putInt("id", id); 956f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn args.putInt("moveError", moveErrorCode); 957f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn frag.setArguments(args); 958f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return frag; 959f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 960f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 961f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn InstalledAppDetails getOwner() { 962f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return (InstalledAppDetails)getTargetFragment(); 963f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 964f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 965f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn @Override 966f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public Dialog onCreateDialog(Bundle savedInstanceState) { 967f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn int id = getArguments().getInt("id"); 968f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn int moveErrorCode = getArguments().getInt("moveError"); 969f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn switch (id) { 970f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn case DLG_CLEAR_DATA: 971f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return new AlertDialog.Builder(getActivity()) 972f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setTitle(getActivity().getText(R.string.clear_data_dlg_title)) 973e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 974f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setMessage(getActivity().getText(R.string.clear_data_dlg_text)) 975f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setPositiveButton(R.string.dlg_ok, 976f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn new DialogInterface.OnClickListener() { 977f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onClick(DialogInterface dialog, int which) { 978f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn // Clear user data here 979f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getOwner().initiateClearUserData(); 980f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 981f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn }) 982f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setNegativeButton(R.string.dlg_cancel, null) 983f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .create(); 984f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn case DLG_FACTORY_RESET: 985f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return new AlertDialog.Builder(getActivity()) 986f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setTitle(getActivity().getText(R.string.app_factory_reset_dlg_title)) 987e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 988f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setMessage(getActivity().getText(R.string.app_factory_reset_dlg_text)) 989f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setPositiveButton(R.string.dlg_ok, 990f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn new DialogInterface.OnClickListener() { 991f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onClick(DialogInterface dialog, int which) { 992f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn // Clear user data here 9933db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn getOwner().uninstallPkg(getOwner().mAppEntry.info.packageName, false); 994f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 995f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn }) 996f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setNegativeButton(R.string.dlg_cancel, null) 997f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .create(); 998f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn case DLG_APP_NOT_FOUND: 999f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return new AlertDialog.Builder(getActivity()) 1000f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setTitle(getActivity().getText(R.string.app_not_found_dlg_title)) 1001e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 1002f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setMessage(getActivity().getText(R.string.app_not_found_dlg_title)) 1003f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setNeutralButton(getActivity().getText(R.string.dlg_ok), 1004f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn new DialogInterface.OnClickListener() { 1005f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onClick(DialogInterface dialog, int which) { 1006f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn //force to recompute changed value 1007f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getOwner().setIntentAndFinish(true, true); 1008f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 1009f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn }) 1010f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .create(); 1011f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn case DLG_CANNOT_CLEAR_DATA: 1012f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return new AlertDialog.Builder(getActivity()) 1013f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setTitle(getActivity().getText(R.string.clear_failed_dlg_title)) 1014e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 1015f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setMessage(getActivity().getText(R.string.clear_failed_dlg_text)) 1016f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setNeutralButton(R.string.dlg_ok, 1017f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn new DialogInterface.OnClickListener() { 1018f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onClick(DialogInterface dialog, int which) { 1019f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getOwner().mClearDataButton.setEnabled(false); 1020f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn //force to recompute changed value 1021f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getOwner().setIntentAndFinish(false, false); 1022f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 1023f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn }) 1024f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .create(); 1025f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn case DLG_FORCE_STOP: 1026f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return new AlertDialog.Builder(getActivity()) 1027f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setTitle(getActivity().getText(R.string.force_stop_dlg_title)) 1028e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 1029f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setMessage(getActivity().getText(R.string.force_stop_dlg_text)) 1030f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setPositiveButton(R.string.dlg_ok, 1031f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn new DialogInterface.OnClickListener() { 1032f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onClick(DialogInterface dialog, int which) { 1033f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn // Force stop 1034f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getOwner().forceStopPackage(getOwner().mAppEntry.info.packageName); 1035f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 1036f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn }) 1037f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setNegativeButton(R.string.dlg_cancel, null) 1038f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .create(); 1039f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn case DLG_MOVE_FAILED: 1040f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn CharSequence msg = getActivity().getString(R.string.move_app_failed_dlg_text, 1041f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getOwner().getMoveErrMsg(moveErrorCode)); 1042f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return new AlertDialog.Builder(getActivity()) 1043f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setTitle(getActivity().getText(R.string.move_app_failed_dlg_title)) 1044e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 1045f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setMessage(msg) 1046f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setNeutralButton(R.string.dlg_ok, null) 1047f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .create(); 1048f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn case DLG_DISABLE: 1049f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn return new AlertDialog.Builder(getActivity()) 1050f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .setTitle(getActivity().getText(R.string.app_disable_dlg_title)) 1051e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 1052f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .setMessage(getActivity().getText(R.string.app_disable_dlg_text)) 1053f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .setPositiveButton(R.string.dlg_ok, 1054f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn new DialogInterface.OnClickListener() { 1055f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn public void onClick(DialogInterface dialog, int which) { 1056f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn // Disable the app 1057f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn new DisableChanger(getOwner(), getOwner().mAppEntry.info, 1058f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) 1059f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .execute((Object)null); 1060f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn } 1061f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn }) 1062f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .setNegativeButton(R.string.dlg_cancel, null) 1063f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .create(); 106470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler case DLG_DISABLE_NOTIFICATIONS: 106570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler return new AlertDialog.Builder(getActivity()) 106670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler .setTitle(getActivity().getText(R.string.app_disable_notifications_dlg_title)) 1067c8272b075275f81ddfb9cef2f92514b7ce3365deBjörn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 106870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler .setMessage(getActivity().getText(R.string.app_disable_notifications_dlg_text)) 106970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler .setPositiveButton(R.string.dlg_ok, 107070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler new DialogInterface.OnClickListener() { 107170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler public void onClick(DialogInterface dialog, int which) { 107270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler // Disable the package's notifications 107370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler getOwner().setNotificationsEnabled(false); 107470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } 107570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler }) 107670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler .setNegativeButton(R.string.dlg_cancel, 107770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler new DialogInterface.OnClickListener() { 107870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler public void onClick(DialogInterface dialog, int which) { 107970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler // Re-enable the checkbox 108070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler getOwner().mNotificationSwitch.setChecked(true); 108170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } 108270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler }) 108370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler .create(); 1084f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 1085f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn throw new IllegalArgumentException("unknown id " + id); 1086f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 108750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 108850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 10893db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn private void uninstallPkg(String packageName, boolean allUsers) { 109050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Create new intent to launch Uninstaller activity 109150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu Uri packageURI = Uri.parse("package:"+packageName); 10923db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageURI); 10933db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, allUsers); 10943db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn startActivityForResult(uninstallIntent, REQUEST_UNINSTALL); 109550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 109650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 109742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void forceStopPackage(String pkgName) { 1098f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn ActivityManager am = (ActivityManager)getActivity().getSystemService( 109942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Context.ACTIVITY_SERVICE); 110042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu am.forceStopPackage(pkgName); 1101c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn mState.invalidatePackage(pkgName); 1102c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn ApplicationsState.AppEntry newEnt = mState.getEntry(pkgName); 1103c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn if (newEnt != null) { 1104c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn mAppEntry = newEnt; 1105c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn } 1106cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn checkForceStop(); 110742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 110842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 1109cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() { 1110cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn @Override 1111cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn public void onReceive(Context context, Intent intent) { 1112861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn updateForceStopButton(getResultCode() != Activity.RESULT_CANCELED); 1113cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn } 1114cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn }; 1115861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn 1116861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn private void updateForceStopButton(boolean enabled) { 1117861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn mForceStopButton.setEnabled(enabled); 1118861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn mForceStopButton.setOnClickListener(InstalledAppDetails.this); 1119861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn } 1120cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn 1121cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn private void checkForceStop() { 11225c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 11235c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn // User can't force stop device admin. 11245c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn updateForceStopButton(false); 11255c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn } else if ((mAppEntry.info.flags&ApplicationInfo.FLAG_STOPPED) == 0) { 1126861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn // If the app isn't explicitly stopped, then always show the 1127861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn // force stop button. 1128861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn updateForceStopButton(true); 1129861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn } else { 11305c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART, 11315c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn Uri.fromParts("package", mAppEntry.info.packageName, null)); 11325c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName }); 11335c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid); 1134861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn getActivity().sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null, 1135861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn Activity.RESULT_CANCELED, null, null); 1136861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn } 1137cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn } 113870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler 11399db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn static class DisableChanger extends AsyncTask<Object, Object, Object> { 11409db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn final PackageManager mPm; 11419db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn final WeakReference<InstalledAppDetails> mActivity; 11429db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn final ApplicationInfo mInfo; 11439db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn final int mState; 11449db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn 11459db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn DisableChanger(InstalledAppDetails activity, ApplicationInfo info, int state) { 11469db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn mPm = activity.mPm; 11479db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn mActivity = new WeakReference<InstalledAppDetails>(activity); 11489db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn mInfo = info; 11499db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn mState = state; 11509db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 11519db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn 11529db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn @Override 11539db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn protected Object doInBackground(Object... params) { 11549db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn mPm.setApplicationEnabledSetting(mInfo.packageName, mState, 0); 11559db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn return null; 11569db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 11579db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 11589db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn 115970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler private void setNotificationsEnabled(boolean enabled) { 116070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler String packageName = mAppEntry.info.packageName; 116170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler INotificationManager nm = INotificationManager.Stub.asInterface( 116270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 116370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler try { 116470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler final boolean enable = mNotificationSwitch.isChecked(); 116570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler nm.setNotificationsEnabledForPackage(packageName, enabled); 116670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } catch (android.os.RemoteException ex) { 116770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler mNotificationSwitch.setChecked(!enabled); // revert 116870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } 116970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } 117070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler 11713465b67740e17711af2b36b09e2250a02275d860Jake Hamby private int getPremiumSmsPermission(String packageName) { 11723465b67740e17711af2b36b09e2250a02275d860Jake Hamby try { 11733465b67740e17711af2b36b09e2250a02275d860Jake Hamby if (mSmsManager != null) { 11743465b67740e17711af2b36b09e2250a02275d860Jake Hamby return mSmsManager.getPremiumSmsPermission(packageName); 11753465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 11763465b67740e17711af2b36b09e2250a02275d860Jake Hamby } catch (RemoteException ex) { 11773465b67740e17711af2b36b09e2250a02275d860Jake Hamby // ignored 11783465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 11793465b67740e17711af2b36b09e2250a02275d860Jake Hamby return SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN; 11803465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 11813465b67740e17711af2b36b09e2250a02275d860Jake Hamby 1182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 1183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Method implementing functionality of buttons clicked 1184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * @see android.view.View.OnClickListener#onClick(android.view.View) 1185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 1186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onClick(View v) { 11870f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn String packageName = mAppEntry.info.packageName; 118842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if(v == mUninstallButton) { 118942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (mUpdatedSysApp) { 1190f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn showDialogInner(DLG_FACTORY_RESET, 0); 119142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 11920f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 1193f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn if (mAppEntry.info.enabled) { 1194f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn showDialogInner(DLG_DISABLE, 0); 1195f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn } else { 1196f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn new DisableChanger(this, mAppEntry.info, 1197f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) 1198f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .execute((Object)null); 1199f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn } 12002e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_INSTALLED) == 0) { 12012e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn try { 12022e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn mPm.installExistingPackage(packageName); 12032e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn refreshUi(); 12042e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn } catch (NameNotFoundException e) { 12052e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn } 12069db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } else { 12073db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn uninstallPkg(packageName, false); 12089db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 1209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1210afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if(v == mActivitiesButton) { 1211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.clearPackagePreferredActivities(packageName); 12129d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood try { 12132715376cfa4d220f183623a5f35214d1bd537376Mike Lockwood mUsbManager.clearDefaults(packageName); 12149d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood } catch (RemoteException e) { 12159d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood Log.e(TAG, "mUsbManager.clearDefaults", e); 12169d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood } 1217c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka mAppWidgetManager.setBindAppWidgetPermission(packageName, false); 1218c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka TextView autoLaunchTitleView = 1219c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka (TextView) mRootView.findViewById(R.id.auto_launch_title); 1220c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka TextView autoLaunchView = (TextView) mRootView.findViewById(R.id.auto_launch); 1221c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka resetLaunchDefaultsUi(autoLaunchTitleView, autoLaunchView); 122242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else if(v == mClearDataButton) { 12230f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (mAppEntry.info.manageSpaceActivityName != null) { 12243fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani if (!Utils.isMonkeyRunning()) { 12253fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani Intent intent = new Intent(Intent.ACTION_DEFAULT); 12263fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani intent.setClassName(mAppEntry.info.packageName, 12273fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani mAppEntry.info.manageSpaceActivityName); 12283db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn startActivityForResult(intent, REQUEST_MANAGE_SPACE); 12293fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani } 123042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 1231f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn showDialogInner(DLG_CLEAR_DATA, 0); 123242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 1233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mClearCacheButton) { 1234afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Lazy initialization of observer 1235afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mClearCacheObserver == null) { 1236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheObserver = new ClearCacheObserver(); 1237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1238afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver); 1239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mForceStopButton) { 1240f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn showDialogInner(DLG_FORCE_STOP, 0); 12419db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn //forceStopPackage(mAppInfo.packageName); 1242ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } else if (v == mMoveAppButton) { 1243ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu if (mPackageMoveObserver == null) { 1244ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mPackageMoveObserver = new PackageMoveObserver(); 1245ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 12460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn int moveFlags = (mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0 ? 1247ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu PackageManager.MOVE_INTERNAL : PackageManager.MOVE_EXTERNAL_MEDIA; 1248de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mMoveInProgress = true; 1249de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu refreshButtons(); 12500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mPm.movePackage(mAppEntry.info.packageName, mPackageMoveObserver, moveFlags); 1251afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1252afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1253aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn 1254aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn @Override 1255aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 1256aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn String packageName = mAppEntry.info.packageName; 1257aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn ActivityManager am = (ActivityManager) 1258aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn getActivity().getSystemService(Context.ACTIVITY_SERVICE); 1259aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn if (buttonView == mAskCompatibilityCB) { 1260aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn am.setPackageAskScreenCompat(packageName, isChecked); 1261aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } else if (buttonView == mEnableCompatibilityCB) { 1262aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn am.setPackageScreenCompatMode(packageName, isChecked ? 1263aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn ActivityManager.COMPAT_MODE_ENABLED : ActivityManager.COMPAT_MODE_DISABLED); 12644a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler } else if (buttonView == mNotificationSwitch) { 126570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler if (!isChecked) { 126670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler showDialogInner(DLG_DISABLE_NOTIFICATIONS, 0); 126770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } else { 126870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler setNotificationsEnabled(true); 12694a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler } 1270aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } 1271aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } 1272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 1273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1274