InstalledAppDetails.java revision 3db54cb97630fe83342c2ca189d13ff5a1a598d3
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); 382b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 3833db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn setHasOptionsMenu(true); 3843db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 385f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mState = ApplicationsState.getInstance(getActivity().getApplication()); 386309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSession = mState.newSession(this); 387f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mPm = getActivity().getPackageManager(); 3883db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn mUserManager = (UserManager)getActivity().getSystemService(Context.USER_SERVICE); 3899d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood IBinder b = ServiceManager.getService(Context.USB_SERVICE); 3909d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood mUsbManager = IUsbManager.Stub.asInterface(b); 391c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka mAppWidgetManager = AppWidgetManager.getInstance(getActivity()); 3925c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn mDpm = (DevicePolicyManager)getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE); 3933465b67740e17711af2b36b09e2250a02275d860Jake Hamby mSmsManager = ISms.Stub.asInterface(ServiceManager.getService("isms")); 3949d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood 3956dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn mCanBeOnSdCardChecker = new CanBeOnSdCardChecker(); 396f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 397f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 398f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn @Override 399f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 400f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn View view = mRootView = inflater.inflate(R.layout.installed_app_details, null); 4016dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn 402f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mComputingStr = getActivity().getText(R.string.computing_size); 403b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 40450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Set default values on sizes 405f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mTotalSize = (TextView)view.findViewById(R.id.total_size_text); 406f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mAppSize = (TextView)view.findViewById(R.id.application_size_text); 407f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mDataSize = (TextView)view.findViewById(R.id.data_size_text); 408bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn mExternalCodeSize = (TextView)view.findViewById(R.id.external_code_size_text); 409bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn mExternalDataSize = (TextView)view.findViewById(R.id.external_data_size_text); 4101f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn 4111f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if (Environment.isExternalStorageEmulated()) { 4121f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn ((View)mExternalCodeSize.getParent()).setVisibility(View.GONE); 4131f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn ((View)mExternalDataSize.getParent()).setVisibility(View.GONE); 4141f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn } 4151f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn 41642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Get Control button panel 417f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn View btnPanel = view.findViewById(R.id.control_buttons_panel); 41842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mForceStopButton = (Button) btnPanel.findViewById(R.id.left_button); 41942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mForceStopButton.setText(R.string.force_stop); 42042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton = (Button)btnPanel.findViewById(R.id.right_button); 421cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn mForceStopButton.setEnabled(false); 422b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 42342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Initialize clear data and move install location buttons 424f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn View data_buttons_panel = view.findViewById(R.id.data_buttons_panel); 425313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn mClearDataButton = (Button) data_buttons_panel.findViewById(R.id.right_button); 426313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn mMoveAppButton = (Button) data_buttons_panel.findViewById(R.id.left_button); 427b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 4280f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn // Cache section 429f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mCacheSize = (TextView) view.findViewById(R.id.cache_size_text); 430f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mClearCacheButton = (Button) view.findViewById(R.id.clear_cache_button); 431f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 432f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mActivitiesButton = (Button)view.findViewById(R.id.clear_activities_button); 4330f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 434aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn // Screen compatibility control 435aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mScreenCompatSection = view.findViewById(R.id.screen_compatibility_section); 436aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mAskCompatibilityCB = (CheckBox)view.findViewById(R.id.ask_compatibility_cb); 437aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mEnableCompatibilityCB = (CheckBox)view.findViewById(R.id.enable_compatibility_cb); 4384a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler 43970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler mNotificationSwitch = (CompoundButton) view.findViewById(R.id.notification_switch); 440aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn 441f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return view; 442afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 443f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu 4443db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 4453db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 4463db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn menu.add(0, UNINSTALL_ALL_USERS_MENU, 1, R.string.uninstall_all_users_text) 4473db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 4483db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4493db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 4503db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 4513db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public void onPrepareOptionsMenu(Menu menu) { 4523db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn boolean showIt = true; 4533db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (mUpdatedSysApp) { 4543db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 4553db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 4563db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 4573db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 4583db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 4593db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if (UserHandle.myUserId() != 0) { 4603db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 4613db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if (mUserManager.getUsers().size() < 1) { 4623db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 4633db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4643db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn menu.findItem(UNINSTALL_ALL_USERS_MENU).setVisible(showIt); 4653db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4663db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 4673db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 4683db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public boolean onOptionsItemSelected(MenuItem item) { 4693db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn int menuId = item.getItemId(); 4703db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (menuId == UNINSTALL_ALL_USERS_MENU) { 4713db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn uninstallPkg(mAppEntry.info.packageName, true); 4723db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn return true; 4733db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4743db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn return false; 4753db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4763db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 4773db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 4783db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public void onActivityResult(int requestCode, int resultCode, Intent data) { 4793db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn super.onActivityResult(requestCode, resultCode, data); 4803db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (requestCode == REQUEST_UNINSTALL) { 4813db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (!refreshUi()) { 4823db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn setIntentAndFinish(true, true); 4833db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4843db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4853db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4863db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 48750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Utility method to set applicaiton label and icon. 488f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu private void setAppLabelAndIcon(PackageInfo pkgInfo) { 489f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn View appSnippet = mRootView.findViewById(R.id.app_snippet); 490f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon); 4910f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mState.ensureIcon(mAppEntry); 4920f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn icon.setImageDrawable(mAppEntry.icon); 493f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu // Set application name. 494f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu TextView label = (TextView) appSnippet.findViewById(R.id.app_name); 4950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn label.setText(mAppEntry.label); 49650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Version number of application 497f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu mAppVersion = (TextView) appSnippet.findViewById(R.id.app_size); 498f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu 499f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu if (pkgInfo != null && pkgInfo.versionName != null) { 50050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppVersion.setVisibility(View.VISIBLE); 501f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mAppVersion.setText(getActivity().getString(R.string.version_text, 5028e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes String.valueOf(pkgInfo.versionName))); 50350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } else { 504f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu mAppVersion.setVisibility(View.INVISIBLE); 50550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 50650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 50750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 50850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu @Override 50942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public void onResume() { 51042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu super.onResume(); 511b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 512309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSession.resume(); 5130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (!refreshUi()) { 514b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown setIntentAndFinish(true, true); 515b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown } 5160f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5170f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5180f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn @Override 5190f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn public void onPause() { 5200f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn super.onPause(); 521309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSession.pause(); 5220f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5230f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5240f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn @Override 5250f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn public void onAllSizesComputed() { 5260f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5270f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5280f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn @Override 5290f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn public void onPackageIconChanged() { 5300f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5310f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5320f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn @Override 5330f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn public void onPackageListChanged() { 5340f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn refreshUi(); 5350f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5360f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5370f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn @Override 53819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn public void onRebuildComplete(ArrayList<AppEntry> apps) { 53919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } 54019df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn 54119df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn @Override 5420f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn public void onPackageSizeChanged(String packageName) { 5430f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (packageName.equals(mAppEntry.info.packageName)) { 5440f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn refreshSizeInfo(); 5450f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5470f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5480f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn @Override 5490f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn public void onRunningStateChanged(boolean running) { 5500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5510f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5520f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn private boolean refreshUi() { 5530f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (mMoveInProgress) { 5540f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return true; 5550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5560c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy final Bundle args = getArguments(); 5570c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy String packageName = (args != null) ? args.getString(ARG_PACKAGE_NAME) : null; 558f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn if (packageName == null) { 5590c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy Intent intent = (args == null) ? 5600c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy getActivity().getIntent() : (Intent) args.getParcelable("intent"); 561f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn if (intent != null) { 562f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn packageName = intent.getData().getSchemeSpecificPart(); 563f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 564f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 5650f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mAppEntry = mState.getEntry(packageName); 5660f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5670f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (mAppEntry == null) { 5680f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return false; // onCreate must have failed, make sure to exit 569b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown } 570b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 57150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Get application info again to refresh changed properties of application 57250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu try { 5730f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mPackageInfo = mPm.getPackageInfo(mAppEntry.info.packageName, 5740f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn PackageManager.GET_DISABLED_COMPONENTS | 5750f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn PackageManager.GET_UNINSTALLED_PACKAGES | 5760f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn PackageManager.GET_SIGNATURES); 57750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } catch (NameNotFoundException e) { 5780f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn Log.e(TAG, "Exception when retrieving package:" + mAppEntry.info.packageName, e); 5790f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return false; // onCreate must have failed, make sure to exit 58050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 581b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 5820f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn // Get list of preferred activities 5830f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn List<ComponentName> prefActList = new ArrayList<ComponentName>(); 584b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 5850f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn // Intent list cannot be null. so pass empty list 5860f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn List<IntentFilter> intentList = new ArrayList<IntentFilter>(); 5870f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mPm.getPreferredActivities(intentList, prefActList, packageName); 588c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (localLOGV) 589c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka Log.i(TAG, "Have " + prefActList.size() + " number of activities in preferred list"); 5909d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood boolean hasUsbDefaults = false; 5919d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood try { 5922715376cfa4d220f183623a5f35214d1bd537376Mike Lockwood hasUsbDefaults = mUsbManager.hasDefaults(packageName); 5939d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood } catch (RemoteException e) { 5949d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood Log.e(TAG, "mUsbManager.hasDefaults", e); 5959d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood } 596c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka boolean hasBindAppWidgetPermission = 597c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka mAppWidgetManager.hasBindAppWidgetPermission(mAppEntry.info.packageName); 598c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka 599c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka TextView autoLaunchTitleView = (TextView) mRootView.findViewById(R.id.auto_launch_title); 600c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka TextView autoLaunchView = (TextView) mRootView.findViewById(R.id.auto_launch); 601c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka boolean autoLaunchEnabled = prefActList.size() > 0 || hasUsbDefaults; 602c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (!autoLaunchEnabled && !hasBindAppWidgetPermission) { 603c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka resetLaunchDefaultsUi(autoLaunchTitleView, autoLaunchView); 6040f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } else { 605c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka boolean useBullets = hasBindAppWidgetPermission && autoLaunchEnabled; 606c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka 607c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (hasBindAppWidgetPermission) { 608c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka autoLaunchTitleView.setText(R.string.auto_launch_label_generic); 609c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } else { 610c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka autoLaunchTitleView.setText(R.string.auto_launch_label); 611c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } 612c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka 613c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka CharSequence text = null; 614c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka int bulletIndent = getResources() 615c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka .getDimensionPixelSize(R.dimen.installed_app_details_bullet_offset); 616c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (autoLaunchEnabled) { 617c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka CharSequence autoLaunchEnableText = getText(R.string.auto_launch_enable_text); 618c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka SpannableString s = new SpannableString(autoLaunchEnableText); 619c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (useBullets) { 620c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka s.setSpan(new BulletSpan(bulletIndent), 0, autoLaunchEnableText.length(), 0); 621c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } 622c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka text = (text == null) ? 623c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka TextUtils.concat(s, "\n") : TextUtils.concat(text, "\n", s, "\n"); 624c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } 625c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (hasBindAppWidgetPermission) { 626c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka CharSequence alwaysAllowBindAppWidgetsText = 627c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka getText(R.string.always_allow_bind_appwidgets_text); 628c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka SpannableString s = new SpannableString(alwaysAllowBindAppWidgetsText); 629c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (useBullets) { 630c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka s.setSpan(new BulletSpan(bulletIndent), 631c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka 0, alwaysAllowBindAppWidgetsText.length(), 0); 632c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } 633c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka text = (text == null) ? 634c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka TextUtils.concat(s, "\n") : TextUtils.concat(text, "\n", s, "\n"); 635c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } 636c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka autoLaunchView.setText(text); 6370f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mActivitiesButton.setEnabled(true); 6380f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mActivitiesButton.setOnClickListener(this); 6390f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 640aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn 641aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn // Screen compatibility section. 642aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn ActivityManager am = (ActivityManager) 643aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn getActivity().getSystemService(Context.ACTIVITY_SERVICE); 644aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn int compatMode = am.getPackageScreenCompatMode(packageName); 64513bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn // For now these are always off; this is the old UI model which we 64613bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn // are no longer using. 64713bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn if (false && (compatMode == ActivityManager.COMPAT_MODE_DISABLED 64813bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn || compatMode == ActivityManager.COMPAT_MODE_ENABLED)) { 649aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mScreenCompatSection.setVisibility(View.VISIBLE); 650aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mAskCompatibilityCB.setChecked(am.getPackageAskScreenCompat(packageName)); 651aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mAskCompatibilityCB.setOnCheckedChangeListener(this); 652aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mEnableCompatibilityCB.setChecked(compatMode == ActivityManager.COMPAT_MODE_ENABLED); 653aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mEnableCompatibilityCB.setOnCheckedChangeListener(this); 654aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } else { 655aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mScreenCompatSection.setVisibility(View.GONE); 656aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } 657aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn 6580f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn // Security permissions section 659f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn LinearLayout permsView = (LinearLayout) mRootView.findViewById(R.id.permissions_section); 660f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn AppSecurityPermissions asp = new AppSecurityPermissions(getActivity(), packageName); 6613465b67740e17711af2b36b09e2250a02275d860Jake Hamby int premiumSmsPermission = getPremiumSmsPermission(packageName); 6623465b67740e17711af2b36b09e2250a02275d860Jake Hamby // Premium SMS permission implies the app also has SEND_SMS permission, so the original 6633465b67740e17711af2b36b09e2250a02275d860Jake Hamby // application permissions list doesn't have to be shown/hidden separately. The premium 6643465b67740e17711af2b36b09e2250a02275d860Jake Hamby // SMS subsection should only be visible if the app has tried to send to a premium SMS. 6653465b67740e17711af2b36b09e2250a02275d860Jake Hamby if (asp.getPermissionCount() > 0 6663465b67740e17711af2b36b09e2250a02275d860Jake Hamby || premiumSmsPermission != SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN) { 6670f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn permsView.setVisibility(View.VISIBLE); 6683465b67740e17711af2b36b09e2250a02275d860Jake Hamby } else { 6693465b67740e17711af2b36b09e2250a02275d860Jake Hamby permsView.setVisibility(View.GONE); 6703465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 6713465b67740e17711af2b36b09e2250a02275d860Jake Hamby // Premium SMS permission subsection 6723465b67740e17711af2b36b09e2250a02275d860Jake Hamby TextView securityBillingDesc = (TextView) permsView.findViewById( 6733465b67740e17711af2b36b09e2250a02275d860Jake Hamby R.id.security_settings_billing_desc); 6743465b67740e17711af2b36b09e2250a02275d860Jake Hamby LinearLayout securityBillingList = (LinearLayout) permsView.findViewById( 6753465b67740e17711af2b36b09e2250a02275d860Jake Hamby R.id.security_settings_billing_list); 6763465b67740e17711af2b36b09e2250a02275d860Jake Hamby if (premiumSmsPermission != SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN) { 6773465b67740e17711af2b36b09e2250a02275d860Jake Hamby // Show the premium SMS permission selector 6783465b67740e17711af2b36b09e2250a02275d860Jake Hamby securityBillingDesc.setVisibility(View.VISIBLE); 6793465b67740e17711af2b36b09e2250a02275d860Jake Hamby securityBillingList.setVisibility(View.VISIBLE); 6803465b67740e17711af2b36b09e2250a02275d860Jake Hamby Spinner spinner = (Spinner) permsView.findViewById( 6813465b67740e17711af2b36b09e2250a02275d860Jake Hamby R.id.security_settings_premium_sms_list); 6823465b67740e17711af2b36b09e2250a02275d860Jake Hamby ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), 6833465b67740e17711af2b36b09e2250a02275d860Jake Hamby R.array.security_settings_premium_sms_values, 6843465b67740e17711af2b36b09e2250a02275d860Jake Hamby android.R.layout.simple_spinner_item); 6853465b67740e17711af2b36b09e2250a02275d860Jake Hamby adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 6863465b67740e17711af2b36b09e2250a02275d860Jake Hamby spinner.setAdapter(adapter); 6873465b67740e17711af2b36b09e2250a02275d860Jake Hamby // List items are in the same order as SmsUsageMonitor constants, offset by 1. 6883465b67740e17711af2b36b09e2250a02275d860Jake Hamby spinner.setSelection(premiumSmsPermission - 1); 6893465b67740e17711af2b36b09e2250a02275d860Jake Hamby spinner.setOnItemSelectedListener(new PremiumSmsSelectionListener( 6903465b67740e17711af2b36b09e2250a02275d860Jake Hamby packageName, mSmsManager)); 6913465b67740e17711af2b36b09e2250a02275d860Jake Hamby } else { 6923465b67740e17711af2b36b09e2250a02275d860Jake Hamby // Hide the premium SMS permission selector 6933465b67740e17711af2b36b09e2250a02275d860Jake Hamby securityBillingDesc.setVisibility(View.GONE); 6943465b67740e17711af2b36b09e2250a02275d860Jake Hamby securityBillingList.setVisibility(View.GONE); 6953465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 6963465b67740e17711af2b36b09e2250a02275d860Jake Hamby // App permissions subsection 6973465b67740e17711af2b36b09e2250a02275d860Jake Hamby if (asp.getPermissionCount() > 0) { 6980f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn // Make the security sections header visible 6990f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn LinearLayout securityList = (LinearLayout) permsView.findViewById( 7000f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn R.id.security_settings_list); 7010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn securityList.removeAllViews(); 7020f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn securityList.addView(asp.getPermissionsView()); 703e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn // If this app is running under a shared user ID with other apps, 704e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn // update the description to explain this. 705e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn String[] packages = mPm.getPackagesForUid(mPackageInfo.applicationInfo.uid); 706e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn if (packages != null && packages.length > 1) { 707e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn ArrayList<CharSequence> pnames = new ArrayList<CharSequence>(); 708e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn for (int i=0; i<packages.length; i++) { 709e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn String pkg = packages[i]; 710e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn if (mPackageInfo.packageName.equals(pkg)) { 711e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn continue; 712e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 713e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn try { 714e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn ApplicationInfo ainfo = mPm.getApplicationInfo(pkg, 0); 715e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn pnames.add(ainfo.loadLabel(mPm)); 716e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } catch (PackageManager.NameNotFoundException e) { 717e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 718e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 719e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn final int N = pnames.size(); 720e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn if (N > 0) { 721e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn final Resources res = getActivity().getResources(); 722e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn String appListStr; 723e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn if (N == 1) { 724e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn appListStr = pnames.get(0).toString(); 725e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } else if (N == 2) { 726e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn appListStr = res.getString(R.string.join_two_items, pnames.get(0), 727e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn pnames.get(1)); 728e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } else { 729e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn appListStr = pnames.get(N-2).toString(); 730e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn for (int i=N-3; i>=0; i--) { 731e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn appListStr = res.getString(i == 0 ? R.string.join_many_items_first 732e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn : R.string.join_many_items_middle, pnames.get(i), appListStr); 733e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 734e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn appListStr = res.getString(R.string.join_many_items_last, 735e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn appListStr, pnames.get(N-1)); 736e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 737e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn TextView descr = (TextView) mRootView.findViewById( 738e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn R.id.security_settings_desc); 739e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn descr.setText(res.getString(R.string.security_settings_desc_multi, 740e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn mPackageInfo.applicationInfo.loadLabel(mPm), appListStr)); 741e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 742e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 743de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } 7440f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 7450f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn checkForceStop(); 7460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn setAppLabelAndIcon(mPackageInfo); 7470f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn refreshButtons(); 7480f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn refreshSizeInfo(); 7490f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return true; 750afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 7513465b67740e17711af2b36b09e2250a02275d860Jake Hamby 7523465b67740e17711af2b36b09e2250a02275d860Jake Hamby private static class PremiumSmsSelectionListener implements AdapterView.OnItemSelectedListener { 7533465b67740e17711af2b36b09e2250a02275d860Jake Hamby private final String mPackageName; 7543465b67740e17711af2b36b09e2250a02275d860Jake Hamby private final ISms mSmsManager; 7553465b67740e17711af2b36b09e2250a02275d860Jake Hamby 7563465b67740e17711af2b36b09e2250a02275d860Jake Hamby PremiumSmsSelectionListener(String packageName, ISms smsManager) { 7573465b67740e17711af2b36b09e2250a02275d860Jake Hamby mPackageName = packageName; 7583465b67740e17711af2b36b09e2250a02275d860Jake Hamby mSmsManager = smsManager; 7593465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 7603465b67740e17711af2b36b09e2250a02275d860Jake Hamby 7613465b67740e17711af2b36b09e2250a02275d860Jake Hamby @Override 7623465b67740e17711af2b36b09e2250a02275d860Jake Hamby public void onItemSelected(AdapterView<?> parent, View view, int position, 7633465b67740e17711af2b36b09e2250a02275d860Jake Hamby long id) { 7643465b67740e17711af2b36b09e2250a02275d860Jake Hamby if (position >= 0 && position < 3) { 7653465b67740e17711af2b36b09e2250a02275d860Jake Hamby Log.d(TAG, "Selected premium SMS policy " + position); 7663465b67740e17711af2b36b09e2250a02275d860Jake Hamby setPremiumSmsPermission(mPackageName, (position + 1)); 7673465b67740e17711af2b36b09e2250a02275d860Jake Hamby } else { 7683465b67740e17711af2b36b09e2250a02275d860Jake Hamby Log.e(TAG, "Error: unknown premium SMS policy " + position); 7693465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 7703465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 7713465b67740e17711af2b36b09e2250a02275d860Jake Hamby 7723465b67740e17711af2b36b09e2250a02275d860Jake Hamby @Override 7733465b67740e17711af2b36b09e2250a02275d860Jake Hamby public void onNothingSelected(AdapterView<?> parent) { 7743465b67740e17711af2b36b09e2250a02275d860Jake Hamby // Ignored 7753465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 7763465b67740e17711af2b36b09e2250a02275d860Jake Hamby 7773465b67740e17711af2b36b09e2250a02275d860Jake Hamby private void setPremiumSmsPermission(String packageName, int permission) { 7783465b67740e17711af2b36b09e2250a02275d860Jake Hamby try { 7793465b67740e17711af2b36b09e2250a02275d860Jake Hamby if (mSmsManager != null) { 7803465b67740e17711af2b36b09e2250a02275d860Jake Hamby mSmsManager.setPremiumSmsPermission(packageName, permission); 7813465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 7823465b67740e17711af2b36b09e2250a02275d860Jake Hamby } catch (RemoteException ex) { 7833465b67740e17711af2b36b09e2250a02275d860Jake Hamby // ignored 7843465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 7853465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 7863465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 7870f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 788c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka private void resetLaunchDefaultsUi(TextView title, TextView autoLaunchView) { 789c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka title.setText(R.string.auto_launch_label); 790c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka autoLaunchView.setText(R.string.auto_launch_disable_text); 791c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka // Disable clear activities button 792c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka mActivitiesButton.setEnabled(false); 793c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } 794c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka 795afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void setIntentAndFinish(boolean finish, boolean appChanged) { 796afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(localLOGV) Log.i(TAG, "appChanged="+appChanged); 797afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Intent intent = new Intent(); 798afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project intent.putExtra(ManageApplications.APP_CHG, appChanged); 799ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn PreferenceActivity pa = (PreferenceActivity)getActivity(); 800ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn pa.finishPreferencePanel(this, Activity.RESULT_OK, intent); 801afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 802afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 8030f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn private void refreshSizeInfo() { 8040f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (mAppEntry.size == ApplicationsState.SIZE_INVALID 8050f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn || mAppEntry.size == ApplicationsState.SIZE_UNKNOWN) { 8060f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mLastCodeSize = mLastDataSize = mLastCacheSize = mLastTotalSize = -1; 8070f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (!mHaveSizes) { 8080f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mAppSize.setText(mComputingStr); 8090f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mDataSize.setText(mComputingStr); 8100f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mCacheSize.setText(mComputingStr); 8110f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mTotalSize.setText(mComputingStr); 8120f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 8130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearDataButton.setEnabled(false); 8140f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearCacheButton.setEnabled(false); 8150f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 816afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 8170f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mHaveSizes = true; 8181f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn long codeSize = mAppEntry.codeSize; 8191f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn long dataSize = mAppEntry.dataSize; 8201f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if (Environment.isExternalStorageEmulated()) { 8211f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn codeSize += mAppEntry.externalCodeSize; 8221f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn dataSize += mAppEntry.externalDataSize; 8231f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn } else { 8241f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if (mLastExternalCodeSize != mAppEntry.externalCodeSize) { 8251f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mLastExternalCodeSize = mAppEntry.externalCodeSize; 8261f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mExternalCodeSize.setText(getSizeStr(mAppEntry.externalCodeSize)); 8271f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn } 8281f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if (mLastExternalDataSize != mAppEntry.externalDataSize) { 8291f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mLastExternalDataSize = mAppEntry.externalDataSize; 8301f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mExternalDataSize.setText(getSizeStr( mAppEntry.externalDataSize)); 8311f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn } 832afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 8331f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if (mLastCodeSize != codeSize) { 8341f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mLastCodeSize = codeSize; 8351f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mAppSize.setText(getSizeStr(codeSize)); 836bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn } 8371f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if (mLastDataSize != dataSize) { 8381f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mLastDataSize = dataSize; 8391f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mDataSize.setText(getSizeStr(dataSize)); 840424acfb7ad469efb0a51c69fc8713cc96e2357b0Kenny Root } 841313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn long cacheSize = mAppEntry.cacheSize + mAppEntry.externalCacheSize; 842313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn if (mLastCacheSize != cacheSize) { 843313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn mLastCacheSize = cacheSize; 844313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn mCacheSize.setText(getSizeStr(cacheSize)); 845afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 8460f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (mLastTotalSize != mAppEntry.size) { 8470f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mLastTotalSize = mAppEntry.size; 8480f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mTotalSize.setText(getSizeStr(mAppEntry.size)); 849afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 8500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 8511f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if ((mAppEntry.dataSize+ mAppEntry.externalDataSize) <= 0 || !mCanClearData) { 8520f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearDataButton.setEnabled(false); 8530f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } else { 8540f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearDataButton.setEnabled(true); 8550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearDataButton.setOnClickListener(this); 8560f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 857313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn if (cacheSize <= 0) { 8580f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearCacheButton.setEnabled(false); 8590f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } else { 8600f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearCacheButton.setEnabled(true); 8610f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearCacheButton.setOnClickListener(this); 862afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 863afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 864afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 865afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 866afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 867afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to handle clear message notification from observer when 868afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * the async operation from PackageManager is complete 869afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 870afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void processClearMsg(Message msg) { 871afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int result = msg.arg1; 8720f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn String packageName = mAppEntry.info.packageName; 87342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.clear_user_data_text); 874afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(result == OP_SUCCESSFUL) { 87542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Log.i(TAG, "Cleared user data for package : "+packageName); 8760f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mState.requestSize(mAppEntry.info.packageName); 877afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 87842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(true); 879afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 8809db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn checkForceStop(); 881afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 882ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu 883de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu private void refreshButtons() { 884de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu if (!mMoveInProgress) { 885de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu initUninstallButtons(); 886de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu initDataButtons(); 887de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu initMoveButton(); 8884a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler initNotificationButton(); 889de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } else { 890de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mMoveAppButton.setText(R.string.moving); 891de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mMoveAppButton.setEnabled(false); 892de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mUninstallButton.setEnabled(false); 893de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } 894de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } 895de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu 896ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private void processMoveMsg(Message msg) { 897ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu int result = msg.arg1; 8980f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn String packageName = mAppEntry.info.packageName; 899de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu // Refresh the button attributes. 900de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mMoveInProgress = false; 9010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (result == PackageManager.MOVE_SUCCEEDED) { 902ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu Log.i(TAG, "Moved resources for " + packageName); 903de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu // Refresh size information again. 9040f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mState.requestSize(mAppEntry.info.packageName); 905ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } else { 906f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn showDialogInner(DLG_MOVE_FAILED, result); 907ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 9080f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn refreshUi(); 909ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 9105cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu 911afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 912afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to initiate clearing user data when the user clicks the clear data 913afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * button for a system package 914afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 91542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void initiateClearUserData() { 91642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(false); 91742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Invoke uninstall or clear user data based on sysPackage 9180f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn String packageName = mAppEntry.info.packageName; 91942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Log.i(TAG, "Clearing user data for package : " + packageName); 9200f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (mClearDataObserver == null) { 921afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearDataObserver = new ClearUserDataObserver(); 922afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 923f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn ActivityManager am = (ActivityManager) 924f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getActivity().getSystemService(Context.ACTIVITY_SERVICE); 925afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project boolean res = am.clearApplicationUserData(packageName, mClearDataObserver); 9260f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (!res) { 92750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Clearing data failed for some obscure reason. Just log error for now 928afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Log.i(TAG, "Couldnt clear application user data for package:"+packageName); 929f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn showDialogInner(DLG_CANNOT_CLEAR_DATA, 0); 930afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 93142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.recompute_size); 932afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 933afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 934afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 935f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn private void showDialogInner(int id, int moveErrorCode) { 936f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn DialogFragment newFragment = MyAlertDialogFragment.newInstance(id, moveErrorCode); 937f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn newFragment.setTargetFragment(this, 0); 938f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn newFragment.show(getFragmentManager(), "dialog " + id); 93950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 94050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 941f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public static class MyAlertDialogFragment extends DialogFragment { 942f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 943f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public static MyAlertDialogFragment newInstance(int id, int moveErrorCode) { 944f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn MyAlertDialogFragment frag = new MyAlertDialogFragment(); 945f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn Bundle args = new Bundle(); 946f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn args.putInt("id", id); 947f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn args.putInt("moveError", moveErrorCode); 948f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn frag.setArguments(args); 949f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return frag; 950f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 951f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 952f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn InstalledAppDetails getOwner() { 953f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return (InstalledAppDetails)getTargetFragment(); 954f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 955f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 956f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn @Override 957f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public Dialog onCreateDialog(Bundle savedInstanceState) { 958f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn int id = getArguments().getInt("id"); 959f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn int moveErrorCode = getArguments().getInt("moveError"); 960f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn switch (id) { 961f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn case DLG_CLEAR_DATA: 962f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return new AlertDialog.Builder(getActivity()) 963f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setTitle(getActivity().getText(R.string.clear_data_dlg_title)) 964e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 965f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setMessage(getActivity().getText(R.string.clear_data_dlg_text)) 966f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setPositiveButton(R.string.dlg_ok, 967f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn new DialogInterface.OnClickListener() { 968f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onClick(DialogInterface dialog, int which) { 969f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn // Clear user data here 970f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getOwner().initiateClearUserData(); 971f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 972f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn }) 973f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setNegativeButton(R.string.dlg_cancel, null) 974f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .create(); 975f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn case DLG_FACTORY_RESET: 976f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return new AlertDialog.Builder(getActivity()) 977f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setTitle(getActivity().getText(R.string.app_factory_reset_dlg_title)) 978e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 979f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setMessage(getActivity().getText(R.string.app_factory_reset_dlg_text)) 980f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setPositiveButton(R.string.dlg_ok, 981f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn new DialogInterface.OnClickListener() { 982f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onClick(DialogInterface dialog, int which) { 983f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn // Clear user data here 9843db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn getOwner().uninstallPkg(getOwner().mAppEntry.info.packageName, false); 985f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 986f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn }) 987f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setNegativeButton(R.string.dlg_cancel, null) 988f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .create(); 989f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn case DLG_APP_NOT_FOUND: 990f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return new AlertDialog.Builder(getActivity()) 991f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setTitle(getActivity().getText(R.string.app_not_found_dlg_title)) 992e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 993f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setMessage(getActivity().getText(R.string.app_not_found_dlg_title)) 994f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setNeutralButton(getActivity().getText(R.string.dlg_ok), 995f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn new DialogInterface.OnClickListener() { 996f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onClick(DialogInterface dialog, int which) { 997f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn //force to recompute changed value 998f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getOwner().setIntentAndFinish(true, true); 999f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 1000f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn }) 1001f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .create(); 1002f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn case DLG_CANNOT_CLEAR_DATA: 1003f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return new AlertDialog.Builder(getActivity()) 1004f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setTitle(getActivity().getText(R.string.clear_failed_dlg_title)) 1005e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 1006f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setMessage(getActivity().getText(R.string.clear_failed_dlg_text)) 1007f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setNeutralButton(R.string.dlg_ok, 1008f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn new DialogInterface.OnClickListener() { 1009f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onClick(DialogInterface dialog, int which) { 1010f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getOwner().mClearDataButton.setEnabled(false); 1011f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn //force to recompute changed value 1012f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getOwner().setIntentAndFinish(false, false); 1013f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 1014f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn }) 1015f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .create(); 1016f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn case DLG_FORCE_STOP: 1017f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return new AlertDialog.Builder(getActivity()) 1018f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setTitle(getActivity().getText(R.string.force_stop_dlg_title)) 1019e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 1020f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setMessage(getActivity().getText(R.string.force_stop_dlg_text)) 1021f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setPositiveButton(R.string.dlg_ok, 1022f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn new DialogInterface.OnClickListener() { 1023f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onClick(DialogInterface dialog, int which) { 1024f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn // Force stop 1025f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getOwner().forceStopPackage(getOwner().mAppEntry.info.packageName); 1026f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 1027f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn }) 1028f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setNegativeButton(R.string.dlg_cancel, null) 1029f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .create(); 1030f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn case DLG_MOVE_FAILED: 1031f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn CharSequence msg = getActivity().getString(R.string.move_app_failed_dlg_text, 1032f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getOwner().getMoveErrMsg(moveErrorCode)); 1033f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return new AlertDialog.Builder(getActivity()) 1034f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setTitle(getActivity().getText(R.string.move_app_failed_dlg_title)) 1035e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 1036f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setMessage(msg) 1037f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setNeutralButton(R.string.dlg_ok, null) 1038f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .create(); 1039f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn case DLG_DISABLE: 1040f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn return new AlertDialog.Builder(getActivity()) 1041f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .setTitle(getActivity().getText(R.string.app_disable_dlg_title)) 1042e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 1043f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .setMessage(getActivity().getText(R.string.app_disable_dlg_text)) 1044f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .setPositiveButton(R.string.dlg_ok, 1045f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn new DialogInterface.OnClickListener() { 1046f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn public void onClick(DialogInterface dialog, int which) { 1047f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn // Disable the app 1048f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn new DisableChanger(getOwner(), getOwner().mAppEntry.info, 1049f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) 1050f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .execute((Object)null); 1051f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn } 1052f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn }) 1053f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .setNegativeButton(R.string.dlg_cancel, null) 1054f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .create(); 105570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler case DLG_DISABLE_NOTIFICATIONS: 105670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler return new AlertDialog.Builder(getActivity()) 105770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler .setTitle(getActivity().getText(R.string.app_disable_notifications_dlg_title)) 1058c8272b075275f81ddfb9cef2f92514b7ce3365deBjörn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 105970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler .setMessage(getActivity().getText(R.string.app_disable_notifications_dlg_text)) 106070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler .setPositiveButton(R.string.dlg_ok, 106170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler new DialogInterface.OnClickListener() { 106270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler public void onClick(DialogInterface dialog, int which) { 106370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler // Disable the package's notifications 106470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler getOwner().setNotificationsEnabled(false); 106570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } 106670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler }) 106770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler .setNegativeButton(R.string.dlg_cancel, 106870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler new DialogInterface.OnClickListener() { 106970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler public void onClick(DialogInterface dialog, int which) { 107070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler // Re-enable the checkbox 107170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler getOwner().mNotificationSwitch.setChecked(true); 107270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } 107370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler }) 107470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler .create(); 1075f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 1076f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn throw new IllegalArgumentException("unknown id " + id); 1077f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 107850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 107950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 10803db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn private void uninstallPkg(String packageName, boolean allUsers) { 108150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Create new intent to launch Uninstaller activity 108250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu Uri packageURI = Uri.parse("package:"+packageName); 10833db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageURI); 10843db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, allUsers); 10853db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn startActivityForResult(uninstallIntent, REQUEST_UNINSTALL); 108650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 108750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 108842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void forceStopPackage(String pkgName) { 1089f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn ActivityManager am = (ActivityManager)getActivity().getSystemService( 109042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Context.ACTIVITY_SERVICE); 109142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu am.forceStopPackage(pkgName); 1092c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn mState.invalidatePackage(pkgName); 1093c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn ApplicationsState.AppEntry newEnt = mState.getEntry(pkgName); 1094c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn if (newEnt != null) { 1095c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn mAppEntry = newEnt; 1096c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn } 1097cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn checkForceStop(); 109842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 109942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 1100cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() { 1101cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn @Override 1102cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn public void onReceive(Context context, Intent intent) { 1103861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn updateForceStopButton(getResultCode() != Activity.RESULT_CANCELED); 1104cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn } 1105cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn }; 1106861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn 1107861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn private void updateForceStopButton(boolean enabled) { 1108861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn mForceStopButton.setEnabled(enabled); 1109861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn mForceStopButton.setOnClickListener(InstalledAppDetails.this); 1110861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn } 1111cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn 1112cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn private void checkForceStop() { 11135c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 11145c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn // User can't force stop device admin. 11155c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn updateForceStopButton(false); 11165c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn } else if ((mAppEntry.info.flags&ApplicationInfo.FLAG_STOPPED) == 0) { 1117861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn // If the app isn't explicitly stopped, then always show the 1118861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn // force stop button. 1119861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn updateForceStopButton(true); 1120861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn } else { 11215c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART, 11225c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn Uri.fromParts("package", mAppEntry.info.packageName, null)); 11235c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName }); 11245c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid); 1125861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn getActivity().sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null, 1126861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn Activity.RESULT_CANCELED, null, null); 1127861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn } 1128cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn } 112970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler 11309db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn static class DisableChanger extends AsyncTask<Object, Object, Object> { 11319db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn final PackageManager mPm; 11329db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn final WeakReference<InstalledAppDetails> mActivity; 11339db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn final ApplicationInfo mInfo; 11349db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn final int mState; 11359db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn 11369db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn DisableChanger(InstalledAppDetails activity, ApplicationInfo info, int state) { 11379db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn mPm = activity.mPm; 11389db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn mActivity = new WeakReference<InstalledAppDetails>(activity); 11399db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn mInfo = info; 11409db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn mState = state; 11419db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 11429db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn 11439db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn @Override 11449db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn protected Object doInBackground(Object... params) { 11459db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn mPm.setApplicationEnabledSetting(mInfo.packageName, mState, 0); 11469db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn return null; 11479db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 11489db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 11499db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn 115070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler private void setNotificationsEnabled(boolean enabled) { 115170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler String packageName = mAppEntry.info.packageName; 115270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler INotificationManager nm = INotificationManager.Stub.asInterface( 115370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 115470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler try { 115570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler final boolean enable = mNotificationSwitch.isChecked(); 115670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler nm.setNotificationsEnabledForPackage(packageName, enabled); 115770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } catch (android.os.RemoteException ex) { 115870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler mNotificationSwitch.setChecked(!enabled); // revert 115970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } 116070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } 116170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler 11623465b67740e17711af2b36b09e2250a02275d860Jake Hamby private int getPremiumSmsPermission(String packageName) { 11633465b67740e17711af2b36b09e2250a02275d860Jake Hamby try { 11643465b67740e17711af2b36b09e2250a02275d860Jake Hamby if (mSmsManager != null) { 11653465b67740e17711af2b36b09e2250a02275d860Jake Hamby return mSmsManager.getPremiumSmsPermission(packageName); 11663465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 11673465b67740e17711af2b36b09e2250a02275d860Jake Hamby } catch (RemoteException ex) { 11683465b67740e17711af2b36b09e2250a02275d860Jake Hamby // ignored 11693465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 11703465b67740e17711af2b36b09e2250a02275d860Jake Hamby return SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN; 11713465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 11723465b67740e17711af2b36b09e2250a02275d860Jake Hamby 1173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 1174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Method implementing functionality of buttons clicked 1175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * @see android.view.View.OnClickListener#onClick(android.view.View) 1176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 1177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onClick(View v) { 11780f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn String packageName = mAppEntry.info.packageName; 117942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if(v == mUninstallButton) { 118042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (mUpdatedSysApp) { 1181f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn showDialogInner(DLG_FACTORY_RESET, 0); 118242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 11830f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 1184f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn if (mAppEntry.info.enabled) { 1185f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn showDialogInner(DLG_DISABLE, 0); 1186f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn } else { 1187f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn new DisableChanger(this, mAppEntry.info, 1188f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) 1189f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .execute((Object)null); 1190f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn } 11912e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_INSTALLED) == 0) { 11922e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn try { 11932e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn mPm.installExistingPackage(packageName); 11942e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn refreshUi(); 11952e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn } catch (NameNotFoundException e) { 11962e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn } 11979db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } else { 11983db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn uninstallPkg(packageName, false); 11999db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 1200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if(v == mActivitiesButton) { 1202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.clearPackagePreferredActivities(packageName); 12039d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood try { 12042715376cfa4d220f183623a5f35214d1bd537376Mike Lockwood mUsbManager.clearDefaults(packageName); 12059d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood } catch (RemoteException e) { 12069d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood Log.e(TAG, "mUsbManager.clearDefaults", e); 12079d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood } 1208c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka mAppWidgetManager.setBindAppWidgetPermission(packageName, false); 1209c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka TextView autoLaunchTitleView = 1210c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka (TextView) mRootView.findViewById(R.id.auto_launch_title); 1211c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka TextView autoLaunchView = (TextView) mRootView.findViewById(R.id.auto_launch); 1212c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka resetLaunchDefaultsUi(autoLaunchTitleView, autoLaunchView); 121342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else if(v == mClearDataButton) { 12140f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (mAppEntry.info.manageSpaceActivityName != null) { 12153fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani if (!Utils.isMonkeyRunning()) { 12163fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani Intent intent = new Intent(Intent.ACTION_DEFAULT); 12173fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani intent.setClassName(mAppEntry.info.packageName, 12183fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani mAppEntry.info.manageSpaceActivityName); 12193db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn startActivityForResult(intent, REQUEST_MANAGE_SPACE); 12203fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani } 122142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 1222f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn showDialogInner(DLG_CLEAR_DATA, 0); 122342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 1224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mClearCacheButton) { 1225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Lazy initialization of observer 1226afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mClearCacheObserver == null) { 1227afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheObserver = new ClearCacheObserver(); 1228afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver); 1230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mForceStopButton) { 1231f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn showDialogInner(DLG_FORCE_STOP, 0); 12329db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn //forceStopPackage(mAppInfo.packageName); 1233ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } else if (v == mMoveAppButton) { 1234ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu if (mPackageMoveObserver == null) { 1235ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mPackageMoveObserver = new PackageMoveObserver(); 1236ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 12370f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn int moveFlags = (mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0 ? 1238ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu PackageManager.MOVE_INTERNAL : PackageManager.MOVE_EXTERNAL_MEDIA; 1239de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mMoveInProgress = true; 1240de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu refreshButtons(); 12410f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mPm.movePackage(mAppEntry.info.packageName, mPackageMoveObserver, moveFlags); 1242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1244aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn 1245aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn @Override 1246aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 1247aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn String packageName = mAppEntry.info.packageName; 1248aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn ActivityManager am = (ActivityManager) 1249aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn getActivity().getSystemService(Context.ACTIVITY_SERVICE); 1250aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn if (buttonView == mAskCompatibilityCB) { 1251aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn am.setPackageAskScreenCompat(packageName, isChecked); 1252aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } else if (buttonView == mEnableCompatibilityCB) { 1253aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn am.setPackageScreenCompatMode(packageName, isChecked ? 1254aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn ActivityManager.COMPAT_MODE_ENABLED : ActivityManager.COMPAT_MODE_DISABLED); 12554a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler } else if (buttonView == mNotificationSwitch) { 125670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler if (!isChecked) { 125770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler showDialogInner(DLG_DISABLE_NOTIFICATIONS, 0); 125870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } else { 125970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler setNotificationsEnabled(true); 12604a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler } 1261aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } 1262aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } 1263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 1264afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1265