InstalledAppDetails.java revision b37e2887d3112082589997f1bbd802ec282cca6d
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; 382cdafc6be386bb767404e42fc728a1a810aa896aJason Monkimport android.graphics.drawable.Drawable; 39b37e2887d3112082589997f1bbd802ec282cca6dJason Monkimport android.icu.text.ListFormatter; 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; 5139b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference; 5239b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.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; 668a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenimport com.android.internal.logging.MetricsLogger; 671eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport com.android.internal.os.BatterySipper; 681eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport com.android.internal.os.BatteryStatsHelper; 69e492ee06adbf4661d8b8b53f41f236c9173c5ca4Julia Reynoldsimport com.android.settings.AppHeader; 70cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport com.android.settings.R; 71cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport com.android.settings.SettingsActivity; 72cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport com.android.settings.Utils; 73e9866b6dc47201630c057f946423d572b8c46af8Jason Monkimport com.android.settings.applications.PermissionsSummaryHelper.PermissionsResultCallback; 74b37e2887d3112082589997f1bbd802ec282cca6dJason Monkimport com.android.settings.datausage.AppDataUsage; 75b37e2887d3112082589997f1bbd802ec282cca6dJason Monkimport com.android.settings.datausage.DataUsageList; 76b37e2887d3112082589997f1bbd802ec282cca6dJason Monkimport com.android.settings.datausage.DataUsageSummary; 771eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport com.android.settings.fuelgauge.BatteryEntry; 781eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport com.android.settings.fuelgauge.PowerUsageDetail; 79255452fdf4b368f150477e818b326a60210f22c1Jason Monkimport com.android.settings.notification.AppNotificationSettings; 80584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport com.android.settings.notification.NotificationBackend; 81584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport com.android.settings.notification.NotificationBackend.AppRow; 82de557d48badd10b7313ea2b40ff8156577a14678Wei Liuimport com.android.settingslib.AppItem; 834f4424a820688638930f871ad421e05588549ae5Tony Mantlerimport com.android.settingslib.applications.AppUtils; 84de557d48badd10b7313ea2b40ff8156577a14678Wei Liuimport com.android.settingslib.applications.ApplicationsState; 8539b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport com.android.settingslib.applications.ApplicationsState.AppEntry; 86de557d48badd10b7313ea2b40ff8156577a14678Wei Liuimport com.android.settingslib.net.ChartData; 87de557d48badd10b7313ea2b40ff8156577a14678Wei Liuimport com.android.settingslib.net.ChartDataLoader; 88cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 89cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport java.lang.ref.WeakReference; 90cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport java.util.ArrayList; 91375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onukiimport java.util.Arrays; 92cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport java.util.HashSet; 93cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport java.util.List; 94cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display application information from Settings. This activity presents 97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * extended information associated with a package like code, data, total size, permissions 98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * used by the application and also the set of default launchable activities. 99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For system applications, an option to clear user data is displayed only if data size is > 0. 100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * System applications that do not want clear user data do not have this option. 101afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For non-system applications, there is no option to clear data. Instead there is an option to 102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * uninstall the application. 103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 104cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkpublic class InstalledAppDetails extends AppInfoBase 105cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk implements View.OnClickListener, OnPreferenceClickListener { 106cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 10779021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov private static final String LOG_TAG = "InstalledAppDetails"; 10879021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov 109cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Menu identifiers 110cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public static final int UNINSTALL_ALL_USERS_MENU = 1; 111dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk public static final int UNINSTALL_UPDATES = 2; 112cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 113cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Result code identifiers 114cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public static final int REQUEST_UNINSTALL = 0; 115cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final int SUB_INFO_FRAGMENT = 1; 116cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 1174bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk private static final int LOADER_CHART_DATA = 2; 1184bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 119cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final int DLG_FORCE_STOP = DLG_BASE + 1; 120cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final int DLG_DISABLE = DLG_BASE + 2; 121cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final int DLG_SPECIAL_DISABLE = DLG_BASE + 3; 122cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final int DLG_FACTORY_RESET = DLG_BASE + 4; 123cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 124cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_HEADER = "header_view"; 125cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_NOTIFICATION = "notification_settings"; 126cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_STORAGE = "storage_settings"; 127cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_PERMISSION = "permission_settings"; 128cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_DATA = "data_settings"; 129cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_LAUNCH = "preferred_settings"; 1301eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private static final String KEY_BATTERY = "battery"; 131ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk private static final String KEY_MEMORY = "memory"; 132cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 133cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private final HashSet<String> mHomePackages = new HashSet<String>(); 134f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 135ab616d477be693fc455329953711264af0ed7814Dianne Hackborn private boolean mInitialized; 136ab616d477be693fc455329953711264af0ed7814Dianne Hackborn private boolean mShowUninstalled; 13760a09ea2388db01a661beeb9995a7ecf770a4200Jason Monk private LayoutPreference mHeader; 13842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private Button mUninstallButton; 13942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private boolean mUpdatedSysApp = false; 140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mForceStopButton; 141cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private Preference mNotificationPreference; 142cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private Preference mStoragePreference; 143cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private Preference mPermissionsPreference; 144cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private Preference mLaunchPreference; 145cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private Preference mDataPreference; 146ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk private Preference mMemoryPreference; 1478243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 1489072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn private boolean mDisableAfterUninstall; 149cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Used for updating notification preference. 150584b2b2bc17a4ccf42952b188722de1091c101beJason Monk private final NotificationBackend mBackend = new NotificationBackend(); 15142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 1524bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk private ChartData mChartData; 1534bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk private INetworkStatsSession mStatsSession; 1544bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 1551eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private Preference mBatteryPreference; 1561eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 1571eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private BatteryStatsHelper mBatteryHelper; 1581eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private BatterySipper mSipper; 1591eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 160ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk protected ProcStatsData mStatsManager; 161ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk protected ProcStatsPackageEntry mStats; 162ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk 163d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk private BroadcastReceiver mPermissionReceiver; 164d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk 1659072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn private boolean handleDisableable(Button button) { 1669072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn boolean disableable = false; 1678243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // Try to prevent the user from bricking their phone 1688243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // by not allowing disabling of apps signed with the 1698243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // system cert and any launcher app in the system. 170b58b5127040b3c843fe42544a89a1085cf7e74f6Dan Sandler if (mHomePackages.contains(mAppEntry.info.packageName) 171b58b5127040b3c843fe42544a89a1085cf7e74f6Dan Sandler || Utils.isSystemPackage(mPm, mPackageInfo)) { 1728243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // Disable button for core system applications. 1738243c9a722e815bdcb069163de48877478c28dfdChristopher Tate button.setText(R.string.disable_text); 17477537b697b411df54dedd65b1e5ca4eb5dd00846Jason Monk } else if (mAppEntry.info.enabled && !isDisabledUntilUsed()) { 1758243c9a722e815bdcb069163de48877478c28dfdChristopher Tate button.setText(R.string.disable_text); 1768243c9a722e815bdcb069163de48877478c28dfdChristopher Tate disableable = true; 1778243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } else { 1788243c9a722e815bdcb069163de48877478c28dfdChristopher Tate button.setText(R.string.enable_text); 1798243c9a722e815bdcb069163de48877478c28dfdChristopher Tate disableable = true; 1809072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 1818243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 1829072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn return disableable; 1839072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 1849072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn 18577537b697b411df54dedd65b1e5ca4eb5dd00846Jason Monk private boolean isDisabledUntilUsed() { 18677537b697b411df54dedd65b1e5ca4eb5dd00846Jason Monk return mAppEntry.info.enabledSetting 18777537b697b411df54dedd65b1e5ca4eb5dd00846Jason Monk == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED; 18877537b697b411df54dedd65b1e5ca4eb5dd00846Jason Monk } 18977537b697b411df54dedd65b1e5ca4eb5dd00846Jason Monk 190de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu private void initUninstallButtons() { 191568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate final boolean isBundled = (mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0; 19242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu boolean enabled = true; 193dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk if (isBundled) { 194dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk enabled = handleDisableable(mUninstallButton); 19542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 196dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk if ((mPackageInfo.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED) == 0 1974de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn && mUserManager.getUsers().size() >= 2) { 1984de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // When we have multiple users, there is a separate menu 1994de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // to uninstall for all users. 200c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn enabled = false; 201b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu } 202dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk mUninstallButton.setText(R.string.uninstall_text); 20342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 204c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate // If this is a device admin, it can't be uninstalled or disabled. 2055c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn // We do this here so the text of the button is still set correctly. 2065c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 2075c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn enabled = false; 2085c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn } 209c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate 2104cfe39f5397d037d106abf07db31b0e01484bd92Makoto Onuki // We don't allow uninstalling DO/PO on *any* users, because if it's a system app, 2114cfe39f5397d037d106abf07db31b0e01484bd92Makoto Onuki // "uninstall" is actually "downgrade to the system version + disable", and "downgrade" 2124cfe39f5397d037d106abf07db31b0e01484bd92Makoto Onuki // will clear data on all users. 213d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot if (isProfileOrDeviceOwner(mPackageInfo.packageName)) { 214d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot enabled = false; 215d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot } 216d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot 217568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // Home apps need special handling. Bundled ones we don't risk downgrading 218568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // because that can interfere with home-key resolution. Furthermore, we 219568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // can't allow uninstallation of the only home app, and we don't want to 220568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // allow uninstallation of an explicitly preferred one -- the user can go 221568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // to Home settings and pick a different one, after which we'll permit 222568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // uninstallation of the now-not-default one. 223c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate if (enabled && mHomePackages.contains(mPackageInfo.packageName)) { 224568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate if (isBundled) { 225568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate enabled = false; 226c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate } else { 227568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate ArrayList<ResolveInfo> homeActivities = new ArrayList<ResolveInfo>(); 228568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate ComponentName currentDefaultHome = mPm.getHomeActivities(homeActivities); 229568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate if (currentDefaultHome == null) { 230568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // No preferred default, so permit uninstall only when 231568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // there is more than one candidate 232568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate enabled = (mHomePackages.size() > 1); 233568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate } else { 234568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // There is an explicit default home app -- forbid uninstall of 235568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // that one, but permit it for installed-but-inactive ones. 236568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate enabled = !mPackageInfo.packageName.equals(currentDefaultHome.getPackageName()); 237568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate } 238c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate } 239c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate } 240c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate 24130df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds if (mAppControlRestricted) { 24230df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds enabled = false; 24330df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds } 24430df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds 24542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setEnabled(enabled); 24642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (enabled) { 24742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Register listener 24842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setOnClickListener(this); 24942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 25042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 25142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 252d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot /** Returns if the supplied package is device owner or profile owner of at least one user */ 253d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot private boolean isProfileOrDeviceOwner(String packageName) { 254d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot List<UserInfo> userInfos = mUserManager.getUsers(); 255d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot DevicePolicyManager dpm = (DevicePolicyManager) 256d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot getContext().getSystemService(Context.DEVICE_POLICY_SERVICE); 2574cfe39f5397d037d106abf07db31b0e01484bd92Makoto Onuki if (dpm.isDeviceOwnerAppOnAnyUser(packageName)) { 258d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot return true; 259d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot } 260d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot for (UserInfo userInfo : userInfos) { 261d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot ComponentName cn = dpm.getProfileOwnerAsUser(userInfo.id); 262d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot if (cn != null && cn.getPackageName().equals(packageName)) { 263d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot return true; 264d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot } 265d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot } 266d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot return false; 267d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot } 268d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot 269afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** Called when the activity is first created. */ 270afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 271f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onCreate(Bundle icicle) { 272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(icicle); 2733db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 2740fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn setHasOptionsMenu(true); 275cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk addPreferencesFromResource(R.xml.installed_app_details); 2764bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 277b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk if (Utils.isBandwidthControlEnabled()) { 278b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk INetworkStatsService statsService = INetworkStatsService.Stub.asInterface( 279b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk ServiceManager.getService(Context.NETWORK_STATS_SERVICE)); 280b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk try { 281b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk mStatsSession = statsService.openSession(); 282b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk } catch (RemoteException e) { 283b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk throw new RuntimeException(e); 284b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk } 285b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk } else { 286b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk removePreference(KEY_DATA); 2874bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 2881eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryHelper = new BatteryStatsHelper(getActivity(), true); 2894bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 2904bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 2914bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk @Override 2928a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren protected int getMetricsCategory() { 2938a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren return MetricsLogger.APPLICATIONS_INSTALLED_APP_DETAILS; 2948a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren } 2958a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren 2968a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren @Override 2974bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public void onResume() { 2984bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk super.onResume(); 29965ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk if (mFinishing) { 30065ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk return; 30165ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk } 302646befdd16fee63fb399aec47950973b64add3baJason Monk mState.requestSize(mPackageName, mUserId); 3034bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk AppItem app = new AppItem(mAppEntry.info.uid); 3044bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk app.addUid(mAppEntry.info.uid); 305b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk if (mStatsSession != null) { 306b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk getLoaderManager().restartLoader(LOADER_CHART_DATA, 307b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk ChartDataLoader.buildArgs(getTemplate(getContext()), app), 308b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk mDataCallbacks); 309b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk } 31065ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk new BatteryUpdater().execute(); 311ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk new MemoryUpdater().execute(); 3124bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 3134bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 3144bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk @Override 3154bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public void onPause() { 3164bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk getLoaderManager().destroyLoader(LOADER_CHART_DATA); 3174bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk super.onPause(); 3184bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 3194bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 3204bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk @Override 3214bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public void onDestroy() { 3224bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk TrafficStats.closeQuietly(mStatsSession); 323d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk if (mPermissionReceiver != null) { 324d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk getContext().unregisterReceiver(mPermissionReceiver); 325d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk mPermissionReceiver = null; 326d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk } 3274bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 3284bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk super.onDestroy(); 329f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 330f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 331cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public void onActivityCreated(Bundle savedInstanceState) { 332cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk super.onActivityCreated(savedInstanceState); 33365ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk if (mFinishing) { 33465ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk return; 33565ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk } 336cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk handleHeader(); 33738ba9a2d4350fc7d063ec21c994183258bf7a443Fabrice Di Meglio 338cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mNotificationPreference = findPreference(KEY_NOTIFICATION); 339cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mNotificationPreference.setOnPreferenceClickListener(this); 340cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mStoragePreference = findPreference(KEY_STORAGE); 341cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mStoragePreference.setOnPreferenceClickListener(this); 342cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mPermissionsPreference = findPreference(KEY_PERMISSION); 343cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mPermissionsPreference.setOnPreferenceClickListener(this); 344cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mDataPreference = findPreference(KEY_DATA); 345b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk if (mDataPreference != null) { 346b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk mDataPreference.setOnPreferenceClickListener(this); 347b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk } 3481eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference = findPreference(KEY_BATTERY); 3491eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference.setEnabled(false); 3501eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference.setOnPreferenceClickListener(this); 351ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mMemoryPreference = findPreference(KEY_MEMORY); 352ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mMemoryPreference.setOnPreferenceClickListener(this); 3538b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio 3548b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio mLaunchPreference = findPreference(KEY_LAUNCH); 355f7806581e582e5921d0eb4caa9751d1aa429bc47Jason Monk if (mAppEntry != null && mAppEntry.info != null) { 356ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio if ((mAppEntry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0 || 357ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio !mAppEntry.info.enabled) { 358ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio mLaunchPreference.setEnabled(false); 359ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio } else { 360ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio mLaunchPreference.setOnPreferenceClickListener(this); 361ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio } 3628b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio } else { 363ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio mLaunchPreference.setEnabled(false); 3648b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio } 365cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 3661f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn 367cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private void handleHeader() { 36860a09ea2388db01a661beeb9995a7ecf770a4200Jason Monk mHeader = (LayoutPreference) findPreference(KEY_HEADER); 3691f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn 37042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Get Control button panel 371cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk View btnPanel = mHeader.findViewById(R.id.control_buttons_panel); 372cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mForceStopButton = (Button) btnPanel.findViewById(R.id.right_button); 37342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mForceStopButton.setText(R.string.force_stop); 374cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mUninstallButton = (Button) btnPanel.findViewById(R.id.left_button); 375cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn mForceStopButton.setEnabled(false); 376afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 377f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu 3783db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 3793db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 380dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk menu.add(0, UNINSTALL_UPDATES, 0, R.string.app_factory_reset) 381dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 3823db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn menu.add(0, UNINSTALL_ALL_USERS_MENU, 1, R.string.uninstall_all_users_text) 3833db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 3843db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 3853db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 3863db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 3873db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public void onPrepareOptionsMenu(Menu menu) { 38838f1889fea1a8ef7f4160044f4fd7e57a9bccd23Jason Monk if (mFinishing) { 38938f1889fea1a8ef7f4160044f4fd7e57a9bccd23Jason Monk return; 39038f1889fea1a8ef7f4160044f4fd7e57a9bccd23Jason Monk } 3913db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn boolean showIt = true; 3923db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (mUpdatedSysApp) { 3933db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 3940fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn } else if (mAppEntry == null) { 3950fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn showIt = false; 3963db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 3973db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 39854b3f501ca4a7ff88ead39247d2277d2efc82bb6Jeff Sharkey } else if (mPackageInfo == null || mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 3993db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 4003db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if (UserHandle.myUserId() != 0) { 4013db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 4027a1c4cdfae66e8b110de3988e65586871a969c04Amith Yamasani } else if (mUserManager.getUsers().size() < 2) { 4033db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 4043db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4053db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn menu.findItem(UNINSTALL_ALL_USERS_MENU).setVisible(showIt); 406dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk mUpdatedSysApp = (mAppEntry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0; 407dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk menu.findItem(UNINSTALL_UPDATES).setVisible(mUpdatedSysApp && !mAppControlRestricted); 4083db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4093db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 4103db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 4113db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public boolean onOptionsItemSelected(MenuItem item) { 412dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk switch (item.getItemId()) { 413dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk case UNINSTALL_ALL_USERS_MENU: 414dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk uninstallPkg(mAppEntry.info.packageName, true, false); 415dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk return true; 416dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk case UNINSTALL_UPDATES: 417dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk showDialogInner(DLG_FACTORY_RESET, 0); 418dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk return true; 4193db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4203db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn return false; 4213db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4223db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 4233db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 4243db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public void onActivityResult(int requestCode, int resultCode, Intent data) { 4253db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn super.onActivityResult(requestCode, resultCode, data); 4263db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (requestCode == REQUEST_UNINSTALL) { 4279072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn if (mDisableAfterUninstall) { 4289072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mDisableAfterUninstall = false; 4299072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn try { 4309072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn ApplicationInfo ainfo = getActivity().getPackageManager().getApplicationInfo( 4319072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mAppEntry.info.packageName, PackageManager.GET_UNINSTALLED_PACKAGES 4329072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn | PackageManager.GET_DISABLED_COMPONENTS); 4339072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn if ((ainfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0) { 4349072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn new DisableChanger(this, mAppEntry.info, 4359072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) 4369072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn .execute((Object)null); 4379072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 4389072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } catch (NameNotFoundException e) { 4399072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 4409072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 4413db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (!refreshUi()) { 4423db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn setIntentAndFinish(true, true); 4433db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4443db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4453db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4463db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 4470dd9902c89e7b705fd73158aadf1bf27843ad201Dianne Hackborn // Utility method to set application label and icon. 448f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu private void setAppLabelAndIcon(PackageInfo pkgInfo) { 449cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk final View appSnippet = mHeader.findViewById(R.id.app_snippet); 4500f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mState.ensureIcon(mAppEntry); 4512cdafc6be386bb767404e42fc728a1a810aa896aJason Monk setupAppSnippet(appSnippet, mAppEntry.label, mAppEntry.icon, 4522cdafc6be386bb767404e42fc728a1a810aa896aJason Monk pkgInfo != null ? pkgInfo.versionName : null); 45350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 45450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 4558243c9a722e815bdcb069163de48877478c28dfdChristopher Tate private boolean signaturesMatch(String pkg1, String pkg2) { 4568243c9a722e815bdcb069163de48877478c28dfdChristopher Tate if (pkg1 != null && pkg2 != null) { 4578243c9a722e815bdcb069163de48877478c28dfdChristopher Tate try { 4588243c9a722e815bdcb069163de48877478c28dfdChristopher Tate final int match = mPm.checkSignatures(pkg1, pkg2); 4598243c9a722e815bdcb069163de48877478c28dfdChristopher Tate if (match >= PackageManager.SIGNATURE_MATCH) { 4608243c9a722e815bdcb069163de48877478c28dfdChristopher Tate return true; 4618243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 4628243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } catch (Exception e) { 4638243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // e.g. named alternate package not found during lookup; 4648243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // this is an expected case sometimes 4658243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 4668243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 4678243c9a722e815bdcb069163de48877478c28dfdChristopher Tate return false; 4688243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 4698243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 470cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk @Override 471cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk protected boolean refreshUi() { 472cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk retrieveAppEntry(); 4730f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (mAppEntry == null) { 4740f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return false; // onCreate must have failed, make sure to exit 475b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown } 476b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani 477b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani if (mPackageInfo == null) { 4780f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return false; // onCreate must have failed, make sure to exit 47950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 480b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani 4818243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // Get list of "home" apps and trace through any meta-data references 4828243c9a722e815bdcb069163de48877478c28dfdChristopher Tate List<ResolveInfo> homeActivities = new ArrayList<ResolveInfo>(); 4838243c9a722e815bdcb069163de48877478c28dfdChristopher Tate mPm.getHomeActivities(homeActivities); 4848243c9a722e815bdcb069163de48877478c28dfdChristopher Tate mHomePackages.clear(); 4858243c9a722e815bdcb069163de48877478c28dfdChristopher Tate for (int i = 0; i< homeActivities.size(); i++) { 4868243c9a722e815bdcb069163de48877478c28dfdChristopher Tate ResolveInfo ri = homeActivities.get(i); 4878243c9a722e815bdcb069163de48877478c28dfdChristopher Tate final String activityPkg = ri.activityInfo.packageName; 4888243c9a722e815bdcb069163de48877478c28dfdChristopher Tate mHomePackages.add(activityPkg); 4898243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 4908243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // Also make sure to include anything proxying for the home app 4918243c9a722e815bdcb069163de48877478c28dfdChristopher Tate final Bundle metadata = ri.activityInfo.metaData; 4928243c9a722e815bdcb069163de48877478c28dfdChristopher Tate if (metadata != null) { 4938243c9a722e815bdcb069163de48877478c28dfdChristopher Tate final String metaPkg = metadata.getString(ActivityManager.META_HOME_ALTERNATE); 4948243c9a722e815bdcb069163de48877478c28dfdChristopher Tate if (signaturesMatch(metaPkg, activityPkg)) { 4958243c9a722e815bdcb069163de48877478c28dfdChristopher Tate mHomePackages.add(metaPkg); 4968243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 4978243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 4988243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 4998243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 5000f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn checkForceStop(); 5010f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn setAppLabelAndIcon(mPackageInfo); 502cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk initUninstallButtons(); 503cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 504cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Update the preference summaries. 505cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk Activity context = getActivity(); 506cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mStoragePreference.setSummary(AppStorageSettings.getSummary(mAppEntry, context)); 507d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk if (mPermissionReceiver != null) { 508d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk getContext().unregisterReceiver(mPermissionReceiver); 509d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk } 510d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk mPermissionReceiver = PermissionsSummaryHelper.getPermissionSummary(getContext(), 511d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk mPackageName, mPermissionCallback); 5124f4424a820688638930f871ad421e05588549ae5Tony Mantler mLaunchPreference.setSummary(AppUtils.getLaunchByDefaultSummary(mAppEntry, mUsbManager, 513cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mPm, context)); 514cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mNotificationPreference.setSummary(getNotificationSummary(mAppEntry, context, 515cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mBackend)); 516b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk if (mDataPreference != null) { 517b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk mDataPreference.setSummary(getDataSummary()); 518b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk } 519ab616d477be693fc455329953711264af0ed7814Dianne Hackborn 5201eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk updateBattery(); 5211eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 522ab616d477be693fc455329953711264af0ed7814Dianne Hackborn if (!mInitialized) { 523ab616d477be693fc455329953711264af0ed7814Dianne Hackborn // First time init: are we displaying an uninstalled app? 524ab616d477be693fc455329953711264af0ed7814Dianne Hackborn mInitialized = true; 525ab616d477be693fc455329953711264af0ed7814Dianne Hackborn mShowUninstalled = (mAppEntry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0; 5264de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn } else { 5274de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // All other times: if the app no longer exists then we want 5284de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // to go away. 5299072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn try { 530cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk ApplicationInfo ainfo = context.getPackageManager().getApplicationInfo( 5319072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mAppEntry.info.packageName, PackageManager.GET_UNINSTALLED_PACKAGES 5329072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn | PackageManager.GET_DISABLED_COMPONENTS); 5334de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn if (!mShowUninstalled) { 5344de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // If we did not start out with the app uninstalled, then 5354de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // it transitioning to the uninstalled state for the current 5364de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // user means we should go away as well. 5374de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn return (ainfo.flags&ApplicationInfo.FLAG_INSTALLED) != 0; 5384de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn } 5399072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } catch (NameNotFoundException e) { 5409072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn return false; 5419072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 542ab616d477be693fc455329953711264af0ed7814Dianne Hackborn } 543ab616d477be693fc455329953711264af0ed7814Dianne Hackborn 5440f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return true; 545afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 5463465b67740e17711af2b36b09e2250a02275d860Jake Hamby 5471eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private void updateBattery() { 5481eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk if (mSipper != null) { 5491eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference.setEnabled(true); 5501eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk int dischargeAmount = mBatteryHelper.getStats().getDischargeAmount( 5511eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk BatteryStats.STATS_SINCE_CHARGED); 5521eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk final int percentOfMax = (int) ((mSipper.totalPowerMah) 5531eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk / mBatteryHelper.getTotalPower() * dischargeAmount + .5f); 5541eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference.setSummary(getString(R.string.battery_summary, percentOfMax)); 5551eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } else { 5561eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference.setEnabled(false); 5571eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference.setSummary(getString(R.string.no_battery_summary)); 5581eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 5591eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 5601eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 5614bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk private CharSequence getDataSummary() { 5624bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk if (mChartData != null) { 5634bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk long totalBytes = mChartData.detail.getTotalBytes(); 56451334310a26a29d3ac3ad4e7299110b6de0ae75cJason Monk if (totalBytes == 0) { 56551334310a26a29d3ac3ad4e7299110b6de0ae75cJason Monk return getString(R.string.no_data_usage); 56651334310a26a29d3ac3ad4e7299110b6de0ae75cJason Monk } 5674bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk Context context = getActivity(); 5684bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk return getString(R.string.data_summary_format, 5694bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk Formatter.formatFileSize(context, totalBytes), 5704bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk DateUtils.formatDateTime(context, mChartData.detail.getStart(), 5714bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_MONTH)); 5724bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 5734bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk return getString(R.string.computing_size); 5744bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 5754bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 576cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk @Override 577cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk protected AlertDialog createDialog(int id, int errorCode) { 578cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk switch (id) { 579cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk case DLG_DISABLE: 580cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return new AlertDialog.Builder(getActivity()) 581cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setMessage(getActivity().getText(R.string.app_disable_dlg_text)) 58253a5d7ff2ce3ab446f4ad046e6703ed2caa18fa4Jason Monk .setPositiveButton(R.string.app_disable_dlg_positive, 58353a5d7ff2ce3ab446f4ad046e6703ed2caa18fa4Jason Monk new DialogInterface.OnClickListener() { 584cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public void onClick(DialogInterface dialog, int which) { 585cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Disable the app 586cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk new DisableChanger(InstalledAppDetails.this, mAppEntry.info, 587cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) 588cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .execute((Object)null); 589cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 590cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk }) 591cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setNegativeButton(R.string.dlg_cancel, null) 592cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .create(); 593cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk case DLG_SPECIAL_DISABLE: 594cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return new AlertDialog.Builder(getActivity()) 595cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setMessage(getActivity().getText(R.string.app_special_disable_dlg_text)) 59653a5d7ff2ce3ab446f4ad046e6703ed2caa18fa4Jason Monk .setPositiveButton(R.string.app_disable_dlg_positive, 59753a5d7ff2ce3ab446f4ad046e6703ed2caa18fa4Jason Monk new DialogInterface.OnClickListener() { 598cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public void onClick(DialogInterface dialog, int which) { 599cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Clear user data here 600cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk uninstallPkg(mAppEntry.info.packageName, 601cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk false, true); 602cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 603cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk }) 604cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setNegativeButton(R.string.dlg_cancel, null) 605cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .create(); 606cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk case DLG_FORCE_STOP: 607cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return new AlertDialog.Builder(getActivity()) 608cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setTitle(getActivity().getText(R.string.force_stop_dlg_title)) 609cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setMessage(getActivity().getText(R.string.force_stop_dlg_text)) 610cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() { 611cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public void onClick(DialogInterface dialog, int which) { 612cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Force stop 613cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk forceStopPackage(mAppEntry.info.packageName); 614cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 615cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk }) 616cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setNegativeButton(R.string.dlg_cancel, null) 617cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .create(); 618cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk case DLG_FACTORY_RESET: 619cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return new AlertDialog.Builder(getActivity()) 620cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setTitle(getActivity().getText(R.string.app_factory_reset_dlg_title)) 621cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setMessage(getActivity().getText(R.string.app_factory_reset_dlg_text)) 622cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() { 623cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public void onClick(DialogInterface dialog, int which) { 624cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Clear user data here 625cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk uninstallPkg(mAppEntry.info.packageName, 626cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk false, false); 627cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 628cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk }) 629cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setNegativeButton(R.string.dlg_cancel, null) 630cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .create(); 631cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 632cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return null; 63350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 63450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 6359072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn private void uninstallPkg(String packageName, boolean allUsers, boolean andDisable) { 63650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Create new intent to launch Uninstaller activity 63750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu Uri packageURI = Uri.parse("package:"+packageName); 6383db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageURI); 6393db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, allUsers); 6403db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn startActivityForResult(uninstallIntent, REQUEST_UNINSTALL); 6419072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mDisableAfterUninstall = andDisable; 64250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 64350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 64442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void forceStopPackage(String pkgName) { 645f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn ActivityManager am = (ActivityManager)getActivity().getSystemService( 64642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Context.ACTIVITY_SERVICE); 64742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu am.forceStopPackage(pkgName); 64807025891683aef83d850b0a91b37aa75b11ce33cJason Monk int userId = UserHandle.getUserId(mAppEntry.info.uid); 64907025891683aef83d850b0a91b37aa75b11ce33cJason Monk mState.invalidatePackage(pkgName, userId); 65007025891683aef83d850b0a91b37aa75b11ce33cJason Monk ApplicationsState.AppEntry newEnt = mState.getEntry(pkgName, userId); 651c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn if (newEnt != null) { 652c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn mAppEntry = newEnt; 653c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn } 654cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn checkForceStop(); 65542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 65642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 657861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn private void updateForceStopButton(boolean enabled) { 65830df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds if (mAppControlRestricted) { 65930df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds mForceStopButton.setEnabled(false); 66030df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds } else { 66130df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds mForceStopButton.setEnabled(enabled); 66230df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds mForceStopButton.setOnClickListener(InstalledAppDetails.this); 66330df56dc36fd24e4ddbb19ab6a73c852b848c883Julia Reynolds } 664861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn } 665cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 666cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn private void checkForceStop() { 6675c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 6685c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn // User can't force stop device admin. 6695c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn updateForceStopButton(false); 6705c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn } else if ((mAppEntry.info.flags&ApplicationInfo.FLAG_STOPPED) == 0) { 671861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn // If the app isn't explicitly stopped, then always show the 672861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn // force stop button. 673861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn updateForceStopButton(true); 674861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn } else { 6755c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART, 6765c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn Uri.fromParts("package", mAppEntry.info.packageName, null)); 6775c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName }); 6785c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid); 679c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn intent.putExtra(Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(mAppEntry.info.uid)); 6808243c9a722e815bdcb069163de48877478c28dfdChristopher Tate getActivity().sendOrderedBroadcastAsUser(intent, UserHandle.CURRENT, null, 6818243c9a722e815bdcb069163de48877478c28dfdChristopher Tate mCheckKillProcessesReceiver, null, Activity.RESULT_CANCELED, null, null); 682861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn } 683cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn } 68470b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler 68579021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov private void startManagePermissionsActivity() { 68679021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov // start new activity to manage app permissions 68779021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov Intent intent = new Intent(Intent.ACTION_MANAGE_APP_PERMISSIONS); 68879021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov intent.putExtra(Intent.EXTRA_PACKAGE_NAME, mAppEntry.info.packageName); 689e492ee06adbf4661d8b8b53f41f236c9173c5ca4Julia Reynolds intent.putExtra(AppHeader.EXTRA_HIDE_INFO_BUTTON, true); 69079021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov try { 69179021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov startActivity(intent); 69279021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov } catch (ActivityNotFoundException e) { 69379021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov Log.w(LOG_TAG, "No app can handle android.intent.action.MANAGE_APP_PERMISSIONS"); 69479021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov } 69579021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov } 69679021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov 697255452fdf4b368f150477e818b326a60210f22c1Jason Monk private void startAppInfoFragment(Class<?> fragment, CharSequence title) { 698cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // start new fragment to display extended information 699cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk Bundle args = new Bundle(); 700255452fdf4b368f150477e818b326a60210f22c1Jason Monk args.putString(ARG_PACKAGE_NAME, mAppEntry.info.packageName); 701255452fdf4b368f150477e818b326a60210f22c1Jason Monk args.putInt(ARG_PACKAGE_UID, mAppEntry.info.uid); 702e492ee06adbf4661d8b8b53f41f236c9173c5ca4Julia Reynolds args.putBoolean(AppHeader.EXTRA_HIDE_INFO_BUTTON, true); 7039db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn 704cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk SettingsActivity sa = (SettingsActivity) getActivity(); 705cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk sa.startPreferencePanel(fragment.getName(), args, -1, title, this, SUB_INFO_FRAGMENT); 7069db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 7079db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn 708afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 709afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Method implementing functionality of buttons clicked 710afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * @see android.view.View.OnClickListener#onClick(android.view.View) 711afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 712afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onClick(View v) { 7136e2e8e17cfea09548067baa8b361dbc31dce385cJason Monk if (mAppEntry == null) { 7146e2e8e17cfea09548067baa8b361dbc31dce385cJason Monk setIntentAndFinish(true, true); 7156e2e8e17cfea09548067baa8b361dbc31dce385cJason Monk return; 7166e2e8e17cfea09548067baa8b361dbc31dce385cJason Monk } 7170f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn String packageName = mAppEntry.info.packageName; 71842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if(v == mUninstallButton) { 719dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 72077537b697b411df54dedd65b1e5ca4eb5dd00846Jason Monk if (mAppEntry.info.enabled && !isDisabledUntilUsed()) { 721dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk if (mUpdatedSysApp) { 722dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk showDialogInner(DLG_SPECIAL_DISABLE, 0); 723f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn } else { 724dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk showDialogInner(DLG_DISABLE, 0); 725f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn } 7269db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } else { 727dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk new DisableChanger(this, mAppEntry.info, 728dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) 729dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk .execute((Object) null); 7309db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 731dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_INSTALLED) == 0) { 732dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk uninstallPkg(packageName, true, false); 733dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk } else { 734dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk uninstallPkg(packageName, false, false); 735afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 736afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mForceStopButton) { 737f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn showDialogInner(DLG_FORCE_STOP, 0); 7389db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn //forceStopPackage(mAppInfo.packageName); 739afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 740afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 741aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn 742aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn @Override 743cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public boolean onPreferenceClick(Preference preference) { 744cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk if (preference == mStoragePreference) { 745cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk startAppInfoFragment(AppStorageSettings.class, mStoragePreference.getTitle()); 746cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } else if (preference == mNotificationPreference) { 747255452fdf4b368f150477e818b326a60210f22c1Jason Monk startAppInfoFragment(AppNotificationSettings.class, 748255452fdf4b368f150477e818b326a60210f22c1Jason Monk getString(R.string.app_notifications_title)); 749cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } else if (preference == mPermissionsPreference) { 75079021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov startManagePermissionsActivity(); 751cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } else if (preference == mLaunchPreference) { 752cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk startAppInfoFragment(AppLaunchSettings.class, mLaunchPreference.getTitle()); 753ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } else if (preference == mMemoryPreference) { 754ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk ProcessStatsBase.launchMemoryDetail((SettingsActivity) getActivity(), 755e492ee06adbf4661d8b8b53f41f236c9173c5ca4Julia Reynolds mStatsManager.getMemInfo(), mStats, false); 756cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } else if (preference == mDataPreference) { 757b37e2887d3112082589997f1bbd802ec282cca6dJason Monk startAppInfoFragment(AppDataUsage.class, getString(R.string.app_data_usage)); 7581eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } else if (preference == mBatteryPreference) { 7591eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk BatteryEntry entry = new BatteryEntry(getActivity(), null, mUserManager, mSipper); 7601eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk PowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(), 761e492ee06adbf4661d8b8b53f41f236c9173c5ca4Julia Reynolds mBatteryHelper, BatteryStats.STATS_SINCE_CHARGED, entry, true, false); 762cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } else { 763cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return false; 764cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 765cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return true; 766cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 767cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 7682cdafc6be386bb767404e42fc728a1a810aa896aJason Monk public static void setupAppSnippet(View appSnippet, CharSequence label, Drawable icon, 7692cdafc6be386bb767404e42fc728a1a810aa896aJason Monk CharSequence versionName) { 7702cdafc6be386bb767404e42fc728a1a810aa896aJason Monk LayoutInflater.from(appSnippet.getContext()).inflate(R.layout.widget_text_views, 7712cdafc6be386bb767404e42fc728a1a810aa896aJason Monk (ViewGroup) appSnippet.findViewById(android.R.id.widget_frame)); 7722cdafc6be386bb767404e42fc728a1a810aa896aJason Monk 7732cdafc6be386bb767404e42fc728a1a810aa896aJason Monk ImageView iconView = (ImageView) appSnippet.findViewById(android.R.id.icon); 7742cdafc6be386bb767404e42fc728a1a810aa896aJason Monk iconView.setImageDrawable(icon); 7752cdafc6be386bb767404e42fc728a1a810aa896aJason Monk // Set application name. 7762cdafc6be386bb767404e42fc728a1a810aa896aJason Monk TextView labelView = (TextView) appSnippet.findViewById(android.R.id.title); 7772cdafc6be386bb767404e42fc728a1a810aa896aJason Monk labelView.setText(label); 7782cdafc6be386bb767404e42fc728a1a810aa896aJason Monk // Version number of application 7792cdafc6be386bb767404e42fc728a1a810aa896aJason Monk TextView appVersion = (TextView) appSnippet.findViewById(R.id.widget_text1); 7802cdafc6be386bb767404e42fc728a1a810aa896aJason Monk 7812cdafc6be386bb767404e42fc728a1a810aa896aJason Monk if (!TextUtils.isEmpty(versionName)) { 782b01459997ed4d0232855e4dbc080bd1238e1256dJason Monk appVersion.setSelected(true); 7832cdafc6be386bb767404e42fc728a1a810aa896aJason Monk appVersion.setVisibility(View.VISIBLE); 7842cdafc6be386bb767404e42fc728a1a810aa896aJason Monk appVersion.setText(appSnippet.getContext().getString(R.string.version_text, 7852cdafc6be386bb767404e42fc728a1a810aa896aJason Monk String.valueOf(versionName))); 7862cdafc6be386bb767404e42fc728a1a810aa896aJason Monk } else { 7872cdafc6be386bb767404e42fc728a1a810aa896aJason Monk appVersion.setVisibility(View.INVISIBLE); 7882cdafc6be386bb767404e42fc728a1a810aa896aJason Monk } 7892cdafc6be386bb767404e42fc728a1a810aa896aJason Monk } 7902cdafc6be386bb767404e42fc728a1a810aa896aJason Monk 7913069581512bcb9687cb8d79675f6c4950c9ac087Jason Monk public static NetworkTemplate getTemplate(Context context) { 792b37e2887d3112082589997f1bbd802ec282cca6dJason Monk if (DataUsageList.hasReadyMobileRadio(context)) { 79310e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk return NetworkTemplate.buildTemplateMobileWildcard(); 79410e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk } 79510e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk if (DataUsageSummary.hasWifiRadio(context)) { 79610e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk return NetworkTemplate.buildTemplateWifiWildcard(); 79710e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk } 79810e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk return NetworkTemplate.buildTemplateEthernet(); 79910e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk } 80010e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk 801cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public static CharSequence getNotificationSummary(AppEntry appEntry, Context context) { 802584b2b2bc17a4ccf42952b188722de1091c101beJason Monk return getNotificationSummary(appEntry, context, new NotificationBackend()); 803cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 804cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 805cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public static CharSequence getNotificationSummary(AppEntry appEntry, Context context, 806584b2b2bc17a4ccf42952b188722de1091c101beJason Monk NotificationBackend backend) { 807584b2b2bc17a4ccf42952b188722de1091c101beJason Monk AppRow appRow = backend.loadAppRow(context.getPackageManager(), appEntry.info); 808584b2b2bc17a4ccf42952b188722de1091c101beJason Monk return getNotificationSummary(appRow, context); 809584b2b2bc17a4ccf42952b188722de1091c101beJason Monk } 810584b2b2bc17a4ccf42952b188722de1091c101beJason Monk 811584b2b2bc17a4ccf42952b188722de1091c101beJason Monk public static CharSequence getNotificationSummary(AppRow appRow, Context context) { 812cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk if (appRow.banned) { 813cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return context.getString(R.string.notifications_disabled); 814cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 8156f526fcaf3dc83a5988a522bfa2b542390ece234Julia Reynolds return context.getString(R.string.notifications_enabled); 816cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 817cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 818ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk private class MemoryUpdater extends AsyncTask<Void, Void, ProcStatsPackageEntry> { 819ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk 820ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk @Override 821ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk protected ProcStatsPackageEntry doInBackground(Void... params) { 822ed91bbdb1f2087a9ffcfebc6c0425d1f45976e22Julia Reynolds if (getActivity() == null) { 823ed91bbdb1f2087a9ffcfebc6c0425d1f45976e22Julia Reynolds return null; 824ed91bbdb1f2087a9ffcfebc6c0425d1f45976e22Julia Reynolds } 825ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk if (mPackageInfo == null) { 826ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk return null; 827ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 828ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk if (mStatsManager == null) { 829ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mStatsManager = new ProcStatsData(getActivity(), false); 830ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mStatsManager.setDuration(ProcessStatsBase.sDurations[0]); 831ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 832ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mStatsManager.refreshStats(true); 833ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk for (ProcStatsPackageEntry pkgEntry : mStatsManager.getEntries()) { 834ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk for (ProcStatsEntry entry : pkgEntry.mEntries) { 835ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk if (entry.mUid == mPackageInfo.applicationInfo.uid) { 836ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk pkgEntry.updateMetrics(); 837ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk return pkgEntry; 838ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 839ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 840ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 841ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk return null; 842ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 843ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk 844ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk @Override 845ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk protected void onPostExecute(ProcStatsPackageEntry entry) { 846ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk if (getActivity() == null) { 847ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk return; 848ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 849ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk if (entry != null) { 850ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mStats = entry; 851ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mMemoryPreference.setEnabled(true); 852ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk double amount = Math.max(entry.mRunWeight, entry.mBgWeight) 853ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk * mStatsManager.getMemInfo().weightToRam; 854ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mMemoryPreference.setSummary(getString(R.string.memory_use_summary, 855ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk Formatter.formatShortFileSize(getContext(), (long) amount))); 856ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } else { 857ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mMemoryPreference.setEnabled(false); 858ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mMemoryPreference.setSummary(getString(R.string.no_memory_use_summary)); 859ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 860ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 861ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk 862ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 863ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk 8641eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private class BatteryUpdater extends AsyncTask<Void, Void, Void> { 8651eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk @Override 8661eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk protected Void doInBackground(Void... params) { 8671eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryHelper.create((Bundle) null); 8681eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, 8691eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mUserManager.getUserProfiles()); 8701eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk List<BatterySipper> usageList = mBatteryHelper.getUsageList(); 8711eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk final int N = usageList.size(); 8721eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk for (int i = 0; i < N; i++) { 8731eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk BatterySipper sipper = usageList.get(i); 8741eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk if (sipper.getUid() == mPackageInfo.applicationInfo.uid) { 8751eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mSipper = sipper; 8761eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk break; 8771eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 8781eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 8791eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk return null; 8801eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 8811eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 8821eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk @Override 8831eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk protected void onPostExecute(Void result) { 884ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk if (getActivity() == null) { 885ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk return; 886ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 8871eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk refreshUi(); 8881eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 8891eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 8901eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 8911eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private static class DisableChanger extends AsyncTask<Object, Object, Object> { 892cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk final PackageManager mPm; 893cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk final WeakReference<InstalledAppDetails> mActivity; 894cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk final ApplicationInfo mInfo; 895cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk final int mState; 896cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 897cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk DisableChanger(InstalledAppDetails activity, ApplicationInfo info, int state) { 898cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mPm = activity.mPm; 899cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mActivity = new WeakReference<InstalledAppDetails>(activity); 900cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mInfo = info; 901cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mState = state; 902cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 903cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 904cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk @Override 905cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk protected Object doInBackground(Object... params) { 906cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mPm.setApplicationEnabledSetting(mInfo.packageName, mState, 0); 907cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return null; 908aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } 909aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } 910cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 9114bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk private final LoaderCallbacks<ChartData> mDataCallbacks = new LoaderCallbacks<ChartData>() { 9124bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 9134bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk @Override 9144bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public Loader<ChartData> onCreateLoader(int id, Bundle args) { 9154bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk return new ChartDataLoader(getActivity(), mStatsSession, args); 9164bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 9174bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 9184bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk @Override 9194bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public void onLoadFinished(Loader<ChartData> loader, ChartData data) { 9204bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mChartData = data; 9214bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mDataPreference.setSummary(getDataSummary()); 9224bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 9234bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 9244bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk @Override 9254bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public void onLoaderReset(Loader<ChartData> loader) { 926e950b54fcd6a1d496f47479c230b7c4814e67414Jason Monk // Leave last result. 9274bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 9284bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk }; 9294bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 930cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() { 931cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk @Override 932cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public void onReceive(Context context, Intent intent) { 933cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk updateForceStopButton(getResultCode() != Activity.RESULT_CANCELED); 934cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 935cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk }; 936e9866b6dc47201630c057f946423d572b8c46af8Jason Monk 937375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki private final PermissionsResultCallback mPermissionCallback 938375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki = new PermissionsResultCallback() { 939e9866b6dc47201630c057f946423d572b8c46af8Jason Monk @Override 940375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki public void onPermissionSummaryResult(int[] counts, CharSequence[] groupLabels) { 941d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk if (getActivity() == null) { 942d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk return; 943d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk } 944d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk mPermissionReceiver = null; 945375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki final Resources res = getResources(); 946375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki CharSequence summary = null; 947375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki if (counts != null) { 948375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki int totalCount = counts[1]; 949375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki int additionalCounts = counts[2]; 950375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki 951375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki if (totalCount == 0) { 952375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki summary = res.getString( 953375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki R.string.runtime_permissions_summary_no_permissions_requested); 954375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki } else { 955375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki final ArrayList<CharSequence> list = new ArrayList(Arrays.asList(groupLabels)); 956375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki if (additionalCounts > 0) { 957375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki // N additional permissions. 958375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki list.add(res.getQuantityString( 959375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki R.plurals.runtime_permissions_additional_count, 960375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki additionalCounts, additionalCounts)); 961375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki } 962375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki if (list.size() == 0) { 963375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki summary = res.getString( 964375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki R.string.runtime_permissions_summary_no_permissions_granted); 965375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki } else { 966375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki summary = ListFormatter.getInstance().format(list); 967375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki } 968375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki } 969e9866b6dc47201630c057f946423d572b8c46af8Jason Monk } 970375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki mPermissionsPreference.setSummary(summary); 971e9866b6dc47201630c057f946423d572b8c46af8Jason Monk } 972e9866b6dc47201630c057f946423d572b8c46af8Jason Monk }; 973afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 974