InstalledAppDetails.java revision 1eb54eb2ff250eccdd700601011bd6457ddcbec1
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 19afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Activity; 20afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.ActivityManager; 21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.AlertDialog; 224bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.app.LoaderManager.LoaderCallbacks; 2379021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganovimport android.content.ActivityNotFoundException; 24cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackbornimport android.content.BroadcastReceiver; 25c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurkaimport android.content.ComponentName; 26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.DialogInterface; 28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 294bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.content.Loader; 30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.ApplicationInfo; 3150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.content.pm.PackageInfo; 32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager; 33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException; 34cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport android.content.pm.ResolveInfo; 354bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.net.INetworkStatsService; 364bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.net.INetworkStatsSession; 374bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.net.NetworkTemplate; 384bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.net.TrafficStats; 39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.Uri; 409db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackbornimport android.os.AsyncTask; 411eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport android.os.BatteryStats; 42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 434bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.os.RemoteException; 444bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.os.ServiceManager; 453db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.os.UserHandle; 46cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport android.preference.Preference; 47cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport android.preference.Preference.OnPreferenceClickListener; 48cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport android.provider.Settings; 494bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.text.format.DateUtils; 504bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.text.format.Formatter; 5179021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganovimport android.util.Log; 523db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.view.Menu; 533db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.view.MenuInflater; 543db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.view.MenuItem; 55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button; 57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView; 58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView; 59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 608a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenimport com.android.internal.logging.MetricsLogger; 611eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport com.android.internal.os.BatterySipper; 621eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport com.android.internal.os.BatteryStatsHelper; 634bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport com.android.settings.DataUsageSummary; 644bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport com.android.settings.DataUsageSummary.AppItem; 65cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport com.android.settings.R; 66cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport com.android.settings.SettingsActivity; 67cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport com.android.settings.Utils; 68cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport com.android.settings.applications.ApplicationsState.AppEntry; 691eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport com.android.settings.fuelgauge.BatteryEntry; 701eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport com.android.settings.fuelgauge.PowerUsageDetail; 714bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport com.android.settings.net.ChartData; 724bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport com.android.settings.net.ChartDataLoader; 73584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport com.android.settings.notification.NotificationBackend; 74584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport com.android.settings.notification.NotificationBackend.AppRow; 75cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 76cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport java.lang.ref.WeakReference; 77cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport java.util.ArrayList; 78cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport java.util.HashSet; 79cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport java.util.List; 80cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display application information from Settings. This activity presents 83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * extended information associated with a package like code, data, total size, permissions 84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * used by the application and also the set of default launchable activities. 85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For system applications, an option to clear user data is displayed only if data size is > 0. 86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * System applications that do not want clear user data do not have this option. 87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For non-system applications, there is no option to clear data. Instead there is an option to 88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * uninstall the application. 89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 90cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkpublic class InstalledAppDetails extends AppInfoBase 91cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk implements View.OnClickListener, OnPreferenceClickListener { 92cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 9379021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov private static final String LOG_TAG = "InstalledAppDetails"; 9479021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov 95cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Menu identifiers 96cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public static final int UNINSTALL_ALL_USERS_MENU = 1; 97dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk public static final int UNINSTALL_UPDATES = 2; 98cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 99cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Result code identifiers 100cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public static final int REQUEST_UNINSTALL = 0; 101cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final int SUB_INFO_FRAGMENT = 1; 102cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 1034bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk private static final int LOADER_CHART_DATA = 2; 1044bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 105cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final int DLG_FORCE_STOP = DLG_BASE + 1; 106cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final int DLG_DISABLE = DLG_BASE + 2; 107cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final int DLG_SPECIAL_DISABLE = DLG_BASE + 3; 108cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final int DLG_FACTORY_RESET = DLG_BASE + 4; 109cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 110cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_HEADER = "header_view"; 111cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_NOTIFICATION = "notification_settings"; 112cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_STORAGE = "storage_settings"; 113cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_PERMISSION = "permission_settings"; 114cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_DATA = "data_settings"; 115cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_LAUNCH = "preferred_settings"; 1161eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private static final String KEY_BATTERY = "battery"; 117cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 118cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private final HashSet<String> mHomePackages = new HashSet<String>(); 119f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 120ab616d477be693fc455329953711264af0ed7814Dianne Hackborn private boolean mInitialized; 121ab616d477be693fc455329953711264af0ed7814Dianne Hackborn private boolean mShowUninstalled; 12260a09ea2388db01a661beeb9995a7ecf770a4200Jason Monk private LayoutPreference mHeader; 12342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private Button mUninstallButton; 12442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private boolean mUpdatedSysApp = false; 12550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private TextView mAppVersion; 126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mForceStopButton; 127cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private Preference mNotificationPreference; 128cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private Preference mStoragePreference; 129cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private Preference mPermissionsPreference; 130cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private Preference mLaunchPreference; 131cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private Preference mDataPreference; 1328243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 1339072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn private boolean mDisableAfterUninstall; 134cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Used for updating notification preference. 135584b2b2bc17a4ccf42952b188722de1091c101beJason Monk private final NotificationBackend mBackend = new NotificationBackend(); 13642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 1374bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk private ChartData mChartData; 1384bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk private INetworkStatsSession mStatsSession; 1394bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 1401eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private Preference mBatteryPreference; 1411eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 1421eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private BatteryStatsHelper mBatteryHelper; 1431eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private BatterySipper mSipper; 1441eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 1459072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn private boolean handleDisableable(Button button) { 1469072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn boolean disableable = false; 1478243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // Try to prevent the user from bricking their phone 1488243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // by not allowing disabling of apps signed with the 1498243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // system cert and any launcher app in the system. 150b58b5127040b3c843fe42544a89a1085cf7e74f6Dan Sandler if (mHomePackages.contains(mAppEntry.info.packageName) 151b58b5127040b3c843fe42544a89a1085cf7e74f6Dan Sandler || Utils.isSystemPackage(mPm, mPackageInfo)) { 1528243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // Disable button for core system applications. 1538243c9a722e815bdcb069163de48877478c28dfdChristopher Tate button.setText(R.string.disable_text); 1548243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } else if (mAppEntry.info.enabled) { 1558243c9a722e815bdcb069163de48877478c28dfdChristopher Tate button.setText(R.string.disable_text); 1568243c9a722e815bdcb069163de48877478c28dfdChristopher Tate disableable = true; 1578243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } else { 1588243c9a722e815bdcb069163de48877478c28dfdChristopher Tate button.setText(R.string.enable_text); 1598243c9a722e815bdcb069163de48877478c28dfdChristopher Tate disableable = true; 1609072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 1618243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 1629072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn return disableable; 1639072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 1649072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn 165de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu private void initUninstallButtons() { 166568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate final boolean isBundled = (mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0; 16742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu boolean enabled = true; 168dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk if (isBundled) { 169dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk enabled = handleDisableable(mUninstallButton); 17042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 171dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk if ((mPackageInfo.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED) == 0 1724de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn && mUserManager.getUsers().size() >= 2) { 1734de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // When we have multiple users, there is a separate menu 1744de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // to uninstall for all users. 175c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn enabled = false; 176b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu } 177dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk mUninstallButton.setText(R.string.uninstall_text); 17842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 179c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate // If this is a device admin, it can't be uninstalled or disabled. 1805c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn // We do this here so the text of the button is still set correctly. 1815c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 1825c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn enabled = false; 1835c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn } 184c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate 185568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // Home apps need special handling. Bundled ones we don't risk downgrading 186568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // because that can interfere with home-key resolution. Furthermore, we 187568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // can't allow uninstallation of the only home app, and we don't want to 188568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // allow uninstallation of an explicitly preferred one -- the user can go 189568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // to Home settings and pick a different one, after which we'll permit 190568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // uninstallation of the now-not-default one. 191c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate if (enabled && mHomePackages.contains(mPackageInfo.packageName)) { 192568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate if (isBundled) { 193568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate enabled = false; 194c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate } else { 195568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate ArrayList<ResolveInfo> homeActivities = new ArrayList<ResolveInfo>(); 196568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate ComponentName currentDefaultHome = mPm.getHomeActivities(homeActivities); 197568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate if (currentDefaultHome == null) { 198568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // No preferred default, so permit uninstall only when 199568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // there is more than one candidate 200568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate enabled = (mHomePackages.size() > 1); 201568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate } else { 202568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // There is an explicit default home app -- forbid uninstall of 203568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // that one, but permit it for installed-but-inactive ones. 204568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate enabled = !mPackageInfo.packageName.equals(currentDefaultHome.getPackageName()); 205568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate } 206c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate } 207c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate } 208c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate 20930df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds if (mAppControlRestricted) { 21030df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds enabled = false; 21130df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds } 21230df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds 21342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setEnabled(enabled); 21442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (enabled) { 21542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Register listener 21642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setOnClickListener(this); 21742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 21842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 21942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 220afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** Called when the activity is first created. */ 221afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 222f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onCreate(Bundle icicle) { 223afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(icicle); 2243db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 2250fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn setHasOptionsMenu(true); 226cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk addPreferencesFromResource(R.xml.installed_app_details); 2274bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 2284bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk INetworkStatsService statsService = INetworkStatsService.Stub.asInterface( 2294bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk ServiceManager.getService(Context.NETWORK_STATS_SERVICE)); 2304bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk try { 2314bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mStatsSession = statsService.openSession(); 2324bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } catch (RemoteException e) { 2334bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk throw new RuntimeException(e); 2344bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 2351eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryHelper = new BatteryStatsHelper(getActivity(), true); 2364bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 2374bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 2384bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk @Override 2398a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren protected int getMetricsCategory() { 2408a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren return MetricsLogger.APPLICATIONS_INSTALLED_APP_DETAILS; 2418a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren } 2428a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren 2438a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren @Override 2444bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public void onResume() { 2454bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk super.onResume(); 2464bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk AppItem app = new AppItem(mAppEntry.info.uid); 2474bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk app.addUid(mAppEntry.info.uid); 2484bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk getLoaderManager().restartLoader(LOADER_CHART_DATA, 2494bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk ChartDataLoader.buildArgs(NetworkTemplate.buildTemplateMobileWildcard(), app), 2504bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mDataCallbacks); 2511eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk new BatteryUpdater().execute(); 2524bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 2534bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 2544bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk @Override 2554bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public void onPause() { 2564bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk getLoaderManager().destroyLoader(LOADER_CHART_DATA); 2574bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk super.onPause(); 2584bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 2594bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 2604bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk @Override 2614bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public void onDestroy() { 2624bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk TrafficStats.closeQuietly(mStatsSession); 2634bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 2644bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk super.onDestroy(); 265f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 266f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 267cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public void onActivityCreated(Bundle savedInstanceState) { 268cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk super.onActivityCreated(savedInstanceState); 269cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk handleHeader(); 27038ba9a2d4350fc7d063ec21c994183258bf7a443Fabrice Di Meglio 271cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mNotificationPreference = findPreference(KEY_NOTIFICATION); 272cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mNotificationPreference.setOnPreferenceClickListener(this); 273cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mStoragePreference = findPreference(KEY_STORAGE); 274cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mStoragePreference.setOnPreferenceClickListener(this); 275cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mPermissionsPreference = findPreference(KEY_PERMISSION); 276cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mPermissionsPreference.setOnPreferenceClickListener(this); 277cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mDataPreference = findPreference(KEY_DATA); 278cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mDataPreference.setOnPreferenceClickListener(this); 2791eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference = findPreference(KEY_BATTERY); 2801eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference.setEnabled(false); 2811eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference.setOnPreferenceClickListener(this); 2828b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio 2838b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio mLaunchPreference = findPreference(KEY_LAUNCH); 2848b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio if ((mAppEntry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0) { 2858b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio mLaunchPreference.setEnabled(false); 2868b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio } else if (!mAppEntry.info.enabled) { 2878b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio mLaunchPreference.setEnabled(false); 2888b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio } else { 2898b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio mLaunchPreference.setOnPreferenceClickListener(this); 2908b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio } 291cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 2921f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn 293cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private void handleHeader() { 29460a09ea2388db01a661beeb9995a7ecf770a4200Jason Monk mHeader = (LayoutPreference) findPreference(KEY_HEADER); 2951f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn 29642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Get Control button panel 297cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk View btnPanel = mHeader.findViewById(R.id.control_buttons_panel); 298cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mForceStopButton = (Button) btnPanel.findViewById(R.id.right_button); 29942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mForceStopButton.setText(R.string.force_stop); 300cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mUninstallButton = (Button) btnPanel.findViewById(R.id.left_button); 301cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn mForceStopButton.setEnabled(false); 302afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 303f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu 3043db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 3053db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 306dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk menu.add(0, UNINSTALL_UPDATES, 0, R.string.app_factory_reset) 307dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 3083db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn menu.add(0, UNINSTALL_ALL_USERS_MENU, 1, R.string.uninstall_all_users_text) 3093db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 3103db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 3113db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 3123db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 3133db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public void onPrepareOptionsMenu(Menu menu) { 3143db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn boolean showIt = true; 3153db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (mUpdatedSysApp) { 3163db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 3170fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn } else if (mAppEntry == null) { 3180fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn showIt = false; 3193db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 3203db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 32154b3f501ca4a7ff88ead39247d2277d2efc82bb6Jeff Sharkey } else if (mPackageInfo == null || mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 3223db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 3233db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if (UserHandle.myUserId() != 0) { 3243db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 3257a1c4cdfae66e8b110de3988e65586871a969c04Amith Yamasani } else if (mUserManager.getUsers().size() < 2) { 3263db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 3273db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 3283db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn menu.findItem(UNINSTALL_ALL_USERS_MENU).setVisible(showIt); 329dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk mUpdatedSysApp = (mAppEntry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0; 330dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk menu.findItem(UNINSTALL_UPDATES).setVisible(mUpdatedSysApp && !mAppControlRestricted); 3313db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 3323db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 3333db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 3343db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public boolean onOptionsItemSelected(MenuItem item) { 335dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk switch (item.getItemId()) { 336dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk case UNINSTALL_ALL_USERS_MENU: 337dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk uninstallPkg(mAppEntry.info.packageName, true, false); 338dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk return true; 339dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk case UNINSTALL_UPDATES: 340dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk showDialogInner(DLG_FACTORY_RESET, 0); 341dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk return true; 3423db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 3433db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn return false; 3443db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 3453db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 3463db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 3473db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public void onActivityResult(int requestCode, int resultCode, Intent data) { 3483db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn super.onActivityResult(requestCode, resultCode, data); 3493db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (requestCode == REQUEST_UNINSTALL) { 3509072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn if (mDisableAfterUninstall) { 3519072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mDisableAfterUninstall = false; 3529072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn try { 3539072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn ApplicationInfo ainfo = getActivity().getPackageManager().getApplicationInfo( 3549072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mAppEntry.info.packageName, PackageManager.GET_UNINSTALLED_PACKAGES 3559072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn | PackageManager.GET_DISABLED_COMPONENTS); 3569072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn if ((ainfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0) { 3579072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn new DisableChanger(this, mAppEntry.info, 3589072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) 3599072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn .execute((Object)null); 3609072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 3619072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } catch (NameNotFoundException e) { 3629072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 3639072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 3643db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (!refreshUi()) { 3653db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn setIntentAndFinish(true, true); 3663db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 3673db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 3683db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 3693db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 3700dd9902c89e7b705fd73158aadf1bf27843ad201Dianne Hackborn // Utility method to set application label and icon. 371f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu private void setAppLabelAndIcon(PackageInfo pkgInfo) { 372cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk final View appSnippet = mHeader.findViewById(R.id.app_snippet); 373cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk appSnippet.setPaddingRelative(0, appSnippet.getPaddingTop(), 0, 374cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk appSnippet.getPaddingBottom()); 37597d07fa3aedde44368818551dc789eaff7bfb047Jeff Sharkey 376f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon); 3770f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mState.ensureIcon(mAppEntry); 3780f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn icon.setImageDrawable(mAppEntry.icon); 379f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu // Set application name. 380f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu TextView label = (TextView) appSnippet.findViewById(R.id.app_name); 3810f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn label.setText(mAppEntry.label); 38250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Version number of application 38325f9e326ab65e5298737721e959b22aea68148f1Jason Monk mAppVersion = (TextView) appSnippet.findViewById(R.id.app_summary); 384f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu 385f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu if (pkgInfo != null && pkgInfo.versionName != null) { 38650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mAppVersion.setVisibility(View.VISIBLE); 387f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mAppVersion.setText(getActivity().getString(R.string.version_text, 3888e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes String.valueOf(pkgInfo.versionName))); 38950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } else { 390f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu mAppVersion.setVisibility(View.INVISIBLE); 39150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 39250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 39350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 3948243c9a722e815bdcb069163de48877478c28dfdChristopher Tate private boolean signaturesMatch(String pkg1, String pkg2) { 3958243c9a722e815bdcb069163de48877478c28dfdChristopher Tate if (pkg1 != null && pkg2 != null) { 3968243c9a722e815bdcb069163de48877478c28dfdChristopher Tate try { 3978243c9a722e815bdcb069163de48877478c28dfdChristopher Tate final int match = mPm.checkSignatures(pkg1, pkg2); 3988243c9a722e815bdcb069163de48877478c28dfdChristopher Tate if (match >= PackageManager.SIGNATURE_MATCH) { 3998243c9a722e815bdcb069163de48877478c28dfdChristopher Tate return true; 4008243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 4018243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } catch (Exception e) { 4028243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // e.g. named alternate package not found during lookup; 4038243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // this is an expected case sometimes 4048243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 4058243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 4068243c9a722e815bdcb069163de48877478c28dfdChristopher Tate return false; 4078243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 4088243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 409cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk @Override 410cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk protected boolean refreshUi() { 411cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk retrieveAppEntry(); 4120f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (mAppEntry == null) { 4130f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return false; // onCreate must have failed, make sure to exit 414b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown } 415b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani 416b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani if (mPackageInfo == null) { 4170f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return false; // onCreate must have failed, make sure to exit 41850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 419b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani 4208243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // Get list of "home" apps and trace through any meta-data references 4218243c9a722e815bdcb069163de48877478c28dfdChristopher Tate List<ResolveInfo> homeActivities = new ArrayList<ResolveInfo>(); 4228243c9a722e815bdcb069163de48877478c28dfdChristopher Tate mPm.getHomeActivities(homeActivities); 4238243c9a722e815bdcb069163de48877478c28dfdChristopher Tate mHomePackages.clear(); 4248243c9a722e815bdcb069163de48877478c28dfdChristopher Tate for (int i = 0; i< homeActivities.size(); i++) { 4258243c9a722e815bdcb069163de48877478c28dfdChristopher Tate ResolveInfo ri = homeActivities.get(i); 4268243c9a722e815bdcb069163de48877478c28dfdChristopher Tate final String activityPkg = ri.activityInfo.packageName; 4278243c9a722e815bdcb069163de48877478c28dfdChristopher Tate mHomePackages.add(activityPkg); 4288243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 4298243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // Also make sure to include anything proxying for the home app 4308243c9a722e815bdcb069163de48877478c28dfdChristopher Tate final Bundle metadata = ri.activityInfo.metaData; 4318243c9a722e815bdcb069163de48877478c28dfdChristopher Tate if (metadata != null) { 4328243c9a722e815bdcb069163de48877478c28dfdChristopher Tate final String metaPkg = metadata.getString(ActivityManager.META_HOME_ALTERNATE); 4338243c9a722e815bdcb069163de48877478c28dfdChristopher Tate if (signaturesMatch(metaPkg, activityPkg)) { 4348243c9a722e815bdcb069163de48877478c28dfdChristopher Tate mHomePackages.add(metaPkg); 4358243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 4368243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 4378243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 4388243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 4390f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn checkForceStop(); 4400f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn setAppLabelAndIcon(mPackageInfo); 441cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk initUninstallButtons(); 442cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 443cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Update the preference summaries. 444cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk Activity context = getActivity(); 445cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mStoragePreference.setSummary(AppStorageSettings.getSummary(mAppEntry, context)); 446cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mPermissionsPreference.setSummary(AppPermissionSettings.getSummary(mAppEntry, context)); 4478b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio mLaunchPreference.setSummary(Utils.getLaunchByDeafaultSummary(mAppEntry, mUsbManager, 448cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mPm, context)); 449cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mNotificationPreference.setSummary(getNotificationSummary(mAppEntry, context, 450cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mBackend)); 4514bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mDataPreference.setSummary(getDataSummary()); 452ab616d477be693fc455329953711264af0ed7814Dianne Hackborn 4531eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk updateBattery(); 4541eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 455ab616d477be693fc455329953711264af0ed7814Dianne Hackborn if (!mInitialized) { 456ab616d477be693fc455329953711264af0ed7814Dianne Hackborn // First time init: are we displaying an uninstalled app? 457ab616d477be693fc455329953711264af0ed7814Dianne Hackborn mInitialized = true; 458ab616d477be693fc455329953711264af0ed7814Dianne Hackborn mShowUninstalled = (mAppEntry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0; 4594de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn } else { 4604de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // All other times: if the app no longer exists then we want 4614de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // to go away. 4629072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn try { 463cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk ApplicationInfo ainfo = context.getPackageManager().getApplicationInfo( 4649072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mAppEntry.info.packageName, PackageManager.GET_UNINSTALLED_PACKAGES 4659072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn | PackageManager.GET_DISABLED_COMPONENTS); 4664de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn if (!mShowUninstalled) { 4674de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // If we did not start out with the app uninstalled, then 4684de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // it transitioning to the uninstalled state for the current 4694de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // user means we should go away as well. 4704de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn return (ainfo.flags&ApplicationInfo.FLAG_INSTALLED) != 0; 4714de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn } 4729072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } catch (NameNotFoundException e) { 4739072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn return false; 4749072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 475ab616d477be693fc455329953711264af0ed7814Dianne Hackborn } 476ab616d477be693fc455329953711264af0ed7814Dianne Hackborn 4770f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return true; 478afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 4793465b67740e17711af2b36b09e2250a02275d860Jake Hamby 4801eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private void updateBattery() { 4811eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk if (mSipper != null) { 4821eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference.setEnabled(true); 4831eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk int dischargeAmount = mBatteryHelper.getStats().getDischargeAmount( 4841eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk BatteryStats.STATS_SINCE_CHARGED); 4851eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk final int percentOfMax = (int) ((mSipper.totalPowerMah) 4861eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk / mBatteryHelper.getTotalPower() * dischargeAmount + .5f); 4871eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference.setSummary(getString(R.string.battery_summary, percentOfMax)); 4881eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } else { 4891eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference.setEnabled(false); 4901eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference.setSummary(getString(R.string.no_battery_summary)); 4911eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 4921eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 4931eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 4944bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk private CharSequence getDataSummary() { 4954bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk if (mChartData != null) { 4964bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk long totalBytes = mChartData.detail.getTotalBytes(); 4974bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk Context context = getActivity(); 4984bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk return getString(R.string.data_summary_format, 4994bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk Formatter.formatFileSize(context, totalBytes), 5004bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk DateUtils.formatDateTime(context, mChartData.detail.getStart(), 5014bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_MONTH)); 5024bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 5034bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk return getString(R.string.computing_size); 5044bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 5054bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 506cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk @Override 507cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk protected AlertDialog createDialog(int id, int errorCode) { 508cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk switch (id) { 509cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk case DLG_DISABLE: 510cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return new AlertDialog.Builder(getActivity()) 511cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setTitle(getActivity().getText(R.string.app_disable_dlg_title)) 512cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setMessage(getActivity().getText(R.string.app_disable_dlg_text)) 513cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() { 514cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public void onClick(DialogInterface dialog, int which) { 515cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Disable the app 516cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk new DisableChanger(InstalledAppDetails.this, mAppEntry.info, 517cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) 518cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .execute((Object)null); 519cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 520cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk }) 521cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setNegativeButton(R.string.dlg_cancel, null) 522cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .create(); 523cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk case DLG_SPECIAL_DISABLE: 524cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return new AlertDialog.Builder(getActivity()) 525cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setTitle(getActivity().getText(R.string.app_special_disable_dlg_title)) 526cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setMessage(getActivity().getText(R.string.app_special_disable_dlg_text)) 527cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() { 528cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public void onClick(DialogInterface dialog, int which) { 529cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Clear user data here 530cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk uninstallPkg(mAppEntry.info.packageName, 531cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk false, true); 532cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 533cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk }) 534cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setNegativeButton(R.string.dlg_cancel, null) 535cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .create(); 536cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk case DLG_FORCE_STOP: 537cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return new AlertDialog.Builder(getActivity()) 538cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setTitle(getActivity().getText(R.string.force_stop_dlg_title)) 539cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setMessage(getActivity().getText(R.string.force_stop_dlg_text)) 540cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() { 541cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public void onClick(DialogInterface dialog, int which) { 542cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Force stop 543cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk forceStopPackage(mAppEntry.info.packageName); 544cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 545cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk }) 546cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setNegativeButton(R.string.dlg_cancel, null) 547cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .create(); 548cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk case DLG_FACTORY_RESET: 549cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return new AlertDialog.Builder(getActivity()) 550cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setTitle(getActivity().getText(R.string.app_factory_reset_dlg_title)) 551cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setMessage(getActivity().getText(R.string.app_factory_reset_dlg_text)) 552cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() { 553cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public void onClick(DialogInterface dialog, int which) { 554cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Clear user data here 555cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk uninstallPkg(mAppEntry.info.packageName, 556cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk false, false); 557cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 558cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk }) 559cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setNegativeButton(R.string.dlg_cancel, null) 560cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .create(); 561cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 562cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return null; 56350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 56450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 5659072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn private void uninstallPkg(String packageName, boolean allUsers, boolean andDisable) { 56650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Create new intent to launch Uninstaller activity 56750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu Uri packageURI = Uri.parse("package:"+packageName); 5683db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageURI); 5693db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, allUsers); 5703db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn startActivityForResult(uninstallIntent, REQUEST_UNINSTALL); 5719072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mDisableAfterUninstall = andDisable; 57250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 57350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 57442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void forceStopPackage(String pkgName) { 575f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn ActivityManager am = (ActivityManager)getActivity().getSystemService( 57642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Context.ACTIVITY_SERVICE); 57742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu am.forceStopPackage(pkgName); 57807025891683aef83d850b0a91b37aa75b11ce33cJason Monk int userId = UserHandle.getUserId(mAppEntry.info.uid); 57907025891683aef83d850b0a91b37aa75b11ce33cJason Monk mState.invalidatePackage(pkgName, userId); 58007025891683aef83d850b0a91b37aa75b11ce33cJason Monk ApplicationsState.AppEntry newEnt = mState.getEntry(pkgName, userId); 581c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn if (newEnt != null) { 582c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn mAppEntry = newEnt; 583c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn } 584cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn checkForceStop(); 58542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 58642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 587861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn private void updateForceStopButton(boolean enabled) { 58830df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds if (mAppControlRestricted) { 58930df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds mForceStopButton.setEnabled(false); 59030df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds } else { 59130df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds mForceStopButton.setEnabled(enabled); 59230df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds mForceStopButton.setOnClickListener(InstalledAppDetails.this); 59330df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds } 594861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn } 595cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 596cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn private void checkForceStop() { 5975c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 5985c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn // User can't force stop device admin. 5995c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn updateForceStopButton(false); 6005c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn } else if ((mAppEntry.info.flags&ApplicationInfo.FLAG_STOPPED) == 0) { 601861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn // If the app isn't explicitly stopped, then always show the 602861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn // force stop button. 603861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn updateForceStopButton(true); 604861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn } else { 6055c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART, 6065c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn Uri.fromParts("package", mAppEntry.info.packageName, null)); 6075c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName }); 6085c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid); 609c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn intent.putExtra(Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(mAppEntry.info.uid)); 6108243c9a722e815bdcb069163de48877478c28dfdChristopher Tate getActivity().sendOrderedBroadcastAsUser(intent, UserHandle.CURRENT, null, 6118243c9a722e815bdcb069163de48877478c28dfdChristopher Tate mCheckKillProcessesReceiver, null, Activity.RESULT_CANCELED, null, null); 612861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn } 613cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn } 61470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler 61579021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov private void startManagePermissionsActivity() { 61679021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov // start new activity to manage app permissions 61779021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov Intent intent = new Intent(Intent.ACTION_MANAGE_APP_PERMISSIONS); 61879021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov intent.putExtra(Intent.EXTRA_PACKAGE_NAME, mAppEntry.info.packageName); 61979021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov try { 62079021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov startActivity(intent); 62179021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov } catch (ActivityNotFoundException e) { 62279021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov Log.w(LOG_TAG, "No app can handle android.intent.action.MANAGE_APP_PERMISSIONS"); 62379021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov } 62479021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov } 62579021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov 626cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private void startAppInfoFragment(Class<? extends AppInfoBase> fragment, CharSequence title) { 627cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // start new fragment to display extended information 628cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk Bundle args = new Bundle(); 629cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mAppEntry.info.packageName); 6309db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn 631cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk SettingsActivity sa = (SettingsActivity) getActivity(); 632cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk sa.startPreferencePanel(fragment.getName(), args, -1, title, this, SUB_INFO_FRAGMENT); 6339db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 6349db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn 635cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private void startNotifications() { 636cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // start new fragment to display extended information 637cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk getActivity().startActivity(new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS) 638cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) 639cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .putExtra(Settings.EXTRA_APP_PACKAGE, mAppEntry.info.packageName) 640cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .putExtra(Settings.EXTRA_APP_UID, mAppEntry.info.uid)); 6413465b67740e17711af2b36b09e2250a02275d860Jake Hamby } 6423465b67740e17711af2b36b09e2250a02275d860Jake Hamby 643afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 644afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Method implementing functionality of buttons clicked 645afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * @see android.view.View.OnClickListener#onClick(android.view.View) 646afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 647afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onClick(View v) { 6480f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn String packageName = mAppEntry.info.packageName; 64942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if(v == mUninstallButton) { 650dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 651dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk if (mAppEntry.info.enabled) { 652dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk if (mUpdatedSysApp) { 653dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk showDialogInner(DLG_SPECIAL_DISABLE, 0); 654f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn } else { 655dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk showDialogInner(DLG_DISABLE, 0); 656f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn } 6579db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } else { 658dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk new DisableChanger(this, mAppEntry.info, 659dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) 660dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk .execute((Object) null); 6619db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 662dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_INSTALLED) == 0) { 663dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk uninstallPkg(packageName, true, false); 664dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk } else { 665dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk uninstallPkg(packageName, false, false); 666afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 667afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mForceStopButton) { 668f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn showDialogInner(DLG_FORCE_STOP, 0); 6699db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn //forceStopPackage(mAppInfo.packageName); 670afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 671afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 672aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn 673aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn @Override 674cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public boolean onPreferenceClick(Preference preference) { 675cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk if (preference == mStoragePreference) { 676cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk startAppInfoFragment(AppStorageSettings.class, mStoragePreference.getTitle()); 677cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } else if (preference == mNotificationPreference) { 678cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk startNotifications(); 679cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } else if (preference == mPermissionsPreference) { 68079021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov startManagePermissionsActivity(); 681cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } else if (preference == mLaunchPreference) { 682cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk startAppInfoFragment(AppLaunchSettings.class, mLaunchPreference.getTitle()); 683cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } else if (preference == mDataPreference) { 6844bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk Bundle args = new Bundle(); 6854bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk args.putString(DataUsageSummary.EXTRA_SHOW_APP_IMMEDIATE_PKG, 6864bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mAppEntry.info.packageName); 6874bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 6884bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk SettingsActivity sa = (SettingsActivity) getActivity(); 6894bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk sa.startPreferencePanel(DataUsageSummary.class.getName(), args, -1, 6904bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk getString(R.string.app_data_usage), this, SUB_INFO_FRAGMENT); 6911eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } else if (preference == mBatteryPreference) { 6921eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk BatteryEntry entry = new BatteryEntry(getActivity(), null, mUserManager, mSipper); 6931eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk PowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(), 6941eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryHelper, BatteryStats.STATS_SINCE_CHARGED, entry, true); 695cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } else { 696cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return false; 697cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 698cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return true; 699cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 700cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 701cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public static CharSequence getNotificationSummary(AppEntry appEntry, Context context) { 702584b2b2bc17a4ccf42952b188722de1091c101beJason Monk return getNotificationSummary(appEntry, context, new NotificationBackend()); 703cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 704cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 705cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public static CharSequence getNotificationSummary(AppEntry appEntry, Context context, 706584b2b2bc17a4ccf42952b188722de1091c101beJason Monk NotificationBackend backend) { 707584b2b2bc17a4ccf42952b188722de1091c101beJason Monk AppRow appRow = backend.loadAppRow(context.getPackageManager(), appEntry.info); 708584b2b2bc17a4ccf42952b188722de1091c101beJason Monk return getNotificationSummary(appRow, context); 709584b2b2bc17a4ccf42952b188722de1091c101beJason Monk } 710584b2b2bc17a4ccf42952b188722de1091c101beJason Monk 711584b2b2bc17a4ccf42952b188722de1091c101beJason Monk public static CharSequence getNotificationSummary(AppRow appRow, Context context) { 712cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk if (appRow.banned) { 713cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return context.getString(R.string.notifications_disabled); 714cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 71525f9e326ab65e5298737721e959b22aea68148f1Jason Monk ArrayList<CharSequence> notifSummary = new ArrayList<>(); 71625f9e326ab65e5298737721e959b22aea68148f1Jason Monk if (appRow.priority) { 71725f9e326ab65e5298737721e959b22aea68148f1Jason Monk notifSummary.add(context.getString(R.string.notifications_priority)); 71825f9e326ab65e5298737721e959b22aea68148f1Jason Monk } 71925f9e326ab65e5298737721e959b22aea68148f1Jason Monk if (appRow.sensitive) { 72025f9e326ab65e5298737721e959b22aea68148f1Jason Monk notifSummary.add(context.getString(R.string.notifications_sensitive)); 72125f9e326ab65e5298737721e959b22aea68148f1Jason Monk } 72225f9e326ab65e5298737721e959b22aea68148f1Jason Monk if (!appRow.peekable) { 72325f9e326ab65e5298737721e959b22aea68148f1Jason Monk notifSummary.add(context.getString(R.string.notifications_no_peeking)); 72425f9e326ab65e5298737721e959b22aea68148f1Jason Monk } 72525f9e326ab65e5298737721e959b22aea68148f1Jason Monk switch (notifSummary.size()) { 72625f9e326ab65e5298737721e959b22aea68148f1Jason Monk case 3: 72725f9e326ab65e5298737721e959b22aea68148f1Jason Monk return context.getString(R.string.notifications_three_items, 72825f9e326ab65e5298737721e959b22aea68148f1Jason Monk notifSummary.get(0), notifSummary.get(1), notifSummary.get(2)); 72925f9e326ab65e5298737721e959b22aea68148f1Jason Monk case 2: 73025f9e326ab65e5298737721e959b22aea68148f1Jason Monk return context.getString(R.string.notifications_two_items, 73125f9e326ab65e5298737721e959b22aea68148f1Jason Monk notifSummary.get(0), notifSummary.get(1)); 73225f9e326ab65e5298737721e959b22aea68148f1Jason Monk case 1: 73325f9e326ab65e5298737721e959b22aea68148f1Jason Monk return notifSummary.get(0); 73425f9e326ab65e5298737721e959b22aea68148f1Jason Monk default: 73525f9e326ab65e5298737721e959b22aea68148f1Jason Monk return context.getString(R.string.notifications_enabled); 73625f9e326ab65e5298737721e959b22aea68148f1Jason Monk } 737cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 738cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 7391eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private class BatteryUpdater extends AsyncTask<Void, Void, Void> { 7401eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk @Override 7411eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk protected Void doInBackground(Void... params) { 7421eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryHelper.create((Bundle) null); 7431eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, 7441eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mUserManager.getUserProfiles()); 7451eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk List<BatterySipper> usageList = mBatteryHelper.getUsageList(); 7461eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk final int N = usageList.size(); 7471eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk for (int i = 0; i < N; i++) { 7481eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk BatterySipper sipper = usageList.get(i); 7491eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk if (sipper.getUid() == mPackageInfo.applicationInfo.uid) { 7501eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mSipper = sipper; 7511eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk break; 7521eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 7531eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 7541eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk return null; 7551eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 7561eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 7571eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk @Override 7581eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk protected void onPostExecute(Void result) { 7591eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk refreshUi(); 7601eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 7611eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 7621eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 7631eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private static class DisableChanger extends AsyncTask<Object, Object, Object> { 764cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk final PackageManager mPm; 765cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk final WeakReference<InstalledAppDetails> mActivity; 766cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk final ApplicationInfo mInfo; 767cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk final int mState; 768cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 769cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk DisableChanger(InstalledAppDetails activity, ApplicationInfo info, int state) { 770cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mPm = activity.mPm; 771cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mActivity = new WeakReference<InstalledAppDetails>(activity); 772cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mInfo = info; 773cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mState = state; 774cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 775cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 776cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk @Override 777cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk protected Object doInBackground(Object... params) { 778cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mPm.setApplicationEnabledSetting(mInfo.packageName, mState, 0); 779cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return null; 780aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } 781aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } 782cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 7834bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk private final LoaderCallbacks<ChartData> mDataCallbacks = new LoaderCallbacks<ChartData>() { 7844bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 7854bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk @Override 7864bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public Loader<ChartData> onCreateLoader(int id, Bundle args) { 7874bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk return new ChartDataLoader(getActivity(), mStatsSession, args); 7884bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 7894bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 7904bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk @Override 7914bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public void onLoadFinished(Loader<ChartData> loader, ChartData data) { 7924bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mChartData = data; 7934bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mDataPreference.setSummary(getDataSummary()); 7944bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 7954bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 7964bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk @Override 7974bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public void onLoaderReset(Loader<ChartData> loader) { 7984bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mChartData = null; 7994bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mDataPreference.setSummary(getDataSummary()); 8004bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 8014bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk }; 8024bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 803cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() { 804cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk @Override 805cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public void onReceive(Context context, Intent intent) { 806cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk updateForceStopButton(getResultCode() != Activity.RESULT_CANCELED); 807cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 808cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk }; 809afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 810afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 811cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 812