InstalledAppDetails.java revision 2cdafc6be386bb767404e42fc728a1a810aa896a
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; 2367cd6ab93a526fe65877743e458590f4e6f187eeTony Mantlerimport android.app.admin.DevicePolicyManager; 2479021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganovimport android.content.ActivityNotFoundException; 25cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackbornimport android.content.BroadcastReceiver; 26c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurkaimport android.content.ComponentName; 27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context; 28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.DialogInterface; 29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 304bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.content.Loader; 31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.ApplicationInfo; 3250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.content.pm.PackageInfo; 33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager; 34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException; 35cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport android.content.pm.ResolveInfo; 36d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevotimport android.content.pm.UserInfo; 37375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onukiimport android.content.res.Resources; 38375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onukiimport android.icu.text.ListFormatter; 392cdafc6be386bb767404e42fc728a1a810aa896aJason Monkimport android.graphics.drawable.Drawable; 404bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.net.INetworkStatsService; 414bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.net.INetworkStatsSession; 424bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.net.NetworkTemplate; 434bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.net.TrafficStats; 44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.Uri; 459db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackbornimport android.os.AsyncTask; 461eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport android.os.BatteryStats; 47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle; 484bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.os.RemoteException; 494bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.os.ServiceManager; 503db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.os.UserHandle; 51cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport android.preference.Preference; 52cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport android.preference.Preference.OnPreferenceClickListener; 532cdafc6be386bb767404e42fc728a1a810aa896aJason Monkimport android.text.TextUtils; 544bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.text.format.DateUtils; 554bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.text.format.Formatter; 5679021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganovimport android.util.Log; 572cdafc6be386bb767404e42fc728a1a810aa896aJason Monkimport android.view.LayoutInflater; 583db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.view.Menu; 593db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.view.MenuInflater; 603db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.view.MenuItem; 61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 622cdafc6be386bb767404e42fc728a1a810aa896aJason Monkimport android.view.ViewGroup; 63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button; 64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView; 65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView; 66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 678a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenimport com.android.internal.logging.MetricsLogger; 681eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport com.android.internal.os.BatterySipper; 691eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport com.android.internal.os.BatteryStatsHelper; 704bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport com.android.settings.DataUsageSummary; 714bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport com.android.settings.DataUsageSummary.AppItem; 72cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport com.android.settings.R; 73cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport com.android.settings.SettingsActivity; 74cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport com.android.settings.Utils; 75e9866b6dc47201630c057f946423d572b8c46af8Jason Monkimport com.android.settings.applications.PermissionsSummaryHelper.PermissionsResultCallback; 761eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport com.android.settings.fuelgauge.BatteryEntry; 771eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport com.android.settings.fuelgauge.PowerUsageDetail; 784bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport com.android.settings.net.ChartData; 794bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport com.android.settings.net.ChartDataLoader; 80255452fdf4b368f150477e818b326a60210f22c1Jason Monkimport com.android.settings.notification.AppNotificationSettings; 81584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport com.android.settings.notification.NotificationBackend; 82584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport com.android.settings.notification.NotificationBackend.AppRow; 8367cd6ab93a526fe65877743e458590f4e6f187eeTony Mantlerimport com.android.settingslib.applications.ApplicationsState; 8467cd6ab93a526fe65877743e458590f4e6f187eeTony Mantlerimport com.android.settingslib.applications.ApplicationsState.AppEntry; 85cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 86cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport java.lang.ref.WeakReference; 87cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport java.util.ArrayList; 88375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onukiimport java.util.Arrays; 89cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport java.util.HashSet; 90cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport java.util.List; 91cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display application information from Settings. This activity presents 94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * extended information associated with a package like code, data, total size, permissions 95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * used by the application and also the set of default launchable activities. 96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For system applications, an option to clear user data is displayed only if data size is > 0. 97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * System applications that do not want clear user data do not have this option. 98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For non-system applications, there is no option to clear data. Instead there is an option to 99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * uninstall the application. 100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 101cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkpublic class InstalledAppDetails extends AppInfoBase 102cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk implements View.OnClickListener, OnPreferenceClickListener { 103cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 10479021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov private static final String LOG_TAG = "InstalledAppDetails"; 10579021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov 106cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Menu identifiers 107cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public static final int UNINSTALL_ALL_USERS_MENU = 1; 108dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk public static final int UNINSTALL_UPDATES = 2; 109cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 110cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Result code identifiers 111cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public static final int REQUEST_UNINSTALL = 0; 112cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final int SUB_INFO_FRAGMENT = 1; 113cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 1144bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk private static final int LOADER_CHART_DATA = 2; 1154bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 116cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final int DLG_FORCE_STOP = DLG_BASE + 1; 117cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final int DLG_DISABLE = DLG_BASE + 2; 118cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final int DLG_SPECIAL_DISABLE = DLG_BASE + 3; 119cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final int DLG_FACTORY_RESET = DLG_BASE + 4; 120cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 121cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_HEADER = "header_view"; 122cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_NOTIFICATION = "notification_settings"; 123cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_STORAGE = "storage_settings"; 124cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_PERMISSION = "permission_settings"; 125cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_DATA = "data_settings"; 126cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_LAUNCH = "preferred_settings"; 1271eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private static final String KEY_BATTERY = "battery"; 128ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk private static final String KEY_MEMORY = "memory"; 129cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 130cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private final HashSet<String> mHomePackages = new HashSet<String>(); 131f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 132ab616d477be693fc455329953711264af0ed7814Dianne Hackborn private boolean mInitialized; 133ab616d477be693fc455329953711264af0ed7814Dianne Hackborn private boolean mShowUninstalled; 13460a09ea2388db01a661beeb9995a7ecf770a4200Jason Monk private LayoutPreference mHeader; 13542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private Button mUninstallButton; 13642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private boolean mUpdatedSysApp = false; 137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mForceStopButton; 138cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private Preference mNotificationPreference; 139cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private Preference mStoragePreference; 140cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private Preference mPermissionsPreference; 141cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private Preference mLaunchPreference; 142cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private Preference mDataPreference; 143ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk private Preference mMemoryPreference; 1448243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 1459072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn private boolean mDisableAfterUninstall; 146cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Used for updating notification preference. 147584b2b2bc17a4ccf42952b188722de1091c101beJason Monk private final NotificationBackend mBackend = new NotificationBackend(); 14842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 1494bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk private ChartData mChartData; 1504bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk private INetworkStatsSession mStatsSession; 1514bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 1521eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private Preference mBatteryPreference; 1531eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 1541eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private BatteryStatsHelper mBatteryHelper; 1551eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private BatterySipper mSipper; 1561eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 157ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk protected ProcStatsData mStatsManager; 158ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk protected ProcStatsPackageEntry mStats; 159ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk 1609072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn private boolean handleDisableable(Button button) { 1619072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn boolean disableable = false; 1628243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // Try to prevent the user from bricking their phone 1638243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // by not allowing disabling of apps signed with the 1648243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // system cert and any launcher app in the system. 165b58b5127040b3c843fe42544a89a1085cf7e74f6Dan Sandler if (mHomePackages.contains(mAppEntry.info.packageName) 166b58b5127040b3c843fe42544a89a1085cf7e74f6Dan Sandler || Utils.isSystemPackage(mPm, mPackageInfo)) { 1678243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // Disable button for core system applications. 1688243c9a722e815bdcb069163de48877478c28dfdChristopher Tate button.setText(R.string.disable_text); 1698243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } else if (mAppEntry.info.enabled) { 1708243c9a722e815bdcb069163de48877478c28dfdChristopher Tate button.setText(R.string.disable_text); 1718243c9a722e815bdcb069163de48877478c28dfdChristopher Tate disableable = true; 1728243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } else { 1738243c9a722e815bdcb069163de48877478c28dfdChristopher Tate button.setText(R.string.enable_text); 1748243c9a722e815bdcb069163de48877478c28dfdChristopher Tate disableable = true; 1759072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 1768243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 1779072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn return disableable; 1789072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 1799072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn 180de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu private void initUninstallButtons() { 181568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate final boolean isBundled = (mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0; 18242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu boolean enabled = true; 183dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk if (isBundled) { 184dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk enabled = handleDisableable(mUninstallButton); 18542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 186dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk if ((mPackageInfo.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED) == 0 1874de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn && mUserManager.getUsers().size() >= 2) { 1884de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // When we have multiple users, there is a separate menu 1894de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // to uninstall for all users. 190c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn enabled = false; 191b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu } 192dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk mUninstallButton.setText(R.string.uninstall_text); 19342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 194c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate // If this is a device admin, it can't be uninstalled or disabled. 1955c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn // We do this here so the text of the button is still set correctly. 1965c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 1975c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn enabled = false; 1985c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn } 199c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate 200d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot if (isProfileOrDeviceOwner(mPackageInfo.packageName)) { 201d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot enabled = false; 202d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot } 203d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot 204568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // Home apps need special handling. Bundled ones we don't risk downgrading 205568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // because that can interfere with home-key resolution. Furthermore, we 206568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // can't allow uninstallation of the only home app, and we don't want to 207568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // allow uninstallation of an explicitly preferred one -- the user can go 208568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // to Home settings and pick a different one, after which we'll permit 209568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // uninstallation of the now-not-default one. 210c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate if (enabled && mHomePackages.contains(mPackageInfo.packageName)) { 211568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate if (isBundled) { 212568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate enabled = false; 213c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate } else { 214568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate ArrayList<ResolveInfo> homeActivities = new ArrayList<ResolveInfo>(); 215568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate ComponentName currentDefaultHome = mPm.getHomeActivities(homeActivities); 216568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate if (currentDefaultHome == null) { 217568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // No preferred default, so permit uninstall only when 218568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // there is more than one candidate 219568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate enabled = (mHomePackages.size() > 1); 220568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate } else { 221568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // There is an explicit default home app -- forbid uninstall of 222568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // that one, but permit it for installed-but-inactive ones. 223568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate enabled = !mPackageInfo.packageName.equals(currentDefaultHome.getPackageName()); 224568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate } 225c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate } 226c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate } 227c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate 22830df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds if (mAppControlRestricted) { 22930df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds enabled = false; 23030df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds } 23130df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds 23242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setEnabled(enabled); 23342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (enabled) { 23442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Register listener 23542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setOnClickListener(this); 23642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 23742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 23842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 239d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot /** Returns if the supplied package is device owner or profile owner of at least one user */ 240d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot private boolean isProfileOrDeviceOwner(String packageName) { 241d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot List<UserInfo> userInfos = mUserManager.getUsers(); 242d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot DevicePolicyManager dpm = (DevicePolicyManager) 243d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot getContext().getSystemService(Context.DEVICE_POLICY_SERVICE); 244d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot if (packageName.equals(dpm.getDeviceOwner())) { 245d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot return true; 246d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot } 247d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot for (UserInfo userInfo : userInfos) { 248d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot ComponentName cn = dpm.getProfileOwnerAsUser(userInfo.id); 249d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot if (cn != null && cn.getPackageName().equals(packageName)) { 250d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot return true; 251d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot } 252d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot } 253d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot return false; 254d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot } 255d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot 256afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** Called when the activity is first created. */ 257afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 258f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onCreate(Bundle icicle) { 259afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(icicle); 2603db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 2610fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn setHasOptionsMenu(true); 262cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk addPreferencesFromResource(R.xml.installed_app_details); 2634bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 264b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk if (Utils.isBandwidthControlEnabled()) { 265b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk INetworkStatsService statsService = INetworkStatsService.Stub.asInterface( 266b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk ServiceManager.getService(Context.NETWORK_STATS_SERVICE)); 267b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk try { 268b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk mStatsSession = statsService.openSession(); 269b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk } catch (RemoteException e) { 270b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk throw new RuntimeException(e); 271b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk } 272b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk } else { 273b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk removePreference(KEY_DATA); 2744bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 2751eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryHelper = new BatteryStatsHelper(getActivity(), true); 2764bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 2774bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 2784bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk @Override 2798a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren protected int getMetricsCategory() { 2808a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren return MetricsLogger.APPLICATIONS_INSTALLED_APP_DETAILS; 2818a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren } 2828a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren 2838a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren @Override 2844bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public void onResume() { 2854bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk super.onResume(); 28665ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk if (mFinishing) { 28765ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk return; 28865ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk } 289646befdd16fee63fb399aec47950973b64add3baJason Monk mState.requestSize(mPackageName, mUserId); 2904bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk AppItem app = new AppItem(mAppEntry.info.uid); 2914bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk app.addUid(mAppEntry.info.uid); 292b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk if (mStatsSession != null) { 293b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk getLoaderManager().restartLoader(LOADER_CHART_DATA, 294b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk ChartDataLoader.buildArgs(getTemplate(getContext()), app), 295b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk mDataCallbacks); 296b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk } 29765ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk new BatteryUpdater().execute(); 298ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk new MemoryUpdater().execute(); 2994bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 3004bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 3014bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk @Override 3024bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public void onPause() { 3034bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk getLoaderManager().destroyLoader(LOADER_CHART_DATA); 3044bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk super.onPause(); 3054bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 3064bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 3074bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk @Override 3084bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public void onDestroy() { 3094bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk TrafficStats.closeQuietly(mStatsSession); 3104bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 3114bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk super.onDestroy(); 312f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 313f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 314cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public void onActivityCreated(Bundle savedInstanceState) { 315cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk super.onActivityCreated(savedInstanceState); 31665ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk if (mFinishing) { 31765ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk return; 31865ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk } 319cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk handleHeader(); 32038ba9a2d4350fc7d063ec21c994183258bf7a443Fabrice Di Meglio 321cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mNotificationPreference = findPreference(KEY_NOTIFICATION); 322cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mNotificationPreference.setOnPreferenceClickListener(this); 323cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mStoragePreference = findPreference(KEY_STORAGE); 324cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mStoragePreference.setOnPreferenceClickListener(this); 325cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mPermissionsPreference = findPreference(KEY_PERMISSION); 326cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mPermissionsPreference.setOnPreferenceClickListener(this); 327cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mDataPreference = findPreference(KEY_DATA); 328b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk if (mDataPreference != null) { 329b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk mDataPreference.setOnPreferenceClickListener(this); 330b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk } 3311eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference = findPreference(KEY_BATTERY); 3321eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference.setEnabled(false); 3331eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference.setOnPreferenceClickListener(this); 334ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mMemoryPreference = findPreference(KEY_MEMORY); 335ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mMemoryPreference.setOnPreferenceClickListener(this); 3368b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio 3378b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio mLaunchPreference = findPreference(KEY_LAUNCH); 338ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio if (mAppEntry.info != null) { 339ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio if ((mAppEntry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0 || 340ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio !mAppEntry.info.enabled) { 341ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio mLaunchPreference.setEnabled(false); 342ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio } else { 343ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio mLaunchPreference.setOnPreferenceClickListener(this); 344ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio } 3458b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio } else { 346ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio mLaunchPreference.setEnabled(false); 3478b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio } 348cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 3491f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn 350cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private void handleHeader() { 35160a09ea2388db01a661beeb9995a7ecf770a4200Jason Monk mHeader = (LayoutPreference) findPreference(KEY_HEADER); 3521f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn 35342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Get Control button panel 354cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk View btnPanel = mHeader.findViewById(R.id.control_buttons_panel); 355cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mForceStopButton = (Button) btnPanel.findViewById(R.id.right_button); 35642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mForceStopButton.setText(R.string.force_stop); 357cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mUninstallButton = (Button) btnPanel.findViewById(R.id.left_button); 358cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn mForceStopButton.setEnabled(false); 359afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 360f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu 3613db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 3623db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 363dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk menu.add(0, UNINSTALL_UPDATES, 0, R.string.app_factory_reset) 364dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 3653db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn menu.add(0, UNINSTALL_ALL_USERS_MENU, 1, R.string.uninstall_all_users_text) 3663db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 3673db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 3683db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 3693db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 3703db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public void onPrepareOptionsMenu(Menu menu) { 3713db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn boolean showIt = true; 3723db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (mUpdatedSysApp) { 3733db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 3740fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn } else if (mAppEntry == null) { 3750fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn showIt = false; 3763db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 3773db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 37854b3f501ca4a7ff88ead39247d2277d2efc82bb6Jeff Sharkey } else if (mPackageInfo == null || mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 3793db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 3803db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if (UserHandle.myUserId() != 0) { 3813db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 3827a1c4cdfae66e8b110de3988e65586871a969c04Amith Yamasani } else if (mUserManager.getUsers().size() < 2) { 3833db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 3843db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 3853db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn menu.findItem(UNINSTALL_ALL_USERS_MENU).setVisible(showIt); 386dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk mUpdatedSysApp = (mAppEntry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0; 387dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk menu.findItem(UNINSTALL_UPDATES).setVisible(mUpdatedSysApp && !mAppControlRestricted); 3883db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 3893db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 3903db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 3913db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public boolean onOptionsItemSelected(MenuItem item) { 392dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk switch (item.getItemId()) { 393dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk case UNINSTALL_ALL_USERS_MENU: 394dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk uninstallPkg(mAppEntry.info.packageName, true, false); 395dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk return true; 396dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk case UNINSTALL_UPDATES: 397dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk showDialogInner(DLG_FACTORY_RESET, 0); 398dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk return true; 3993db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4003db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn return false; 4013db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4023db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 4033db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 4043db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public void onActivityResult(int requestCode, int resultCode, Intent data) { 4053db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn super.onActivityResult(requestCode, resultCode, data); 4063db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (requestCode == REQUEST_UNINSTALL) { 4079072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn if (mDisableAfterUninstall) { 4089072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mDisableAfterUninstall = false; 4099072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn try { 4109072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn ApplicationInfo ainfo = getActivity().getPackageManager().getApplicationInfo( 4119072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mAppEntry.info.packageName, PackageManager.GET_UNINSTALLED_PACKAGES 4129072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn | PackageManager.GET_DISABLED_COMPONENTS); 4139072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn if ((ainfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0) { 4149072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn new DisableChanger(this, mAppEntry.info, 4159072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) 4169072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn .execute((Object)null); 4179072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 4189072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } catch (NameNotFoundException e) { 4199072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 4209072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 4213db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (!refreshUi()) { 4223db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn setIntentAndFinish(true, true); 4233db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4243db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4253db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4263db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 4270dd9902c89e7b705fd73158aadf1bf27843ad201Dianne Hackborn // Utility method to set application label and icon. 428f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu private void setAppLabelAndIcon(PackageInfo pkgInfo) { 429cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk final View appSnippet = mHeader.findViewById(R.id.app_snippet); 4300f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mState.ensureIcon(mAppEntry); 4312cdafc6be386bb767404e42fc728a1a810aa896aJason Monk setupAppSnippet(appSnippet, mAppEntry.label, mAppEntry.icon, 4322cdafc6be386bb767404e42fc728a1a810aa896aJason Monk pkgInfo != null ? pkgInfo.versionName : null); 43350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 43450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 4358243c9a722e815bdcb069163de48877478c28dfdChristopher Tate private boolean signaturesMatch(String pkg1, String pkg2) { 4368243c9a722e815bdcb069163de48877478c28dfdChristopher Tate if (pkg1 != null && pkg2 != null) { 4378243c9a722e815bdcb069163de48877478c28dfdChristopher Tate try { 4388243c9a722e815bdcb069163de48877478c28dfdChristopher Tate final int match = mPm.checkSignatures(pkg1, pkg2); 4398243c9a722e815bdcb069163de48877478c28dfdChristopher Tate if (match >= PackageManager.SIGNATURE_MATCH) { 4408243c9a722e815bdcb069163de48877478c28dfdChristopher Tate return true; 4418243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 4428243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } catch (Exception e) { 4438243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // e.g. named alternate package not found during lookup; 4448243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // this is an expected case sometimes 4458243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 4468243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 4478243c9a722e815bdcb069163de48877478c28dfdChristopher Tate return false; 4488243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 4498243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 450cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk @Override 451cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk protected boolean refreshUi() { 452cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk retrieveAppEntry(); 4530f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (mAppEntry == null) { 4540f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return false; // onCreate must have failed, make sure to exit 455b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown } 456b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani 457b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani if (mPackageInfo == null) { 4580f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return false; // onCreate must have failed, make sure to exit 45950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 460b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani 4618243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // Get list of "home" apps and trace through any meta-data references 4628243c9a722e815bdcb069163de48877478c28dfdChristopher Tate List<ResolveInfo> homeActivities = new ArrayList<ResolveInfo>(); 4638243c9a722e815bdcb069163de48877478c28dfdChristopher Tate mPm.getHomeActivities(homeActivities); 4648243c9a722e815bdcb069163de48877478c28dfdChristopher Tate mHomePackages.clear(); 4658243c9a722e815bdcb069163de48877478c28dfdChristopher Tate for (int i = 0; i< homeActivities.size(); i++) { 4668243c9a722e815bdcb069163de48877478c28dfdChristopher Tate ResolveInfo ri = homeActivities.get(i); 4678243c9a722e815bdcb069163de48877478c28dfdChristopher Tate final String activityPkg = ri.activityInfo.packageName; 4688243c9a722e815bdcb069163de48877478c28dfdChristopher Tate mHomePackages.add(activityPkg); 4698243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 4708243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // Also make sure to include anything proxying for the home app 4718243c9a722e815bdcb069163de48877478c28dfdChristopher Tate final Bundle metadata = ri.activityInfo.metaData; 4728243c9a722e815bdcb069163de48877478c28dfdChristopher Tate if (metadata != null) { 4738243c9a722e815bdcb069163de48877478c28dfdChristopher Tate final String metaPkg = metadata.getString(ActivityManager.META_HOME_ALTERNATE); 4748243c9a722e815bdcb069163de48877478c28dfdChristopher Tate if (signaturesMatch(metaPkg, activityPkg)) { 4758243c9a722e815bdcb069163de48877478c28dfdChristopher Tate mHomePackages.add(metaPkg); 4768243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 4778243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 4788243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 4798243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 4800f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn checkForceStop(); 4810f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn setAppLabelAndIcon(mPackageInfo); 482cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk initUninstallButtons(); 483cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 484cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Update the preference summaries. 485cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk Activity context = getActivity(); 486cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mStoragePreference.setSummary(AppStorageSettings.getSummary(mAppEntry, context)); 487375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki PermissionsSummaryHelper.getPermissionSummary(getContext(), mPackageName, 488e9866b6dc47201630c057f946423d572b8c46af8Jason Monk mPermissionCallback); 4898b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio mLaunchPreference.setSummary(Utils.getLaunchByDeafaultSummary(mAppEntry, mUsbManager, 490cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mPm, context)); 491cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mNotificationPreference.setSummary(getNotificationSummary(mAppEntry, context, 492cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mBackend)); 493b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk if (mDataPreference != null) { 494b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk mDataPreference.setSummary(getDataSummary()); 495b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk } 496ab616d477be693fc455329953711264af0ed7814Dianne Hackborn 4971eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk updateBattery(); 4981eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 499ab616d477be693fc455329953711264af0ed7814Dianne Hackborn if (!mInitialized) { 500ab616d477be693fc455329953711264af0ed7814Dianne Hackborn // First time init: are we displaying an uninstalled app? 501ab616d477be693fc455329953711264af0ed7814Dianne Hackborn mInitialized = true; 502ab616d477be693fc455329953711264af0ed7814Dianne Hackborn mShowUninstalled = (mAppEntry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0; 5034de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn } else { 5044de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // All other times: if the app no longer exists then we want 5054de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // to go away. 5069072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn try { 507cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk ApplicationInfo ainfo = context.getPackageManager().getApplicationInfo( 5089072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mAppEntry.info.packageName, PackageManager.GET_UNINSTALLED_PACKAGES 5099072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn | PackageManager.GET_DISABLED_COMPONENTS); 5104de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn if (!mShowUninstalled) { 5114de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // If we did not start out with the app uninstalled, then 5124de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // it transitioning to the uninstalled state for the current 5134de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // user means we should go away as well. 5144de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn return (ainfo.flags&ApplicationInfo.FLAG_INSTALLED) != 0; 5154de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn } 5169072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } catch (NameNotFoundException e) { 5179072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn return false; 5189072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 519ab616d477be693fc455329953711264af0ed7814Dianne Hackborn } 520ab616d477be693fc455329953711264af0ed7814Dianne Hackborn 5210f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return true; 522afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 5233465b67740e17711af2b36b09e2250a02275d860Jake Hamby 5241eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private void updateBattery() { 5251eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk if (mSipper != null) { 5261eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference.setEnabled(true); 5271eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk int dischargeAmount = mBatteryHelper.getStats().getDischargeAmount( 5281eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk BatteryStats.STATS_SINCE_CHARGED); 5291eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk final int percentOfMax = (int) ((mSipper.totalPowerMah) 5301eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk / mBatteryHelper.getTotalPower() * dischargeAmount + .5f); 5311eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference.setSummary(getString(R.string.battery_summary, percentOfMax)); 5321eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } else { 5331eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference.setEnabled(false); 5341eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference.setSummary(getString(R.string.no_battery_summary)); 5351eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 5361eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 5371eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 5384bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk private CharSequence getDataSummary() { 5394bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk if (mChartData != null) { 5404bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk long totalBytes = mChartData.detail.getTotalBytes(); 54151334310a26a29d3ac3ad4e7299110b6de0ae75cJason Monk if (totalBytes == 0) { 54251334310a26a29d3ac3ad4e7299110b6de0ae75cJason Monk return getString(R.string.no_data_usage); 54351334310a26a29d3ac3ad4e7299110b6de0ae75cJason Monk } 5444bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk Context context = getActivity(); 5454bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk return getString(R.string.data_summary_format, 5464bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk Formatter.formatFileSize(context, totalBytes), 5474bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk DateUtils.formatDateTime(context, mChartData.detail.getStart(), 5484bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_MONTH)); 5494bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 5504bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk return getString(R.string.computing_size); 5514bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 5524bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 553cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk @Override 554cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk protected AlertDialog createDialog(int id, int errorCode) { 555cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk switch (id) { 556cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk case DLG_DISABLE: 557cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return new AlertDialog.Builder(getActivity()) 558cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setTitle(getActivity().getText(R.string.app_disable_dlg_title)) 559cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setMessage(getActivity().getText(R.string.app_disable_dlg_text)) 560cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() { 561cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public void onClick(DialogInterface dialog, int which) { 562cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Disable the app 563cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk new DisableChanger(InstalledAppDetails.this, mAppEntry.info, 564cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) 565cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .execute((Object)null); 566cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 567cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk }) 568cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setNegativeButton(R.string.dlg_cancel, null) 569cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .create(); 570cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk case DLG_SPECIAL_DISABLE: 571cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return new AlertDialog.Builder(getActivity()) 572cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setTitle(getActivity().getText(R.string.app_special_disable_dlg_title)) 573cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setMessage(getActivity().getText(R.string.app_special_disable_dlg_text)) 574cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() { 575cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public void onClick(DialogInterface dialog, int which) { 576cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Clear user data here 577cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk uninstallPkg(mAppEntry.info.packageName, 578cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk false, true); 579cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 580cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk }) 581cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setNegativeButton(R.string.dlg_cancel, null) 582cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .create(); 583cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk case DLG_FORCE_STOP: 584cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return new AlertDialog.Builder(getActivity()) 585cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setTitle(getActivity().getText(R.string.force_stop_dlg_title)) 586cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setMessage(getActivity().getText(R.string.force_stop_dlg_text)) 587cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() { 588cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public void onClick(DialogInterface dialog, int which) { 589cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Force stop 590cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk forceStopPackage(mAppEntry.info.packageName); 591cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 592cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk }) 593cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setNegativeButton(R.string.dlg_cancel, null) 594cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .create(); 595cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk case DLG_FACTORY_RESET: 596cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return new AlertDialog.Builder(getActivity()) 597cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setTitle(getActivity().getText(R.string.app_factory_reset_dlg_title)) 598cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setMessage(getActivity().getText(R.string.app_factory_reset_dlg_text)) 599cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() { 600cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public void onClick(DialogInterface dialog, int which) { 601cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Clear user data here 602cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk uninstallPkg(mAppEntry.info.packageName, 603cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk false, false); 604cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 605cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk }) 606cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setNegativeButton(R.string.dlg_cancel, null) 607cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .create(); 608cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 609cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return null; 61050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 61150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 6129072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn private void uninstallPkg(String packageName, boolean allUsers, boolean andDisable) { 61350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Create new intent to launch Uninstaller activity 61450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu Uri packageURI = Uri.parse("package:"+packageName); 6153db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageURI); 6163db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, allUsers); 6173db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn startActivityForResult(uninstallIntent, REQUEST_UNINSTALL); 6189072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mDisableAfterUninstall = andDisable; 61950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 62050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 62142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void forceStopPackage(String pkgName) { 622f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn ActivityManager am = (ActivityManager)getActivity().getSystemService( 62342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Context.ACTIVITY_SERVICE); 62442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu am.forceStopPackage(pkgName); 62507025891683aef83d850b0a91b37aa75b11ce33cJason Monk int userId = UserHandle.getUserId(mAppEntry.info.uid); 62607025891683aef83d850b0a91b37aa75b11ce33cJason Monk mState.invalidatePackage(pkgName, userId); 62707025891683aef83d850b0a91b37aa75b11ce33cJason Monk ApplicationsState.AppEntry newEnt = mState.getEntry(pkgName, userId); 628c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn if (newEnt != null) { 629c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn mAppEntry = newEnt; 630c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn } 631cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn checkForceStop(); 63242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 63342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 634861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn private void updateForceStopButton(boolean enabled) { 63530df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds if (mAppControlRestricted) { 63630df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds mForceStopButton.setEnabled(false); 63730df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds } else { 63830df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds mForceStopButton.setEnabled(enabled); 63930df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds mForceStopButton.setOnClickListener(InstalledAppDetails.this); 64030df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds } 641861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn } 642cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 643cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn private void checkForceStop() { 6445c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 6455c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn // User can't force stop device admin. 6465c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn updateForceStopButton(false); 6475c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn } else if ((mAppEntry.info.flags&ApplicationInfo.FLAG_STOPPED) == 0) { 648861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn // If the app isn't explicitly stopped, then always show the 649861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn // force stop button. 650861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn updateForceStopButton(true); 651861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn } else { 6525c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART, 6535c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn Uri.fromParts("package", mAppEntry.info.packageName, null)); 6545c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName }); 6555c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid); 656c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn intent.putExtra(Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(mAppEntry.info.uid)); 6578243c9a722e815bdcb069163de48877478c28dfdChristopher Tate getActivity().sendOrderedBroadcastAsUser(intent, UserHandle.CURRENT, null, 6588243c9a722e815bdcb069163de48877478c28dfdChristopher Tate mCheckKillProcessesReceiver, null, Activity.RESULT_CANCELED, null, null); 659861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn } 660cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn } 66170b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler 66279021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov private void startManagePermissionsActivity() { 66379021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov // start new activity to manage app permissions 66479021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov Intent intent = new Intent(Intent.ACTION_MANAGE_APP_PERMISSIONS); 66579021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov intent.putExtra(Intent.EXTRA_PACKAGE_NAME, mAppEntry.info.packageName); 6668f600a4fbcddda07e724815c39ba7fa6f9194e1cJason Monk intent.putExtra(AppInfoWithHeader.EXTRA_HIDE_INFO_BUTTON, true); 66779021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov try { 66879021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov startActivity(intent); 66979021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov } catch (ActivityNotFoundException e) { 67079021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov Log.w(LOG_TAG, "No app can handle android.intent.action.MANAGE_APP_PERMISSIONS"); 67179021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov } 67279021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov } 67379021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov 674255452fdf4b368f150477e818b326a60210f22c1Jason Monk private void startAppInfoFragment(Class<?> fragment, CharSequence title) { 675cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // start new fragment to display extended information 676cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk Bundle args = new Bundle(); 677255452fdf4b368f150477e818b326a60210f22c1Jason Monk args.putString(ARG_PACKAGE_NAME, mAppEntry.info.packageName); 678255452fdf4b368f150477e818b326a60210f22c1Jason Monk args.putInt(ARG_PACKAGE_UID, mAppEntry.info.uid); 6798f600a4fbcddda07e724815c39ba7fa6f9194e1cJason Monk args.putBoolean(AppInfoWithHeader.EXTRA_HIDE_INFO_BUTTON, true); 6809db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn 681cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk SettingsActivity sa = (SettingsActivity) getActivity(); 682cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk sa.startPreferencePanel(fragment.getName(), args, -1, title, this, SUB_INFO_FRAGMENT); 6839db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 6849db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn 685afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 686afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Method implementing functionality of buttons clicked 687afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * @see android.view.View.OnClickListener#onClick(android.view.View) 688afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 689afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onClick(View v) { 6900f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn String packageName = mAppEntry.info.packageName; 69142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if(v == mUninstallButton) { 692dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 693dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk if (mAppEntry.info.enabled) { 694dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk if (mUpdatedSysApp) { 695dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk showDialogInner(DLG_SPECIAL_DISABLE, 0); 696f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn } else { 697dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk showDialogInner(DLG_DISABLE, 0); 698f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn } 6999db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } else { 700dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk new DisableChanger(this, mAppEntry.info, 701dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) 702dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk .execute((Object) null); 7039db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 704dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_INSTALLED) == 0) { 705dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk uninstallPkg(packageName, true, false); 706dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk } else { 707dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk uninstallPkg(packageName, false, false); 708afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 709afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mForceStopButton) { 710f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn showDialogInner(DLG_FORCE_STOP, 0); 7119db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn //forceStopPackage(mAppInfo.packageName); 712afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 713afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 714aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn 715aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn @Override 716cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public boolean onPreferenceClick(Preference preference) { 717cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk if (preference == mStoragePreference) { 718cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk startAppInfoFragment(AppStorageSettings.class, mStoragePreference.getTitle()); 719cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } else if (preference == mNotificationPreference) { 720255452fdf4b368f150477e818b326a60210f22c1Jason Monk startAppInfoFragment(AppNotificationSettings.class, 721255452fdf4b368f150477e818b326a60210f22c1Jason Monk getString(R.string.app_notifications_title)); 722cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } else if (preference == mPermissionsPreference) { 72379021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov startManagePermissionsActivity(); 724cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } else if (preference == mLaunchPreference) { 725cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk startAppInfoFragment(AppLaunchSettings.class, mLaunchPreference.getTitle()); 726ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } else if (preference == mMemoryPreference) { 727ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk ProcessStatsBase.launchMemoryDetail((SettingsActivity) getActivity(), 728ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mStatsManager.getMemInfo(), mStats); 729cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } else if (preference == mDataPreference) { 7304bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk Bundle args = new Bundle(); 7314bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk args.putString(DataUsageSummary.EXTRA_SHOW_APP_IMMEDIATE_PKG, 7324bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mAppEntry.info.packageName); 7334bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 7344bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk SettingsActivity sa = (SettingsActivity) getActivity(); 7354bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk sa.startPreferencePanel(DataUsageSummary.class.getName(), args, -1, 7364bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk getString(R.string.app_data_usage), this, SUB_INFO_FRAGMENT); 7371eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } else if (preference == mBatteryPreference) { 7381eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk BatteryEntry entry = new BatteryEntry(getActivity(), null, mUserManager, mSipper); 7391eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk PowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(), 7401eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryHelper, BatteryStats.STATS_SINCE_CHARGED, entry, true); 741cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } else { 742cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return false; 743cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 744cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return true; 745cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 746cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 7472cdafc6be386bb767404e42fc728a1a810aa896aJason Monk public static void setupAppSnippet(View appSnippet, CharSequence label, Drawable icon, 7482cdafc6be386bb767404e42fc728a1a810aa896aJason Monk CharSequence versionName) { 7492cdafc6be386bb767404e42fc728a1a810aa896aJason Monk LayoutInflater.from(appSnippet.getContext()).inflate(R.layout.widget_text_views, 7502cdafc6be386bb767404e42fc728a1a810aa896aJason Monk (ViewGroup) appSnippet.findViewById(android.R.id.widget_frame)); 7512cdafc6be386bb767404e42fc728a1a810aa896aJason Monk 7522cdafc6be386bb767404e42fc728a1a810aa896aJason Monk ImageView iconView = (ImageView) appSnippet.findViewById(android.R.id.icon); 7532cdafc6be386bb767404e42fc728a1a810aa896aJason Monk iconView.setImageDrawable(icon); 7542cdafc6be386bb767404e42fc728a1a810aa896aJason Monk // Set application name. 7552cdafc6be386bb767404e42fc728a1a810aa896aJason Monk TextView labelView = (TextView) appSnippet.findViewById(android.R.id.title); 7562cdafc6be386bb767404e42fc728a1a810aa896aJason Monk labelView.setText(label); 7572cdafc6be386bb767404e42fc728a1a810aa896aJason Monk // Version number of application 7582cdafc6be386bb767404e42fc728a1a810aa896aJason Monk TextView appVersion = (TextView) appSnippet.findViewById(R.id.widget_text1); 7592cdafc6be386bb767404e42fc728a1a810aa896aJason Monk 7602cdafc6be386bb767404e42fc728a1a810aa896aJason Monk if (!TextUtils.isEmpty(versionName)) { 7612cdafc6be386bb767404e42fc728a1a810aa896aJason Monk appVersion.setVisibility(View.VISIBLE); 7622cdafc6be386bb767404e42fc728a1a810aa896aJason Monk appVersion.setText(appSnippet.getContext().getString(R.string.version_text, 7632cdafc6be386bb767404e42fc728a1a810aa896aJason Monk String.valueOf(versionName))); 7642cdafc6be386bb767404e42fc728a1a810aa896aJason Monk } else { 7652cdafc6be386bb767404e42fc728a1a810aa896aJason Monk appVersion.setVisibility(View.INVISIBLE); 7662cdafc6be386bb767404e42fc728a1a810aa896aJason Monk } 7672cdafc6be386bb767404e42fc728a1a810aa896aJason Monk } 7682cdafc6be386bb767404e42fc728a1a810aa896aJason Monk 76910e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk private static NetworkTemplate getTemplate(Context context) { 77010e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk if (DataUsageSummary.hasReadyMobileRadio(context)) { 77110e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk return NetworkTemplate.buildTemplateMobileWildcard(); 77210e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk } 77310e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk if (DataUsageSummary.hasWifiRadio(context)) { 77410e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk return NetworkTemplate.buildTemplateWifiWildcard(); 77510e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk } 77610e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk return NetworkTemplate.buildTemplateEthernet(); 77710e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk } 77810e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk 779cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public static CharSequence getNotificationSummary(AppEntry appEntry, Context context) { 780584b2b2bc17a4ccf42952b188722de1091c101beJason Monk return getNotificationSummary(appEntry, context, new NotificationBackend()); 781cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 782cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 783cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public static CharSequence getNotificationSummary(AppEntry appEntry, Context context, 784584b2b2bc17a4ccf42952b188722de1091c101beJason Monk NotificationBackend backend) { 785584b2b2bc17a4ccf42952b188722de1091c101beJason Monk AppRow appRow = backend.loadAppRow(context.getPackageManager(), appEntry.info); 786584b2b2bc17a4ccf42952b188722de1091c101beJason Monk return getNotificationSummary(appRow, context); 787584b2b2bc17a4ccf42952b188722de1091c101beJason Monk } 788584b2b2bc17a4ccf42952b188722de1091c101beJason Monk 789584b2b2bc17a4ccf42952b188722de1091c101beJason Monk public static CharSequence getNotificationSummary(AppRow appRow, Context context) { 790cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk if (appRow.banned) { 791cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return context.getString(R.string.notifications_disabled); 792cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 79325f9e326ab65e5298737721e959b22aea68148f1Jason Monk ArrayList<CharSequence> notifSummary = new ArrayList<>(); 79425f9e326ab65e5298737721e959b22aea68148f1Jason Monk if (appRow.priority) { 79525f9e326ab65e5298737721e959b22aea68148f1Jason Monk notifSummary.add(context.getString(R.string.notifications_priority)); 79625f9e326ab65e5298737721e959b22aea68148f1Jason Monk } 79725f9e326ab65e5298737721e959b22aea68148f1Jason Monk if (appRow.sensitive) { 79825f9e326ab65e5298737721e959b22aea68148f1Jason Monk notifSummary.add(context.getString(R.string.notifications_sensitive)); 79925f9e326ab65e5298737721e959b22aea68148f1Jason Monk } 80025f9e326ab65e5298737721e959b22aea68148f1Jason Monk if (!appRow.peekable) { 80125f9e326ab65e5298737721e959b22aea68148f1Jason Monk notifSummary.add(context.getString(R.string.notifications_no_peeking)); 80225f9e326ab65e5298737721e959b22aea68148f1Jason Monk } 80325f9e326ab65e5298737721e959b22aea68148f1Jason Monk switch (notifSummary.size()) { 80425f9e326ab65e5298737721e959b22aea68148f1Jason Monk case 3: 80525f9e326ab65e5298737721e959b22aea68148f1Jason Monk return context.getString(R.string.notifications_three_items, 80625f9e326ab65e5298737721e959b22aea68148f1Jason Monk notifSummary.get(0), notifSummary.get(1), notifSummary.get(2)); 80725f9e326ab65e5298737721e959b22aea68148f1Jason Monk case 2: 80825f9e326ab65e5298737721e959b22aea68148f1Jason Monk return context.getString(R.string.notifications_two_items, 80925f9e326ab65e5298737721e959b22aea68148f1Jason Monk notifSummary.get(0), notifSummary.get(1)); 81025f9e326ab65e5298737721e959b22aea68148f1Jason Monk case 1: 81125f9e326ab65e5298737721e959b22aea68148f1Jason Monk return notifSummary.get(0); 81225f9e326ab65e5298737721e959b22aea68148f1Jason Monk default: 81325f9e326ab65e5298737721e959b22aea68148f1Jason Monk return context.getString(R.string.notifications_enabled); 81425f9e326ab65e5298737721e959b22aea68148f1Jason Monk } 815cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 816cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 817ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk private class MemoryUpdater extends AsyncTask<Void, Void, ProcStatsPackageEntry> { 818ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk 819ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk @Override 820ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk protected ProcStatsPackageEntry doInBackground(Void... params) { 821ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk if (mPackageInfo == null) { 822ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk return null; 823ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 824ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk if (mStatsManager == null) { 825ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mStatsManager = new ProcStatsData(getActivity(), false); 826ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mStatsManager.setDuration(ProcessStatsBase.sDurations[0]); 827ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 828ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mStatsManager.refreshStats(true); 829ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk for (ProcStatsPackageEntry pkgEntry : mStatsManager.getEntries()) { 830ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk for (ProcStatsEntry entry : pkgEntry.mEntries) { 831ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk if (entry.mUid == mPackageInfo.applicationInfo.uid) { 832ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk pkgEntry.updateMetrics(); 833ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk return pkgEntry; 834ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 835ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 836ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 837ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk return null; 838ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 839ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk 840ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk @Override 841ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk protected void onPostExecute(ProcStatsPackageEntry entry) { 842ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk if (getActivity() == null) { 843ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk return; 844ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 845ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk if (entry != null) { 846ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mStats = entry; 847ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mMemoryPreference.setEnabled(true); 848ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk double amount = Math.max(entry.mRunWeight, entry.mBgWeight) 849ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk * mStatsManager.getMemInfo().weightToRam; 850ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mMemoryPreference.setSummary(getString(R.string.memory_use_summary, 851ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk Formatter.formatShortFileSize(getContext(), (long) amount))); 852ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } else { 853ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mMemoryPreference.setEnabled(false); 854ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mMemoryPreference.setSummary(getString(R.string.no_memory_use_summary)); 855ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 856ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 857ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk 858ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 859ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk 8601eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private class BatteryUpdater extends AsyncTask<Void, Void, Void> { 8611eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk @Override 8621eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk protected Void doInBackground(Void... params) { 8631eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryHelper.create((Bundle) null); 8641eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, 8651eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mUserManager.getUserProfiles()); 8661eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk List<BatterySipper> usageList = mBatteryHelper.getUsageList(); 8671eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk final int N = usageList.size(); 8681eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk for (int i = 0; i < N; i++) { 8691eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk BatterySipper sipper = usageList.get(i); 8701eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk if (sipper.getUid() == mPackageInfo.applicationInfo.uid) { 8711eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mSipper = sipper; 8721eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk break; 8731eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 8741eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 8751eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk return null; 8761eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 8771eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 8781eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk @Override 8791eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk protected void onPostExecute(Void result) { 880ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk if (getActivity() == null) { 881ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk return; 882ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 8831eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk refreshUi(); 8841eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 8851eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 8861eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 8871eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private static class DisableChanger extends AsyncTask<Object, Object, Object> { 888cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk final PackageManager mPm; 889cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk final WeakReference<InstalledAppDetails> mActivity; 890cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk final ApplicationInfo mInfo; 891cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk final int mState; 892cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 893cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk DisableChanger(InstalledAppDetails activity, ApplicationInfo info, int state) { 894cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mPm = activity.mPm; 895cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mActivity = new WeakReference<InstalledAppDetails>(activity); 896cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mInfo = info; 897cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mState = state; 898cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 899cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 900cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk @Override 901cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk protected Object doInBackground(Object... params) { 902cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mPm.setApplicationEnabledSetting(mInfo.packageName, mState, 0); 903cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return null; 904aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } 905aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } 906cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 9074bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk private final LoaderCallbacks<ChartData> mDataCallbacks = new LoaderCallbacks<ChartData>() { 9084bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 9094bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk @Override 9104bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public Loader<ChartData> onCreateLoader(int id, Bundle args) { 9114bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk return new ChartDataLoader(getActivity(), mStatsSession, args); 9124bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 9134bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 9144bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk @Override 9154bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public void onLoadFinished(Loader<ChartData> loader, ChartData data) { 9164bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mChartData = data; 9174bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mDataPreference.setSummary(getDataSummary()); 9184bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 9194bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 9204bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk @Override 9214bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public void onLoaderReset(Loader<ChartData> loader) { 9224bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mChartData = null; 9234bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mDataPreference.setSummary(getDataSummary()); 9244bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 9254bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk }; 9264bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 927cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() { 928cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk @Override 929cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public void onReceive(Context context, Intent intent) { 930cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk updateForceStopButton(getResultCode() != Activity.RESULT_CANCELED); 931cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 932cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk }; 933e9866b6dc47201630c057f946423d572b8c46af8Jason Monk 934375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki private final PermissionsResultCallback mPermissionCallback 935375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki = new PermissionsResultCallback() { 936e9866b6dc47201630c057f946423d572b8c46af8Jason Monk @Override 937375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki public void onPermissionSummaryResult(int[] counts, CharSequence[] groupLabels) { 938375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki final Resources res = getResources(); 939375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki CharSequence summary = null; 940375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki boolean enabled = false; 941375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki if (counts != null) { 942375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki int totalCount = counts[1]; 943375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki int additionalCounts = counts[2]; 944375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki 945375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki if (totalCount == 0) { 946375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki summary = res.getString( 947375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki R.string.runtime_permissions_summary_no_permissions_requested); 948375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki } else { 949375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki enabled = true; 950375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki 951375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki final ArrayList<CharSequence> list = new ArrayList(Arrays.asList(groupLabels)); 952375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki if (additionalCounts > 0) { 953375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki // N additional permissions. 954375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki list.add(res.getQuantityString( 955375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki R.plurals.runtime_permissions_additional_count, 956375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki additionalCounts, additionalCounts)); 957375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki } 958375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki if (list.size() == 0) { 959375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki summary = res.getString( 960375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki R.string.runtime_permissions_summary_no_permissions_granted); 961375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki } else { 962375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki summary = ListFormatter.getInstance().format(list); 963375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki } 964375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki } 965e9866b6dc47201630c057f946423d572b8c46af8Jason Monk } 966375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki mPermissionsPreference.setSummary(summary); 967375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki mPermissionsPreference.setEnabled(enabled); 968e9866b6dc47201630c057f946423d572b8c46af8Jason Monk } 969e9866b6dc47201630c057f946423d572b8c46af8Jason Monk }; 970afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 971