InstalledAppDetails.java revision c715fb1207361bb2a793752eefb02f1956075739
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) { 343c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn mUninstallButton.setText(R.string.uninstall_text); 344c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn enabled = false; 3459db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } else { 3469db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn mUninstallButton.setText(R.string.uninstall_text); 347b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu } 34842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 3495c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn // If this is a device admin, it can't be uninstall or disabled. 3505c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn // We do this here so the text of the button is still set correctly. 3515c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 3525c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn enabled = false; 3535c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn } 35442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setEnabled(enabled); 35542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (enabled) { 35642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Register listener 35742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setOnClickListener(this); 35842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 35942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 36042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 3614a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler private void initNotificationButton() { 3624a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler INotificationManager nm = INotificationManager.Stub.asInterface( 3634a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 3644a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler boolean enabled = true; // default on 3654a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler try { 3664a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler enabled = nm.areNotificationsEnabledForPackage(mAppEntry.info.packageName); 3674a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler } catch (android.os.RemoteException ex) { 3684a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler // this does not bode well 3694a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler } 3704a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler mNotificationSwitch.setChecked(enabled); 37170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler if (isThisASystemPackage()) { 37270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler mNotificationSwitch.setEnabled(false); 37370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } else { 37470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler mNotificationSwitch.setEnabled(true); 37570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler mNotificationSwitch.setOnCheckedChangeListener(this); 37670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } 3774a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler } 3784a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler 379afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** Called when the activity is first created. */ 380afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 381f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onCreate(Bundle icicle) { 382afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(icicle); 3833db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 384f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mState = ApplicationsState.getInstance(getActivity().getApplication()); 385309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSession = mState.newSession(this); 386f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mPm = getActivity().getPackageManager(); 3873db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn mUserManager = (UserManager)getActivity().getSystemService(Context.USER_SERVICE); 3889d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood IBinder b = ServiceManager.getService(Context.USB_SERVICE); 3899d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood mUsbManager = IUsbManager.Stub.asInterface(b); 390c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka mAppWidgetManager = AppWidgetManager.getInstance(getActivity()); 3915c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn mDpm = (DevicePolicyManager)getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE); 3923465b67740e17711af2b36b09e2250a02275d860Jake Hamby mSmsManager = ISms.Stub.asInterface(ServiceManager.getService("isms")); 3939d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood 3946dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn mCanBeOnSdCardChecker = new CanBeOnSdCardChecker(); 3950fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn 396c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn // Need to make sure we have loaded applications at this point. 397c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn mSession.resume(); 398c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn 3990fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn retrieveAppEntry(); 4000fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn 4010fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn setHasOptionsMenu(true); 402f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 403f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 404f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn @Override 405f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 406f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn View view = mRootView = inflater.inflate(R.layout.installed_app_details, null); 4076dc1bf84cf72dd72a2517878f6b280e8afdcf4c2Dianne Hackborn 408f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mComputingStr = getActivity().getText(R.string.computing_size); 409b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 41050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Set default values on sizes 411f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mTotalSize = (TextView)view.findViewById(R.id.total_size_text); 412f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mAppSize = (TextView)view.findViewById(R.id.application_size_text); 413f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mDataSize = (TextView)view.findViewById(R.id.data_size_text); 414bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn mExternalCodeSize = (TextView)view.findViewById(R.id.external_code_size_text); 415bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn mExternalDataSize = (TextView)view.findViewById(R.id.external_data_size_text); 4161f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn 4171f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if (Environment.isExternalStorageEmulated()) { 4181f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn ((View)mExternalCodeSize.getParent()).setVisibility(View.GONE); 4191f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn ((View)mExternalDataSize.getParent()).setVisibility(View.GONE); 4201f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn } 4211f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn 42242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Get Control button panel 423f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn View btnPanel = view.findViewById(R.id.control_buttons_panel); 42442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mForceStopButton = (Button) btnPanel.findViewById(R.id.left_button); 42542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mForceStopButton.setText(R.string.force_stop); 42642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton = (Button)btnPanel.findViewById(R.id.right_button); 427cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn mForceStopButton.setEnabled(false); 428b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 42942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Initialize clear data and move install location buttons 430f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn View data_buttons_panel = view.findViewById(R.id.data_buttons_panel); 431313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn mClearDataButton = (Button) data_buttons_panel.findViewById(R.id.right_button); 432313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn mMoveAppButton = (Button) data_buttons_panel.findViewById(R.id.left_button); 433b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 4340f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn // Cache section 435f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mCacheSize = (TextView) view.findViewById(R.id.cache_size_text); 436f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mClearCacheButton = (Button) view.findViewById(R.id.clear_cache_button); 437f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 438f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mActivitiesButton = (Button)view.findViewById(R.id.clear_activities_button); 4390f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 440aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn // Screen compatibility control 441aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mScreenCompatSection = view.findViewById(R.id.screen_compatibility_section); 442aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mAskCompatibilityCB = (CheckBox)view.findViewById(R.id.ask_compatibility_cb); 443aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mEnableCompatibilityCB = (CheckBox)view.findViewById(R.id.enable_compatibility_cb); 4444a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler 44570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler mNotificationSwitch = (CompoundButton) view.findViewById(R.id.notification_switch); 446aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn 447f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return view; 448afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 449f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu 4503db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 4513db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 4523db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn menu.add(0, UNINSTALL_ALL_USERS_MENU, 1, R.string.uninstall_all_users_text) 4533db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 4543db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4553db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 4563db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 4573db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public void onPrepareOptionsMenu(Menu menu) { 4583db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn boolean showIt = true; 4593db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (mUpdatedSysApp) { 4603db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 4610fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn } else if (mAppEntry == null) { 4620fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn showIt = false; 4633db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 4643db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 4653db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 4663db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 4673db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if (UserHandle.myUserId() != 0) { 4683db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 4693db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if (mUserManager.getUsers().size() < 1) { 4703db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 4713db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4723db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn menu.findItem(UNINSTALL_ALL_USERS_MENU).setVisible(showIt); 4733db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4743db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 4753db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 4763db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public boolean onOptionsItemSelected(MenuItem item) { 4773db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn int menuId = item.getItemId(); 4783db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (menuId == UNINSTALL_ALL_USERS_MENU) { 4793db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn uninstallPkg(mAppEntry.info.packageName, true); 4803db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn return true; 4813db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4823db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn return false; 4833db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4843db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 4853db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 4863db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public void onActivityResult(int requestCode, int resultCode, Intent data) { 4873db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn super.onActivityResult(requestCode, resultCode, data); 4883db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (requestCode == REQUEST_UNINSTALL) { 4893db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (!refreshUi()) { 4903db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn setIntentAndFinish(true, true); 4913db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4923db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4933db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4943db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 49550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Utility method to set applicaiton label and icon. 496f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu private void setAppLabelAndIcon(PackageInfo pkgInfo) { 497f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn View appSnippet = mRootView.findViewById(R.id.app_snippet); 498f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon); 4990f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mState.ensureIcon(mAppEntry); 5000f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn icon.setImageDrawable(mAppEntry.icon); 501f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu // Set application name. 502f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu TextView label = (TextView) appSnippet.findViewById(R.id.app_name); 5030f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn label.setText(mAppEntry.label); 50450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Version number of application 505f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu mAppVersion = (TextView) appSnippet.findViewById(R.id.app_size); 506f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu 507f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu if (pkgInfo != null && pkgInfo.versionName != null) { 50850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppVersion.setVisibility(View.VISIBLE); 509f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mAppVersion.setText(getActivity().getString(R.string.version_text, 5108e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes String.valueOf(pkgInfo.versionName))); 51150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } else { 512f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu mAppVersion.setVisibility(View.INVISIBLE); 51350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 51450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 51550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 51650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu @Override 51742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public void onResume() { 51842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu super.onResume(); 519b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 520309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSession.resume(); 5210f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (!refreshUi()) { 522b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown setIntentAndFinish(true, true); 523b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown } 5240f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5250f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5260f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn @Override 5270f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn public void onPause() { 5280f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn super.onPause(); 529309c5dcee18ced447d049d5de882a9586694e04cDianne Hackborn mSession.pause(); 5300f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5310f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5320f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn @Override 5330f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn public void onAllSizesComputed() { 5340f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5350f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5360f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn @Override 5370f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn public void onPackageIconChanged() { 5380f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5390f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5400f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn @Override 5410f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn public void onPackageListChanged() { 5420f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn refreshUi(); 5430f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5440f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5450f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn @Override 54619df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn public void onRebuildComplete(ArrayList<AppEntry> apps) { 54719df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn } 54819df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn 54919df79af269c4a2354b0989cebfcfe949aea42c4Dianne Hackborn @Override 5500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn public void onPackageSizeChanged(String packageName) { 5510f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (packageName.equals(mAppEntry.info.packageName)) { 5520f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn refreshSizeInfo(); 5530f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5540f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5560f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn @Override 5570f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn public void onRunningStateChanged(boolean running) { 5580f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 5590f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 5600fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn private String retrieveAppEntry() { 5610c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy final Bundle args = getArguments(); 5620c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy String packageName = (args != null) ? args.getString(ARG_PACKAGE_NAME) : null; 563f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn if (packageName == null) { 5640c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy Intent intent = (args == null) ? 5650c5b9ca58bda5bc3c56f1e6c78859f7de147e476Patrick Dubroy getActivity().getIntent() : (Intent) args.getParcelable("intent"); 566f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn if (intent != null) { 567f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn packageName = intent.getData().getSchemeSpecificPart(); 568f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 569f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 5700f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mAppEntry = mState.getEntry(packageName); 571b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani // Get application info again to refresh changed properties of application 572b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani try { 573b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani mPackageInfo = mPm.getPackageInfo(mAppEntry.info.packageName, 574b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani PackageManager.GET_DISABLED_COMPONENTS | 575b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani PackageManager.GET_UNINSTALLED_PACKAGES | 576b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani PackageManager.GET_SIGNATURES); 577b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani } catch (NameNotFoundException e) { 578b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani Log.e(TAG, "Exception when retrieving package:" + mAppEntry.info.packageName, e); 579b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani } 580b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani 5810fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn return packageName; 5820fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn } 5830fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn 5840fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn private boolean refreshUi() { 5850fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn if (mMoveInProgress) { 5860fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn return true; 5870fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn } 5880fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn final String packageName = retrieveAppEntry(); 5890fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn 5900f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (mAppEntry == null) { 5910f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return false; // onCreate must have failed, make sure to exit 592b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown } 593b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani 594b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani if (mPackageInfo == null) { 5950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return false; // onCreate must have failed, make sure to exit 59650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 597b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani 5980f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn // Get list of preferred activities 5990f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn List<ComponentName> prefActList = new ArrayList<ComponentName>(); 600b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown 6010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn // Intent list cannot be null. so pass empty list 6020f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn List<IntentFilter> intentList = new ArrayList<IntentFilter>(); 6030f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mPm.getPreferredActivities(intentList, prefActList, packageName); 604c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (localLOGV) 605c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka Log.i(TAG, "Have " + prefActList.size() + " number of activities in preferred list"); 6069d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood boolean hasUsbDefaults = false; 6079d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood try { 6082715376cfa4d220f183623a5f35214d1bd537376Mike Lockwood hasUsbDefaults = mUsbManager.hasDefaults(packageName); 6099d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood } catch (RemoteException e) { 6109d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood Log.e(TAG, "mUsbManager.hasDefaults", e); 6119d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood } 612c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka boolean hasBindAppWidgetPermission = 613c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka mAppWidgetManager.hasBindAppWidgetPermission(mAppEntry.info.packageName); 614c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka 615c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka TextView autoLaunchTitleView = (TextView) mRootView.findViewById(R.id.auto_launch_title); 616c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka TextView autoLaunchView = (TextView) mRootView.findViewById(R.id.auto_launch); 617c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka boolean autoLaunchEnabled = prefActList.size() > 0 || hasUsbDefaults; 618c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (!autoLaunchEnabled && !hasBindAppWidgetPermission) { 619c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka resetLaunchDefaultsUi(autoLaunchTitleView, autoLaunchView); 6200f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } else { 621c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka boolean useBullets = hasBindAppWidgetPermission && autoLaunchEnabled; 622c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka 623c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (hasBindAppWidgetPermission) { 624c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka autoLaunchTitleView.setText(R.string.auto_launch_label_generic); 625c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } else { 626c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka autoLaunchTitleView.setText(R.string.auto_launch_label); 627c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } 628c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka 629c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka CharSequence text = null; 630c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka int bulletIndent = getResources() 631c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka .getDimensionPixelSize(R.dimen.installed_app_details_bullet_offset); 632c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (autoLaunchEnabled) { 633c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka CharSequence autoLaunchEnableText = getText(R.string.auto_launch_enable_text); 634c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka SpannableString s = new SpannableString(autoLaunchEnableText); 635c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (useBullets) { 636c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka s.setSpan(new BulletSpan(bulletIndent), 0, autoLaunchEnableText.length(), 0); 637c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } 638c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka text = (text == null) ? 639c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka TextUtils.concat(s, "\n") : TextUtils.concat(text, "\n", s, "\n"); 640c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } 641c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (hasBindAppWidgetPermission) { 642c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka CharSequence alwaysAllowBindAppWidgetsText = 643c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka getText(R.string.always_allow_bind_appwidgets_text); 644c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka SpannableString s = new SpannableString(alwaysAllowBindAppWidgetsText); 645c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka if (useBullets) { 646c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka s.setSpan(new BulletSpan(bulletIndent), 647c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka 0, alwaysAllowBindAppWidgetsText.length(), 0); 648c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } 649c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka text = (text == null) ? 650c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka TextUtils.concat(s, "\n") : TextUtils.concat(text, "\n", s, "\n"); 651c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } 652c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka autoLaunchView.setText(text); 6530f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mActivitiesButton.setEnabled(true); 6540f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mActivitiesButton.setOnClickListener(this); 6550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 656aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn 657aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn // Screen compatibility section. 658aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn ActivityManager am = (ActivityManager) 659aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn getActivity().getSystemService(Context.ACTIVITY_SERVICE); 660aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn int compatMode = am.getPackageScreenCompatMode(packageName); 66113bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn // For now these are always off; this is the old UI model which we 66213bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn // are no longer using. 66313bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn if (false && (compatMode == ActivityManager.COMPAT_MODE_DISABLED 66413bac39d2120a82b8a22b52f0db0727aa04b1f38Dianne Hackborn || compatMode == ActivityManager.COMPAT_MODE_ENABLED)) { 665aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mScreenCompatSection.setVisibility(View.VISIBLE); 666aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mAskCompatibilityCB.setChecked(am.getPackageAskScreenCompat(packageName)); 667aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mAskCompatibilityCB.setOnCheckedChangeListener(this); 668aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mEnableCompatibilityCB.setChecked(compatMode == ActivityManager.COMPAT_MODE_ENABLED); 669aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mEnableCompatibilityCB.setOnCheckedChangeListener(this); 670aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } else { 671aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn mScreenCompatSection.setVisibility(View.GONE); 672aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } 673aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn 6740f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn // Security permissions section 675f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn LinearLayout permsView = (LinearLayout) mRootView.findViewById(R.id.permissions_section); 676f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn AppSecurityPermissions asp = new AppSecurityPermissions(getActivity(), packageName); 6773465b67740e17711af2b36b09e2250a02275d860Jake Hamby int premiumSmsPermission = getPremiumSmsPermission(packageName); 6783465b67740e17711af2b36b09e2250a02275d860Jake Hamby // Premium SMS permission implies the app also has SEND_SMS permission, so the original 6793465b67740e17711af2b36b09e2250a02275d860Jake Hamby // application permissions list doesn't have to be shown/hidden separately. The premium 6803465b67740e17711af2b36b09e2250a02275d860Jake Hamby // SMS subsection should only be visible if the app has tried to send to a premium SMS. 6813465b67740e17711af2b36b09e2250a02275d860Jake Hamby if (asp.getPermissionCount() > 0 6823465b67740e17711af2b36b09e2250a02275d860Jake Hamby || premiumSmsPermission != SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN) { 6830f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn permsView.setVisibility(View.VISIBLE); 6843465b67740e17711af2b36b09e2250a02275d860Jake Hamby } else { 6853465b67740e17711af2b36b09e2250a02275d860Jake Hamby permsView.setVisibility(View.GONE); 6863465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 6873465b67740e17711af2b36b09e2250a02275d860Jake Hamby // Premium SMS permission subsection 6883465b67740e17711af2b36b09e2250a02275d860Jake Hamby TextView securityBillingDesc = (TextView) permsView.findViewById( 6893465b67740e17711af2b36b09e2250a02275d860Jake Hamby R.id.security_settings_billing_desc); 6903465b67740e17711af2b36b09e2250a02275d860Jake Hamby LinearLayout securityBillingList = (LinearLayout) permsView.findViewById( 6913465b67740e17711af2b36b09e2250a02275d860Jake Hamby R.id.security_settings_billing_list); 6923465b67740e17711af2b36b09e2250a02275d860Jake Hamby if (premiumSmsPermission != SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN) { 6933465b67740e17711af2b36b09e2250a02275d860Jake Hamby // Show the premium SMS permission selector 6943465b67740e17711af2b36b09e2250a02275d860Jake Hamby securityBillingDesc.setVisibility(View.VISIBLE); 6953465b67740e17711af2b36b09e2250a02275d860Jake Hamby securityBillingList.setVisibility(View.VISIBLE); 6963465b67740e17711af2b36b09e2250a02275d860Jake Hamby Spinner spinner = (Spinner) permsView.findViewById( 6973465b67740e17711af2b36b09e2250a02275d860Jake Hamby R.id.security_settings_premium_sms_list); 6983465b67740e17711af2b36b09e2250a02275d860Jake Hamby ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), 6993465b67740e17711af2b36b09e2250a02275d860Jake Hamby R.array.security_settings_premium_sms_values, 7003465b67740e17711af2b36b09e2250a02275d860Jake Hamby android.R.layout.simple_spinner_item); 7013465b67740e17711af2b36b09e2250a02275d860Jake Hamby adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 7023465b67740e17711af2b36b09e2250a02275d860Jake Hamby spinner.setAdapter(adapter); 7033465b67740e17711af2b36b09e2250a02275d860Jake Hamby // List items are in the same order as SmsUsageMonitor constants, offset by 1. 7043465b67740e17711af2b36b09e2250a02275d860Jake Hamby spinner.setSelection(premiumSmsPermission - 1); 7053465b67740e17711af2b36b09e2250a02275d860Jake Hamby spinner.setOnItemSelectedListener(new PremiumSmsSelectionListener( 7063465b67740e17711af2b36b09e2250a02275d860Jake Hamby packageName, mSmsManager)); 7073465b67740e17711af2b36b09e2250a02275d860Jake Hamby } else { 7083465b67740e17711af2b36b09e2250a02275d860Jake Hamby // Hide the premium SMS permission selector 7093465b67740e17711af2b36b09e2250a02275d860Jake Hamby securityBillingDesc.setVisibility(View.GONE); 7103465b67740e17711af2b36b09e2250a02275d860Jake Hamby securityBillingList.setVisibility(View.GONE); 7113465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 7123465b67740e17711af2b36b09e2250a02275d860Jake Hamby // App permissions subsection 7133465b67740e17711af2b36b09e2250a02275d860Jake Hamby if (asp.getPermissionCount() > 0) { 7140f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn // Make the security sections header visible 7150f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn LinearLayout securityList = (LinearLayout) permsView.findViewById( 7160f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn R.id.security_settings_list); 7170f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn securityList.removeAllViews(); 7180f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn securityList.addView(asp.getPermissionsView()); 719e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn // If this app is running under a shared user ID with other apps, 720e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn // update the description to explain this. 721e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn String[] packages = mPm.getPackagesForUid(mPackageInfo.applicationInfo.uid); 722e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn if (packages != null && packages.length > 1) { 723e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn ArrayList<CharSequence> pnames = new ArrayList<CharSequence>(); 724e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn for (int i=0; i<packages.length; i++) { 725e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn String pkg = packages[i]; 726e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn if (mPackageInfo.packageName.equals(pkg)) { 727e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn continue; 728e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 729e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn try { 730e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn ApplicationInfo ainfo = mPm.getApplicationInfo(pkg, 0); 731e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn pnames.add(ainfo.loadLabel(mPm)); 732e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } catch (PackageManager.NameNotFoundException e) { 733e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 734e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 735e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn final int N = pnames.size(); 736e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn if (N > 0) { 737e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn final Resources res = getActivity().getResources(); 738e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn String appListStr; 739e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn if (N == 1) { 740e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn appListStr = pnames.get(0).toString(); 741e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } else if (N == 2) { 742e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn appListStr = res.getString(R.string.join_two_items, pnames.get(0), 743e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn pnames.get(1)); 744e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } else { 745e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn appListStr = pnames.get(N-2).toString(); 746e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn for (int i=N-3; i>=0; i--) { 747e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn appListStr = res.getString(i == 0 ? R.string.join_many_items_first 748e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn : R.string.join_many_items_middle, pnames.get(i), appListStr); 749e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 750e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn appListStr = res.getString(R.string.join_many_items_last, 751e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn appListStr, pnames.get(N-1)); 752e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 753e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn TextView descr = (TextView) mRootView.findViewById( 754e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn R.id.security_settings_desc); 755e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn descr.setText(res.getString(R.string.security_settings_desc_multi, 756e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn mPackageInfo.applicationInfo.loadLabel(mPm), appListStr)); 757e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 758e458832c765ed5c3de836384338c7626c80b5686Dianne Hackborn } 759de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } 7600f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 7610f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn checkForceStop(); 7620f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn setAppLabelAndIcon(mPackageInfo); 7630f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn refreshButtons(); 7640f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn refreshSizeInfo(); 7650f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return true; 766afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 7673465b67740e17711af2b36b09e2250a02275d860Jake Hamby 7683465b67740e17711af2b36b09e2250a02275d860Jake Hamby private static class PremiumSmsSelectionListener implements AdapterView.OnItemSelectedListener { 7693465b67740e17711af2b36b09e2250a02275d860Jake Hamby private final String mPackageName; 7703465b67740e17711af2b36b09e2250a02275d860Jake Hamby private final ISms mSmsManager; 7713465b67740e17711af2b36b09e2250a02275d860Jake Hamby 7723465b67740e17711af2b36b09e2250a02275d860Jake Hamby PremiumSmsSelectionListener(String packageName, ISms smsManager) { 7733465b67740e17711af2b36b09e2250a02275d860Jake Hamby mPackageName = packageName; 7743465b67740e17711af2b36b09e2250a02275d860Jake Hamby mSmsManager = smsManager; 7753465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 7763465b67740e17711af2b36b09e2250a02275d860Jake Hamby 7773465b67740e17711af2b36b09e2250a02275d860Jake Hamby @Override 7783465b67740e17711af2b36b09e2250a02275d860Jake Hamby public void onItemSelected(AdapterView<?> parent, View view, int position, 7793465b67740e17711af2b36b09e2250a02275d860Jake Hamby long id) { 7803465b67740e17711af2b36b09e2250a02275d860Jake Hamby if (position >= 0 && position < 3) { 7813465b67740e17711af2b36b09e2250a02275d860Jake Hamby Log.d(TAG, "Selected premium SMS policy " + position); 7823465b67740e17711af2b36b09e2250a02275d860Jake Hamby setPremiumSmsPermission(mPackageName, (position + 1)); 7833465b67740e17711af2b36b09e2250a02275d860Jake Hamby } else { 7843465b67740e17711af2b36b09e2250a02275d860Jake Hamby Log.e(TAG, "Error: unknown premium SMS policy " + position); 7853465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 7863465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 7873465b67740e17711af2b36b09e2250a02275d860Jake Hamby 7883465b67740e17711af2b36b09e2250a02275d860Jake Hamby @Override 7893465b67740e17711af2b36b09e2250a02275d860Jake Hamby public void onNothingSelected(AdapterView<?> parent) { 7903465b67740e17711af2b36b09e2250a02275d860Jake Hamby // Ignored 7913465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 7923465b67740e17711af2b36b09e2250a02275d860Jake Hamby 7933465b67740e17711af2b36b09e2250a02275d860Jake Hamby private void setPremiumSmsPermission(String packageName, int permission) { 7943465b67740e17711af2b36b09e2250a02275d860Jake Hamby try { 7953465b67740e17711af2b36b09e2250a02275d860Jake Hamby if (mSmsManager != null) { 7963465b67740e17711af2b36b09e2250a02275d860Jake Hamby mSmsManager.setPremiumSmsPermission(packageName, permission); 7973465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 7983465b67740e17711af2b36b09e2250a02275d860Jake Hamby } catch (RemoteException ex) { 7993465b67740e17711af2b36b09e2250a02275d860Jake Hamby // ignored 8003465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 8013465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 8023465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 8030f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 804c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka private void resetLaunchDefaultsUi(TextView title, TextView autoLaunchView) { 805c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka title.setText(R.string.auto_launch_label); 806c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka autoLaunchView.setText(R.string.auto_launch_disable_text); 807c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka // Disable clear activities button 808c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka mActivitiesButton.setEnabled(false); 809c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka } 810c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka 811afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void setIntentAndFinish(boolean finish, boolean appChanged) { 812afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(localLOGV) Log.i(TAG, "appChanged="+appChanged); 813afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Intent intent = new Intent(); 814afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project intent.putExtra(ManageApplications.APP_CHG, appChanged); 815ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn PreferenceActivity pa = (PreferenceActivity)getActivity(); 816ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn pa.finishPreferencePanel(this, Activity.RESULT_OK, intent); 817afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 818afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 8190f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn private void refreshSizeInfo() { 8200f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (mAppEntry.size == ApplicationsState.SIZE_INVALID 8210f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn || mAppEntry.size == ApplicationsState.SIZE_UNKNOWN) { 8220f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mLastCodeSize = mLastDataSize = mLastCacheSize = mLastTotalSize = -1; 8230f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (!mHaveSizes) { 8240f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mAppSize.setText(mComputingStr); 8250f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mDataSize.setText(mComputingStr); 8260f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mCacheSize.setText(mComputingStr); 8270f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mTotalSize.setText(mComputingStr); 8280f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 8290f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearDataButton.setEnabled(false); 8300f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearCacheButton.setEnabled(false); 8310f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 832afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 8330f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mHaveSizes = true; 8341f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn long codeSize = mAppEntry.codeSize; 8351f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn long dataSize = mAppEntry.dataSize; 8361f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if (Environment.isExternalStorageEmulated()) { 8371f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn codeSize += mAppEntry.externalCodeSize; 8381f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn dataSize += mAppEntry.externalDataSize; 8391f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn } else { 8401f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if (mLastExternalCodeSize != mAppEntry.externalCodeSize) { 8411f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mLastExternalCodeSize = mAppEntry.externalCodeSize; 8421f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mExternalCodeSize.setText(getSizeStr(mAppEntry.externalCodeSize)); 8431f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn } 8441f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if (mLastExternalDataSize != mAppEntry.externalDataSize) { 8451f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mLastExternalDataSize = mAppEntry.externalDataSize; 8461f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mExternalDataSize.setText(getSizeStr( mAppEntry.externalDataSize)); 8471f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn } 848afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 8491f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if (mLastCodeSize != codeSize) { 8501f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mLastCodeSize = codeSize; 8511f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mAppSize.setText(getSizeStr(codeSize)); 852bd9ddab4f4e1f47b141abdcc0248cc716112b3c7Dianne Hackborn } 8531f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if (mLastDataSize != dataSize) { 8541f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mLastDataSize = dataSize; 8551f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn mDataSize.setText(getSizeStr(dataSize)); 856424acfb7ad469efb0a51c69fc8713cc96e2357b0Kenny Root } 857313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn long cacheSize = mAppEntry.cacheSize + mAppEntry.externalCacheSize; 858313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn if (mLastCacheSize != cacheSize) { 859313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn mLastCacheSize = cacheSize; 860313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn mCacheSize.setText(getSizeStr(cacheSize)); 861afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 8620f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (mLastTotalSize != mAppEntry.size) { 8630f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mLastTotalSize = mAppEntry.size; 8640f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mTotalSize.setText(getSizeStr(mAppEntry.size)); 865afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 8660f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn 8671f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if ((mAppEntry.dataSize+ mAppEntry.externalDataSize) <= 0 || !mCanClearData) { 8680f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearDataButton.setEnabled(false); 8690f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } else { 8700f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearDataButton.setEnabled(true); 8710f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearDataButton.setOnClickListener(this); 8720f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 873313ab1727014d535790bc89afdcf725ff936e5b4Dianne Hackborn if (cacheSize <= 0) { 8740f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearCacheButton.setEnabled(false); 8750f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } else { 8760f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearCacheButton.setEnabled(true); 8770f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mClearCacheButton.setOnClickListener(this); 878afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 879afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 880afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 881afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 882afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 883afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to handle clear message notification from observer when 884afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * the async operation from PackageManager is complete 885afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 886afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private void processClearMsg(Message msg) { 887afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project int result = msg.arg1; 8880f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn String packageName = mAppEntry.info.packageName; 88942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.clear_user_data_text); 890afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if(result == OP_SUCCESSFUL) { 89142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Log.i(TAG, "Cleared user data for package : "+packageName); 8920f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mState.requestSize(mAppEntry.info.packageName); 893afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 89442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(true); 895afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 8969db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn checkForceStop(); 897afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 898ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu 899de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu private void refreshButtons() { 900de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu if (!mMoveInProgress) { 901de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu initUninstallButtons(); 902de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu initDataButtons(); 903de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu initMoveButton(); 9044a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler initNotificationButton(); 905de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } else { 906de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mMoveAppButton.setText(R.string.moving); 907de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mMoveAppButton.setEnabled(false); 908de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mUninstallButton.setEnabled(false); 909de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } 910de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu } 911de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu 912ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu private void processMoveMsg(Message msg) { 913ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu int result = msg.arg1; 9140f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn String packageName = mAppEntry.info.packageName; 915de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu // Refresh the button attributes. 916de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mMoveInProgress = false; 9170f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (result == PackageManager.MOVE_SUCCEEDED) { 918ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu Log.i(TAG, "Moved resources for " + packageName); 919de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu // Refresh size information again. 9200f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mState.requestSize(mAppEntry.info.packageName); 921ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } else { 922f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn showDialogInner(DLG_MOVE_FAILED, result); 923ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 9240f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn refreshUi(); 925ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 9265cc062f1cd37cff19a1a7ee6fbb2a6522eee415cSuchi Amalapurapu 927afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 928afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Private method to initiate clearing user data when the user clicks the clear data 929afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * button for a system package 930afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 93142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void initiateClearUserData() { 93242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setEnabled(false); 93342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Invoke uninstall or clear user data based on sysPackage 9340f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn String packageName = mAppEntry.info.packageName; 93542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Log.i(TAG, "Clearing user data for package : " + packageName); 9360f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (mClearDataObserver == null) { 937afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearDataObserver = new ClearUserDataObserver(); 938afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 939f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn ActivityManager am = (ActivityManager) 940f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getActivity().getSystemService(Context.ACTIVITY_SERVICE); 941afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project boolean res = am.clearApplicationUserData(packageName, mClearDataObserver); 9420f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (!res) { 94350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Clearing data failed for some obscure reason. Just log error for now 944afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project Log.i(TAG, "Couldnt clear application user data for package:"+packageName); 945f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn showDialogInner(DLG_CANNOT_CLEAR_DATA, 0); 946afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 94742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mClearDataButton.setText(R.string.recompute_size); 948afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 949afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 950afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 951f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn private void showDialogInner(int id, int moveErrorCode) { 952f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn DialogFragment newFragment = MyAlertDialogFragment.newInstance(id, moveErrorCode); 953f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn newFragment.setTargetFragment(this, 0); 954f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn newFragment.show(getFragmentManager(), "dialog " + id); 95550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 95650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 957f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public static class MyAlertDialogFragment extends DialogFragment { 958f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 959f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public static MyAlertDialogFragment newInstance(int id, int moveErrorCode) { 960f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn MyAlertDialogFragment frag = new MyAlertDialogFragment(); 961f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn Bundle args = new Bundle(); 962f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn args.putInt("id", id); 963f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn args.putInt("moveError", moveErrorCode); 964f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn frag.setArguments(args); 965f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return frag; 966f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 967f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 968f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn InstalledAppDetails getOwner() { 969f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return (InstalledAppDetails)getTargetFragment(); 970f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 971f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 972f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn @Override 973f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public Dialog onCreateDialog(Bundle savedInstanceState) { 974f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn int id = getArguments().getInt("id"); 975f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn int moveErrorCode = getArguments().getInt("moveError"); 976f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn switch (id) { 977f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn case DLG_CLEAR_DATA: 978f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return new AlertDialog.Builder(getActivity()) 979f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setTitle(getActivity().getText(R.string.clear_data_dlg_title)) 980e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 981f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setMessage(getActivity().getText(R.string.clear_data_dlg_text)) 982f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setPositiveButton(R.string.dlg_ok, 983f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn new DialogInterface.OnClickListener() { 984f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onClick(DialogInterface dialog, int which) { 985f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn // Clear user data here 986f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getOwner().initiateClearUserData(); 987f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 988f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn }) 989f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setNegativeButton(R.string.dlg_cancel, null) 990f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .create(); 991f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn case DLG_FACTORY_RESET: 992f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return new AlertDialog.Builder(getActivity()) 993f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setTitle(getActivity().getText(R.string.app_factory_reset_dlg_title)) 994e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 995f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setMessage(getActivity().getText(R.string.app_factory_reset_dlg_text)) 996f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setPositiveButton(R.string.dlg_ok, 997f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn new DialogInterface.OnClickListener() { 998f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onClick(DialogInterface dialog, int which) { 999f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn // Clear user data here 10003db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn getOwner().uninstallPkg(getOwner().mAppEntry.info.packageName, false); 1001f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 1002f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn }) 1003f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setNegativeButton(R.string.dlg_cancel, null) 1004f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .create(); 1005f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn case DLG_APP_NOT_FOUND: 1006f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return new AlertDialog.Builder(getActivity()) 1007f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setTitle(getActivity().getText(R.string.app_not_found_dlg_title)) 1008e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 1009f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setMessage(getActivity().getText(R.string.app_not_found_dlg_title)) 1010f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setNeutralButton(getActivity().getText(R.string.dlg_ok), 1011f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn new DialogInterface.OnClickListener() { 1012f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onClick(DialogInterface dialog, int which) { 1013f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn //force to recompute changed value 1014f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getOwner().setIntentAndFinish(true, true); 1015f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 1016f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn }) 1017f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .create(); 1018f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn case DLG_CANNOT_CLEAR_DATA: 1019f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return new AlertDialog.Builder(getActivity()) 1020f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setTitle(getActivity().getText(R.string.clear_failed_dlg_title)) 1021e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 1022f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setMessage(getActivity().getText(R.string.clear_failed_dlg_text)) 1023f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setNeutralButton(R.string.dlg_ok, 1024f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn new DialogInterface.OnClickListener() { 1025f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onClick(DialogInterface dialog, int which) { 1026f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getOwner().mClearDataButton.setEnabled(false); 1027f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn //force to recompute changed value 1028f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getOwner().setIntentAndFinish(false, false); 1029f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 1030f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn }) 1031f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .create(); 1032f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn case DLG_FORCE_STOP: 1033f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return new AlertDialog.Builder(getActivity()) 1034f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setTitle(getActivity().getText(R.string.force_stop_dlg_title)) 1035e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 1036f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setMessage(getActivity().getText(R.string.force_stop_dlg_text)) 1037f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setPositiveButton(R.string.dlg_ok, 1038f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn new DialogInterface.OnClickListener() { 1039f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onClick(DialogInterface dialog, int which) { 1040f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn // Force stop 1041f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getOwner().forceStopPackage(getOwner().mAppEntry.info.packageName); 1042f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 1043f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn }) 1044f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setNegativeButton(R.string.dlg_cancel, null) 1045f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .create(); 1046f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn case DLG_MOVE_FAILED: 1047f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn CharSequence msg = getActivity().getString(R.string.move_app_failed_dlg_text, 1048f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn getOwner().getMoveErrMsg(moveErrorCode)); 1049f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn return new AlertDialog.Builder(getActivity()) 1050f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setTitle(getActivity().getText(R.string.move_app_failed_dlg_title)) 1051e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 1052f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setMessage(msg) 1053f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .setNeutralButton(R.string.dlg_ok, null) 1054f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn .create(); 1055f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn case DLG_DISABLE: 1056f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn return new AlertDialog.Builder(getActivity()) 1057f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .setTitle(getActivity().getText(R.string.app_disable_dlg_title)) 1058e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 1059f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .setMessage(getActivity().getText(R.string.app_disable_dlg_text)) 1060f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .setPositiveButton(R.string.dlg_ok, 1061f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn new DialogInterface.OnClickListener() { 1062f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn public void onClick(DialogInterface dialog, int which) { 1063f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn // Disable the app 1064f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn new DisableChanger(getOwner(), getOwner().mAppEntry.info, 1065f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) 1066f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .execute((Object)null); 1067f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn } 1068f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn }) 1069f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .setNegativeButton(R.string.dlg_cancel, null) 1070f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .create(); 107170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler case DLG_DISABLE_NOTIFICATIONS: 107270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler return new AlertDialog.Builder(getActivity()) 107370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler .setTitle(getActivity().getText(R.string.app_disable_notifications_dlg_title)) 1074c8272b075275f81ddfb9cef2f92514b7ce3365deBjörn Lundén .setIconAttribute(android.R.attr.alertDialogIcon) 107570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler .setMessage(getActivity().getText(R.string.app_disable_notifications_dlg_text)) 107670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler .setPositiveButton(R.string.dlg_ok, 107770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler new DialogInterface.OnClickListener() { 107870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler public void onClick(DialogInterface dialog, int which) { 107970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler // Disable the package's notifications 108070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler getOwner().setNotificationsEnabled(false); 108170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } 108270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler }) 108370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler .setNegativeButton(R.string.dlg_cancel, 108470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler new DialogInterface.OnClickListener() { 108570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler public void onClick(DialogInterface dialog, int which) { 108670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler // Re-enable the checkbox 108770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler getOwner().mNotificationSwitch.setChecked(true); 108870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } 108970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler }) 109070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler .create(); 1091f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 1092f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn throw new IllegalArgumentException("unknown id " + id); 1093f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 109450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 109550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 10963db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn private void uninstallPkg(String packageName, boolean allUsers) { 109750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Create new intent to launch Uninstaller activity 109850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu Uri packageURI = Uri.parse("package:"+packageName); 10993db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageURI); 11003db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, allUsers); 11013db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn startActivityForResult(uninstallIntent, REQUEST_UNINSTALL); 110250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 110350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 110442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void forceStopPackage(String pkgName) { 1105f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn ActivityManager am = (ActivityManager)getActivity().getSystemService( 110642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Context.ACTIVITY_SERVICE); 110742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu am.forceStopPackage(pkgName); 1108c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn mState.invalidatePackage(pkgName); 1109c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn ApplicationsState.AppEntry newEnt = mState.getEntry(pkgName); 1110c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn if (newEnt != null) { 1111c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn mAppEntry = newEnt; 1112c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn } 1113cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn checkForceStop(); 111442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 111542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 1116cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() { 1117cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn @Override 1118cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn public void onReceive(Context context, Intent intent) { 1119861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn updateForceStopButton(getResultCode() != Activity.RESULT_CANCELED); 1120cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn } 1121cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn }; 1122861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn 1123861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn private void updateForceStopButton(boolean enabled) { 1124861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn mForceStopButton.setEnabled(enabled); 1125861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn mForceStopButton.setOnClickListener(InstalledAppDetails.this); 1126861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn } 1127cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn 1128cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn private void checkForceStop() { 11295c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 11305c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn // User can't force stop device admin. 11315c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn updateForceStopButton(false); 11325c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn } else if ((mAppEntry.info.flags&ApplicationInfo.FLAG_STOPPED) == 0) { 1133861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn // If the app isn't explicitly stopped, then always show the 1134861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn // force stop button. 1135861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn updateForceStopButton(true); 1136861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn } else { 11375c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART, 11385c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn Uri.fromParts("package", mAppEntry.info.packageName, null)); 11395c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName }); 11405c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid); 1141c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn intent.putExtra(Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(mAppEntry.info.uid)); 1142861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn getActivity().sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null, 1143861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn Activity.RESULT_CANCELED, null, null); 1144861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn } 1145cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn } 114670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler 11479db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn static class DisableChanger extends AsyncTask<Object, Object, Object> { 11489db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn final PackageManager mPm; 11499db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn final WeakReference<InstalledAppDetails> mActivity; 11509db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn final ApplicationInfo mInfo; 11519db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn final int mState; 11529db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn 11539db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn DisableChanger(InstalledAppDetails activity, ApplicationInfo info, int state) { 11549db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn mPm = activity.mPm; 11559db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn mActivity = new WeakReference<InstalledAppDetails>(activity); 11569db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn mInfo = info; 11579db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn mState = state; 11589db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 11599db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn 11609db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn @Override 11619db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn protected Object doInBackground(Object... params) { 11629db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn mPm.setApplicationEnabledSetting(mInfo.packageName, mState, 0); 11639db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn return null; 11649db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 11659db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 11669db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn 116770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler private void setNotificationsEnabled(boolean enabled) { 116870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler String packageName = mAppEntry.info.packageName; 116970b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler INotificationManager nm = INotificationManager.Stub.asInterface( 117070b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 117170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler try { 117270b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler final boolean enable = mNotificationSwitch.isChecked(); 117370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler nm.setNotificationsEnabledForPackage(packageName, enabled); 117470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } catch (android.os.RemoteException ex) { 117570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler mNotificationSwitch.setChecked(!enabled); // revert 117670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } 117770b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } 117870b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler 11793465b67740e17711af2b36b09e2250a02275d860Jake Hamby private int getPremiumSmsPermission(String packageName) { 11803465b67740e17711af2b36b09e2250a02275d860Jake Hamby try { 11813465b67740e17711af2b36b09e2250a02275d860Jake Hamby if (mSmsManager != null) { 11823465b67740e17711af2b36b09e2250a02275d860Jake Hamby return mSmsManager.getPremiumSmsPermission(packageName); 11833465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 11843465b67740e17711af2b36b09e2250a02275d860Jake Hamby } catch (RemoteException ex) { 11853465b67740e17711af2b36b09e2250a02275d860Jake Hamby // ignored 11863465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 11873465b67740e17711af2b36b09e2250a02275d860Jake Hamby return SmsUsageMonitor.PREMIUM_SMS_PERMISSION_UNKNOWN; 11883465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 11893465b67740e17711af2b36b09e2250a02275d860Jake Hamby 1190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 1191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Method implementing functionality of buttons clicked 1192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * @see android.view.View.OnClickListener#onClick(android.view.View) 1193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 1194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onClick(View v) { 11950f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn String packageName = mAppEntry.info.packageName; 119642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if(v == mUninstallButton) { 119742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (mUpdatedSysApp) { 1198f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn showDialogInner(DLG_FACTORY_RESET, 0); 119942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 12000f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 1201f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn if (mAppEntry.info.enabled) { 1202f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn showDialogInner(DLG_DISABLE, 0); 1203f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn } else { 1204f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn new DisableChanger(this, mAppEntry.info, 1205f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) 1206f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn .execute((Object)null); 1207f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn } 12082e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_INSTALLED) == 0) { 12092e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn try { 12102e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn mPm.installExistingPackage(packageName); 12112e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn refreshUi(); 12122e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn } catch (NameNotFoundException e) { 12132e3c75094bde1cfca1b15f66f5ff3d0a85baf0a0Dianne Hackborn } 12149db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } else { 12153db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn uninstallPkg(packageName, false); 12169db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 1217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1218afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if(v == mActivitiesButton) { 1219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.clearPackagePreferredActivities(packageName); 12209d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood try { 12212715376cfa4d220f183623a5f35214d1bd537376Mike Lockwood mUsbManager.clearDefaults(packageName); 12229d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood } catch (RemoteException e) { 12239d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood Log.e(TAG, "mUsbManager.clearDefaults", e); 12249d6d92b33ebf1c91aed47bd759ce78a3e06afff5Mike Lockwood } 1225c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka mAppWidgetManager.setBindAppWidgetPermission(packageName, false); 1226c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka TextView autoLaunchTitleView = 1227c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka (TextView) mRootView.findViewById(R.id.auto_launch_title); 1228c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka TextView autoLaunchView = (TextView) mRootView.findViewById(R.id.auto_launch); 1229c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurka resetLaunchDefaultsUi(autoLaunchTitleView, autoLaunchView); 123042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else if(v == mClearDataButton) { 12310f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (mAppEntry.info.manageSpaceActivityName != null) { 12323fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani if (!Utils.isMonkeyRunning()) { 12333fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani Intent intent = new Intent(Intent.ACTION_DEFAULT); 12343fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani intent.setClassName(mAppEntry.info.packageName, 12353fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani mAppEntry.info.manageSpaceActivityName); 12363db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn startActivityForResult(intent, REQUEST_MANAGE_SPACE); 12373fd8051a89c5fbcd52b83566a05f0edb919414a5Amith Yamasani } 123842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 1239f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn showDialogInner(DLG_CLEAR_DATA, 0); 124042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 1241afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mClearCacheButton) { 1242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Lazy initialization of observer 1243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project if (mClearCacheObserver == null) { 1244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mClearCacheObserver = new ClearCacheObserver(); 1245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver); 1247afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mForceStopButton) { 1248f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn showDialogInner(DLG_FORCE_STOP, 0); 12499db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn //forceStopPackage(mAppInfo.packageName); 1250ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } else if (v == mMoveAppButton) { 1251ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu if (mPackageMoveObserver == null) { 1252ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu mPackageMoveObserver = new PackageMoveObserver(); 1253ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu } 12540f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn int moveFlags = (mAppEntry.info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0 ? 1255ad1482712de6e7cac803ed02abcdc2efb47d43baSuchi Amalapurapu PackageManager.MOVE_INTERNAL : PackageManager.MOVE_EXTERNAL_MEDIA; 1256de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu mMoveInProgress = true; 1257de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu refreshButtons(); 12580f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mPm.movePackage(mAppEntry.info.packageName, mPackageMoveObserver, moveFlags); 1259afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1260afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 1261aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn 1262aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn @Override 1263aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 1264aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn String packageName = mAppEntry.info.packageName; 1265aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn ActivityManager am = (ActivityManager) 1266aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn getActivity().getSystemService(Context.ACTIVITY_SERVICE); 1267aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn if (buttonView == mAskCompatibilityCB) { 1268aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn am.setPackageAskScreenCompat(packageName, isChecked); 1269aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } else if (buttonView == mEnableCompatibilityCB) { 1270aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn am.setPackageScreenCompatMode(packageName, isChecked ? 1271aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn ActivityManager.COMPAT_MODE_ENABLED : ActivityManager.COMPAT_MODE_DISABLED); 12724a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler } else if (buttonView == mNotificationSwitch) { 127370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler if (!isChecked) { 127470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler showDialogInner(DLG_DISABLE_NOTIFICATIONS, 0); 127570b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler } else { 127670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler setNotificationsEnabled(true); 12774a824be44c3878f22469cf45c2ef8b7e92724e92Daniel Sandler } 1278aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } 1279aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } 1280afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 1281afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 1282