InstalledAppDetails.java revision 9e9e63b7b3b31fcae7242eb07f528487e0913402
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; 51ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shankaimport android.os.UserManager; 5239b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference; 5339b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference.OnPreferenceClickListener; 542cdafc6be386bb767404e42fc728a1a810aa896aJason Monkimport android.text.TextUtils; 554bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.text.format.DateUtils; 564bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.text.format.Formatter; 5779021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganovimport android.util.Log; 582cdafc6be386bb767404e42fc728a1a810aa896aJason Monkimport android.view.LayoutInflater; 593db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.view.Menu; 603db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.view.MenuInflater; 613db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.view.MenuItem; 62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View; 632cdafc6be386bb767404e42fc728a1a810aa896aJason Monkimport android.view.ViewGroup; 64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button; 65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView; 66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView; 679d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wrenimport com.android.internal.logging.MetricsProto.MetricsEvent; 681eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport com.android.internal.os.BatterySipper; 691eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport com.android.internal.os.BatteryStatsHelper; 70e492ee06adbf4661d8b8b53f41f236c9173c5ca4Julia Reynoldsimport com.android.settings.AppHeader; 71cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport com.android.settings.R; 72cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport com.android.settings.SettingsActivity; 73cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport com.android.settings.Utils; 74e9866b6dc47201630c057f946423d572b8c46af8Jason Monkimport com.android.settings.applications.PermissionsSummaryHelper.PermissionsResultCallback; 75b37e2887d3112082589997f1bbd802ec282cca6dJason Monkimport com.android.settings.datausage.AppDataUsage; 76b37e2887d3112082589997f1bbd802ec282cca6dJason Monkimport com.android.settings.datausage.DataUsageList; 77b37e2887d3112082589997f1bbd802ec282cca6dJason Monkimport com.android.settings.datausage.DataUsageSummary; 781eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport com.android.settings.fuelgauge.BatteryEntry; 791eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport com.android.settings.fuelgauge.PowerUsageDetail; 80255452fdf4b368f150477e818b326a60210f22c1Jason Monkimport com.android.settings.notification.AppNotificationSettings; 81584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport com.android.settings.notification.NotificationBackend; 82584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport com.android.settings.notification.NotificationBackend.AppRow; 83de557d48badd10b7313ea2b40ff8156577a14678Wei Liuimport com.android.settingslib.AppItem; 84ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shankaimport com.android.settingslib.RestrictedLockUtils; 854f4424a820688638930f871ad421e05588549ae5Tony Mantlerimport com.android.settingslib.applications.AppUtils; 86de557d48badd10b7313ea2b40ff8156577a14678Wei Liuimport com.android.settingslib.applications.ApplicationsState; 8739b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport com.android.settingslib.applications.ApplicationsState.AppEntry; 88de557d48badd10b7313ea2b40ff8156577a14678Wei Liuimport com.android.settingslib.net.ChartData; 89de557d48badd10b7313ea2b40ff8156577a14678Wei Liuimport com.android.settingslib.net.ChartDataLoader; 90cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 91cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport java.lang.ref.WeakReference; 92cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport java.util.ArrayList; 93375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onukiimport java.util.Arrays; 94cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport java.util.HashSet; 95cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport java.util.List; 96cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 97ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shankaimport static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; 98ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka 99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/** 100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display application information from Settings. This activity presents 101afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * extended information associated with a package like code, data, total size, permissions 102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * used by the application and also the set of default launchable activities. 103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For system applications, an option to clear user data is displayed only if data size is > 0. 104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * System applications that do not want clear user data do not have this option. 105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For non-system applications, there is no option to clear data. Instead there is an option to 106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * uninstall the application. 107afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 108cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkpublic class InstalledAppDetails extends AppInfoBase 109cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk implements View.OnClickListener, OnPreferenceClickListener { 110cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 11179021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov private static final String LOG_TAG = "InstalledAppDetails"; 11279021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov 113cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Menu identifiers 114cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public static final int UNINSTALL_ALL_USERS_MENU = 1; 115dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk public static final int UNINSTALL_UPDATES = 2; 116cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 117cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Result code identifiers 118cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public static final int REQUEST_UNINSTALL = 0; 119cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final int SUB_INFO_FRAGMENT = 1; 120cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 1214bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk private static final int LOADER_CHART_DATA = 2; 1224bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 123cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final int DLG_FORCE_STOP = DLG_BASE + 1; 124cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final int DLG_DISABLE = DLG_BASE + 2; 125cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final int DLG_SPECIAL_DISABLE = DLG_BASE + 3; 126cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final int DLG_FACTORY_RESET = DLG_BASE + 4; 127cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 128cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_HEADER = "header_view"; 129cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_NOTIFICATION = "notification_settings"; 130cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_STORAGE = "storage_settings"; 131cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_PERMISSION = "permission_settings"; 132cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_DATA = "data_settings"; 133cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_LAUNCH = "preferred_settings"; 1341eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private static final String KEY_BATTERY = "battery"; 135ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk private static final String KEY_MEMORY = "memory"; 136cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 137cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private final HashSet<String> mHomePackages = new HashSet<String>(); 138f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 139ab616d477be693fc455329953711264af0ed7814Dianne Hackborn private boolean mInitialized; 140ab616d477be693fc455329953711264af0ed7814Dianne Hackborn private boolean mShowUninstalled; 14160a09ea2388db01a661beeb9995a7ecf770a4200Jason Monk private LayoutPreference mHeader; 14242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private Button mUninstallButton; 14342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private boolean mUpdatedSysApp = false; 144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private Button mForceStopButton; 145cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private Preference mNotificationPreference; 146cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private Preference mStoragePreference; 147cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private Preference mPermissionsPreference; 148cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private Preference mLaunchPreference; 149cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private Preference mDataPreference; 150ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk private Preference mMemoryPreference; 1518243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 1529072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn private boolean mDisableAfterUninstall; 153cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Used for updating notification preference. 154584b2b2bc17a4ccf42952b188722de1091c101beJason Monk private final NotificationBackend mBackend = new NotificationBackend(); 15542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 1564bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk private ChartData mChartData; 1574bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk private INetworkStatsSession mStatsSession; 1584bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 1591eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private Preference mBatteryPreference; 1601eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 1611eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private BatteryStatsHelper mBatteryHelper; 1621eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private BatterySipper mSipper; 1631eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 164ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk protected ProcStatsData mStatsManager; 165ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk protected ProcStatsPackageEntry mStats; 166ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk 167d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk private BroadcastReceiver mPermissionReceiver; 168d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk 1699072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn private boolean handleDisableable(Button button) { 1709072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn boolean disableable = false; 1718243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // Try to prevent the user from bricking their phone 1728243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // by not allowing disabling of apps signed with the 1738243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // system cert and any launcher app in the system. 174b58b5127040b3c843fe42544a89a1085cf7e74f6Dan Sandler if (mHomePackages.contains(mAppEntry.info.packageName) 175b58b5127040b3c843fe42544a89a1085cf7e74f6Dan Sandler || Utils.isSystemPackage(mPm, mPackageInfo)) { 1768243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // Disable button for core system applications. 1778243c9a722e815bdcb069163de48877478c28dfdChristopher Tate button.setText(R.string.disable_text); 17877537b697b411df54dedd65b1e5ca4eb5dd00846Jason Monk } else if (mAppEntry.info.enabled && !isDisabledUntilUsed()) { 1798243c9a722e815bdcb069163de48877478c28dfdChristopher Tate button.setText(R.string.disable_text); 1808243c9a722e815bdcb069163de48877478c28dfdChristopher Tate disableable = true; 1818243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } else { 1828243c9a722e815bdcb069163de48877478c28dfdChristopher Tate button.setText(R.string.enable_text); 1838243c9a722e815bdcb069163de48877478c28dfdChristopher Tate disableable = true; 1849072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 1858243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 1869072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn return disableable; 1879072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 1889072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn 18977537b697b411df54dedd65b1e5ca4eb5dd00846Jason Monk private boolean isDisabledUntilUsed() { 19077537b697b411df54dedd65b1e5ca4eb5dd00846Jason Monk return mAppEntry.info.enabledSetting 19177537b697b411df54dedd65b1e5ca4eb5dd00846Jason Monk == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED; 19277537b697b411df54dedd65b1e5ca4eb5dd00846Jason Monk } 19377537b697b411df54dedd65b1e5ca4eb5dd00846Jason Monk 194de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu private void initUninstallButtons() { 195568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate final boolean isBundled = (mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0; 19642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu boolean enabled = true; 197dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk if (isBundled) { 198dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk enabled = handleDisableable(mUninstallButton); 19942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 200dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk if ((mPackageInfo.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED) == 0 2014de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn && mUserManager.getUsers().size() >= 2) { 2024de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // When we have multiple users, there is a separate menu 2034de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // to uninstall for all users. 204c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn enabled = false; 205b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu } 206dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk mUninstallButton.setText(R.string.uninstall_text); 20742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 208c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate // If this is a device admin, it can't be uninstalled or disabled. 2095c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn // We do this here so the text of the button is still set correctly. 2105c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 2115c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn enabled = false; 2125c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn } 213c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate 2144cfe39f5397d037d106abf07db31b0e01484bd92Makoto Onuki // We don't allow uninstalling DO/PO on *any* users, because if it's a system app, 2154cfe39f5397d037d106abf07db31b0e01484bd92Makoto Onuki // "uninstall" is actually "downgrade to the system version + disable", and "downgrade" 2164cfe39f5397d037d106abf07db31b0e01484bd92Makoto Onuki // will clear data on all users. 217d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot if (isProfileOrDeviceOwner(mPackageInfo.packageName)) { 218d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot enabled = false; 219d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot } 220d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot 221568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // Home apps need special handling. Bundled ones we don't risk downgrading 222568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // because that can interfere with home-key resolution. Furthermore, we 223568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // can't allow uninstallation of the only home app, and we don't want to 224568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // allow uninstallation of an explicitly preferred one -- the user can go 225568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // to Home settings and pick a different one, after which we'll permit 226568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // uninstallation of the now-not-default one. 227c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate if (enabled && mHomePackages.contains(mPackageInfo.packageName)) { 228568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate if (isBundled) { 229568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate enabled = false; 230c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate } else { 231568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate ArrayList<ResolveInfo> homeActivities = new ArrayList<ResolveInfo>(); 232568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate ComponentName currentDefaultHome = mPm.getHomeActivities(homeActivities); 233568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate if (currentDefaultHome == null) { 234568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // No preferred default, so permit uninstall only when 235568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // there is more than one candidate 236568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate enabled = (mHomePackages.size() > 1); 237568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate } else { 238568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // There is an explicit default home app -- forbid uninstall of 239568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // that one, but permit it for installed-but-inactive ones. 240568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate enabled = !mPackageInfo.packageName.equals(currentDefaultHome.getPackageName()); 241568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate } 242c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate } 243c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate } 244c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate 2459e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka if (mAppsControlDisallowedBySystem) { 2469e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka enabled = false; 2479e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka } 2489e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka 24942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setEnabled(enabled); 25042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if (enabled) { 25142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Register listener 25242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setOnClickListener(this); 25342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 25442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 25542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 256d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot /** Returns if the supplied package is device owner or profile owner of at least one user */ 257d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot private boolean isProfileOrDeviceOwner(String packageName) { 258d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot List<UserInfo> userInfos = mUserManager.getUsers(); 259d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot DevicePolicyManager dpm = (DevicePolicyManager) 260d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot getContext().getSystemService(Context.DEVICE_POLICY_SERVICE); 2614cfe39f5397d037d106abf07db31b0e01484bd92Makoto Onuki if (dpm.isDeviceOwnerAppOnAnyUser(packageName)) { 262d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot return true; 263d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot } 264d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot for (UserInfo userInfo : userInfos) { 265d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot ComponentName cn = dpm.getProfileOwnerAsUser(userInfo.id); 266d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot if (cn != null && cn.getPackageName().equals(packageName)) { 267d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot return true; 268d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot } 269d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot } 270d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot return false; 271d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot } 272d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot 273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /** Called when the activity is first created. */ 274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 275f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn public void onCreate(Bundle icicle) { 276afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project super.onCreate(icicle); 2773db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 2780fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn setHasOptionsMenu(true); 279cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk addPreferencesFromResource(R.xml.installed_app_details); 2804bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 281b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk if (Utils.isBandwidthControlEnabled()) { 282b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk INetworkStatsService statsService = INetworkStatsService.Stub.asInterface( 283b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk ServiceManager.getService(Context.NETWORK_STATS_SERVICE)); 284b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk try { 285b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk mStatsSession = statsService.openSession(); 286b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk } catch (RemoteException e) { 287b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk throw new RuntimeException(e); 288b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk } 289b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk } else { 290b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk removePreference(KEY_DATA); 2914bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 2921eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryHelper = new BatteryStatsHelper(getActivity(), true); 2934bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 2944bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 2954bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk @Override 2968a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren protected int getMetricsCategory() { 2979d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren return MetricsEvent.APPLICATIONS_INSTALLED_APP_DETAILS; 2988a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren } 2998a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren 3008a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren @Override 3014bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public void onResume() { 3024bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk super.onResume(); 30365ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk if (mFinishing) { 30465ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk return; 30565ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk } 306646befdd16fee63fb399aec47950973b64add3baJason Monk mState.requestSize(mPackageName, mUserId); 3074bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk AppItem app = new AppItem(mAppEntry.info.uid); 3084bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk app.addUid(mAppEntry.info.uid); 309b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk if (mStatsSession != null) { 310b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk getLoaderManager().restartLoader(LOADER_CHART_DATA, 311b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk ChartDataLoader.buildArgs(getTemplate(getContext()), app), 312b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk mDataCallbacks); 313b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk } 31465ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk new BatteryUpdater().execute(); 315ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk new MemoryUpdater().execute(); 3164bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 3174bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 3184bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk @Override 3194bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public void onPause() { 3204bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk getLoaderManager().destroyLoader(LOADER_CHART_DATA); 3214bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk super.onPause(); 3224bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 3234bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 3244bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk @Override 3254bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public void onDestroy() { 3264bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk TrafficStats.closeQuietly(mStatsSession); 327d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk if (mPermissionReceiver != null) { 328d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk getContext().unregisterReceiver(mPermissionReceiver); 329d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk mPermissionReceiver = null; 330d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk } 3314bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 3324bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk super.onDestroy(); 333f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn } 334f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 335cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public void onActivityCreated(Bundle savedInstanceState) { 336cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk super.onActivityCreated(savedInstanceState); 33765ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk if (mFinishing) { 33865ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk return; 33965ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk } 340cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk handleHeader(); 34138ba9a2d4350fc7d063ec21c994183258bf7a443Fabrice Di Meglio 342cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mNotificationPreference = findPreference(KEY_NOTIFICATION); 343cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mNotificationPreference.setOnPreferenceClickListener(this); 344cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mStoragePreference = findPreference(KEY_STORAGE); 345cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mStoragePreference.setOnPreferenceClickListener(this); 346cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mPermissionsPreference = findPreference(KEY_PERMISSION); 347cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mPermissionsPreference.setOnPreferenceClickListener(this); 348cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mDataPreference = findPreference(KEY_DATA); 349b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk if (mDataPreference != null) { 350b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk mDataPreference.setOnPreferenceClickListener(this); 351b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk } 3521eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference = findPreference(KEY_BATTERY); 3531eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference.setEnabled(false); 3541eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference.setOnPreferenceClickListener(this); 355ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mMemoryPreference = findPreference(KEY_MEMORY); 356ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mMemoryPreference.setOnPreferenceClickListener(this); 3578b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio 3588b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio mLaunchPreference = findPreference(KEY_LAUNCH); 359f7806581e582e5921d0eb4caa9751d1aa429bc47Jason Monk if (mAppEntry != null && mAppEntry.info != null) { 360ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio if ((mAppEntry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0 || 361ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio !mAppEntry.info.enabled) { 362ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio mLaunchPreference.setEnabled(false); 363ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio } else { 364ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio mLaunchPreference.setOnPreferenceClickListener(this); 365ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio } 3668b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio } else { 367ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio mLaunchPreference.setEnabled(false); 3688b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio } 369cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 3701f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn 371cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private void handleHeader() { 37260a09ea2388db01a661beeb9995a7ecf770a4200Jason Monk mHeader = (LayoutPreference) findPreference(KEY_HEADER); 3731f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn 37442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // Get Control button panel 375cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk View btnPanel = mHeader.findViewById(R.id.control_buttons_panel); 376cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mForceStopButton = (Button) btnPanel.findViewById(R.id.right_button); 37742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mForceStopButton.setText(R.string.force_stop); 378cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mUninstallButton = (Button) btnPanel.findViewById(R.id.left_button); 379cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn mForceStopButton.setEnabled(false); 380afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 381f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu 3823db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 3833db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 384dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk menu.add(0, UNINSTALL_UPDATES, 0, R.string.app_factory_reset) 385dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 3863db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn menu.add(0, UNINSTALL_ALL_USERS_MENU, 1, R.string.uninstall_all_users_text) 3873db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 3883db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 3893db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 3903db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 3913db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public void onPrepareOptionsMenu(Menu menu) { 39238f1889fea1a8ef7f4160044f4fd7e57a9bccd23Jason Monk if (mFinishing) { 39338f1889fea1a8ef7f4160044f4fd7e57a9bccd23Jason Monk return; 39438f1889fea1a8ef7f4160044f4fd7e57a9bccd23Jason Monk } 3953db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn boolean showIt = true; 3963db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (mUpdatedSysApp) { 3973db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 3980fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn } else if (mAppEntry == null) { 3990fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn showIt = false; 4003db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 4013db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 40254b3f501ca4a7ff88ead39247d2277d2efc82bb6Jeff Sharkey } else if (mPackageInfo == null || mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 4033db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 4043db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } else if (UserHandle.myUserId() != 0) { 4053db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 4067a1c4cdfae66e8b110de3988e65586871a969c04Amith Yamasani } else if (mUserManager.getUsers().size() < 2) { 4073db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn showIt = false; 4083db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4093db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn menu.findItem(UNINSTALL_ALL_USERS_MENU).setVisible(showIt); 410dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk mUpdatedSysApp = (mAppEntry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0; 411ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka MenuItem uninstallUpdatesItem = menu.findItem(UNINSTALL_UPDATES); 4129e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka uninstallUpdatesItem.setVisible(mUpdatedSysApp && !mAppsControlDisallowedBySystem); 413ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka if (uninstallUpdatesItem.isVisible()) { 414ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka RestrictedLockUtils.setMenuItemAsDisabledByAdmin(getActivity(), 415ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka uninstallUpdatesItem, mAppsControlDisallowedAdmin); 416ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka } 4173db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4183db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 4193db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 4203db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public boolean onOptionsItemSelected(MenuItem item) { 421dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk switch (item.getItemId()) { 422dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk case UNINSTALL_ALL_USERS_MENU: 423dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk uninstallPkg(mAppEntry.info.packageName, true, false); 424dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk return true; 425dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk case UNINSTALL_UPDATES: 426dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk showDialogInner(DLG_FACTORY_RESET, 0); 427dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk return true; 4283db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4293db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn return false; 4303db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4313db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 4323db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 4333db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public void onActivityResult(int requestCode, int resultCode, Intent data) { 4343db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn super.onActivityResult(requestCode, resultCode, data); 4353db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (requestCode == REQUEST_UNINSTALL) { 4369072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn if (mDisableAfterUninstall) { 4379072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mDisableAfterUninstall = false; 4389072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn try { 4399072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn ApplicationInfo ainfo = getActivity().getPackageManager().getApplicationInfo( 4409072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mAppEntry.info.packageName, PackageManager.GET_UNINSTALLED_PACKAGES 4419072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn | PackageManager.GET_DISABLED_COMPONENTS); 4429072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn if ((ainfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0) { 4439072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn new DisableChanger(this, mAppEntry.info, 4449072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) 4459072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn .execute((Object)null); 4469072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 4479072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } catch (NameNotFoundException e) { 4489072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 4499072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 4503db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (!refreshUi()) { 4513db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn setIntentAndFinish(true, true); 4523db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4533db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4543db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4553db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 4560dd9902c89e7b705fd73158aadf1bf27843ad201Dianne Hackborn // Utility method to set application label and icon. 457f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu private void setAppLabelAndIcon(PackageInfo pkgInfo) { 458cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk final View appSnippet = mHeader.findViewById(R.id.app_snippet); 4590f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mState.ensureIcon(mAppEntry); 4602cdafc6be386bb767404e42fc728a1a810aa896aJason Monk setupAppSnippet(appSnippet, mAppEntry.label, mAppEntry.icon, 4612cdafc6be386bb767404e42fc728a1a810aa896aJason Monk pkgInfo != null ? pkgInfo.versionName : null); 46250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 46350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 4648243c9a722e815bdcb069163de48877478c28dfdChristopher Tate private boolean signaturesMatch(String pkg1, String pkg2) { 4658243c9a722e815bdcb069163de48877478c28dfdChristopher Tate if (pkg1 != null && pkg2 != null) { 4668243c9a722e815bdcb069163de48877478c28dfdChristopher Tate try { 4678243c9a722e815bdcb069163de48877478c28dfdChristopher Tate final int match = mPm.checkSignatures(pkg1, pkg2); 4688243c9a722e815bdcb069163de48877478c28dfdChristopher Tate if (match >= PackageManager.SIGNATURE_MATCH) { 4698243c9a722e815bdcb069163de48877478c28dfdChristopher Tate return true; 4708243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 4718243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } catch (Exception e) { 4728243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // e.g. named alternate package not found during lookup; 4738243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // this is an expected case sometimes 4748243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 4758243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 4768243c9a722e815bdcb069163de48877478c28dfdChristopher Tate return false; 4778243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 4788243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 479cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk @Override 480cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk protected boolean refreshUi() { 481cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk retrieveAppEntry(); 4820f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn if (mAppEntry == null) { 4830f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return false; // onCreate must have failed, make sure to exit 484b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown } 485b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani 486b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani if (mPackageInfo == null) { 4870f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return false; // onCreate must have failed, make sure to exit 48850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 489b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani 4908243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // Get list of "home" apps and trace through any meta-data references 4918243c9a722e815bdcb069163de48877478c28dfdChristopher Tate List<ResolveInfo> homeActivities = new ArrayList<ResolveInfo>(); 4928243c9a722e815bdcb069163de48877478c28dfdChristopher Tate mPm.getHomeActivities(homeActivities); 4938243c9a722e815bdcb069163de48877478c28dfdChristopher Tate mHomePackages.clear(); 4948243c9a722e815bdcb069163de48877478c28dfdChristopher Tate for (int i = 0; i< homeActivities.size(); i++) { 4958243c9a722e815bdcb069163de48877478c28dfdChristopher Tate ResolveInfo ri = homeActivities.get(i); 4968243c9a722e815bdcb069163de48877478c28dfdChristopher Tate final String activityPkg = ri.activityInfo.packageName; 4978243c9a722e815bdcb069163de48877478c28dfdChristopher Tate mHomePackages.add(activityPkg); 4988243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 4998243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // Also make sure to include anything proxying for the home app 5008243c9a722e815bdcb069163de48877478c28dfdChristopher Tate final Bundle metadata = ri.activityInfo.metaData; 5018243c9a722e815bdcb069163de48877478c28dfdChristopher Tate if (metadata != null) { 5028243c9a722e815bdcb069163de48877478c28dfdChristopher Tate final String metaPkg = metadata.getString(ActivityManager.META_HOME_ALTERNATE); 5038243c9a722e815bdcb069163de48877478c28dfdChristopher Tate if (signaturesMatch(metaPkg, activityPkg)) { 5048243c9a722e815bdcb069163de48877478c28dfdChristopher Tate mHomePackages.add(metaPkg); 5058243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 5068243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 5078243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 5088243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 5090f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn checkForceStop(); 5100f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn setAppLabelAndIcon(mPackageInfo); 511cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk initUninstallButtons(); 512cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 513cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Update the preference summaries. 514cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk Activity context = getActivity(); 515cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mStoragePreference.setSummary(AppStorageSettings.getSummary(mAppEntry, context)); 516d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk if (mPermissionReceiver != null) { 517d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk getContext().unregisterReceiver(mPermissionReceiver); 518d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk } 519d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk mPermissionReceiver = PermissionsSummaryHelper.getPermissionSummary(getContext(), 520d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk mPackageName, mPermissionCallback); 5214f4424a820688638930f871ad421e05588549ae5Tony Mantler mLaunchPreference.setSummary(AppUtils.getLaunchByDefaultSummary(mAppEntry, mUsbManager, 522cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mPm, context)); 523cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mNotificationPreference.setSummary(getNotificationSummary(mAppEntry, context, 524cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mBackend)); 525b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk if (mDataPreference != null) { 526b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk mDataPreference.setSummary(getDataSummary()); 527b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk } 528ab616d477be693fc455329953711264af0ed7814Dianne Hackborn 5291eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk updateBattery(); 5301eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 531ab616d477be693fc455329953711264af0ed7814Dianne Hackborn if (!mInitialized) { 532ab616d477be693fc455329953711264af0ed7814Dianne Hackborn // First time init: are we displaying an uninstalled app? 533ab616d477be693fc455329953711264af0ed7814Dianne Hackborn mInitialized = true; 534ab616d477be693fc455329953711264af0ed7814Dianne Hackborn mShowUninstalled = (mAppEntry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0; 5354de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn } else { 5364de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // All other times: if the app no longer exists then we want 5374de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // to go away. 5389072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn try { 539cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk ApplicationInfo ainfo = context.getPackageManager().getApplicationInfo( 5409072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mAppEntry.info.packageName, PackageManager.GET_UNINSTALLED_PACKAGES 5419072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn | PackageManager.GET_DISABLED_COMPONENTS); 5424de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn if (!mShowUninstalled) { 5434de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // If we did not start out with the app uninstalled, then 5444de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // it transitioning to the uninstalled state for the current 5454de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // user means we should go away as well. 5464de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn return (ainfo.flags&ApplicationInfo.FLAG_INSTALLED) != 0; 5474de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn } 5489072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } catch (NameNotFoundException e) { 5499072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn return false; 5509072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 551ab616d477be693fc455329953711264af0ed7814Dianne Hackborn } 552ab616d477be693fc455329953711264af0ed7814Dianne Hackborn 5530f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return true; 554afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 5553465b67740e17711af2b36b09e2250a02275d860Jake Hamby 5561eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private void updateBattery() { 5571eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk if (mSipper != null) { 5581eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference.setEnabled(true); 5591eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk int dischargeAmount = mBatteryHelper.getStats().getDischargeAmount( 5601eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk BatteryStats.STATS_SINCE_CHARGED); 5611eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk final int percentOfMax = (int) ((mSipper.totalPowerMah) 5621eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk / mBatteryHelper.getTotalPower() * dischargeAmount + .5f); 5631eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference.setSummary(getString(R.string.battery_summary, percentOfMax)); 5641eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } else { 5651eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference.setEnabled(false); 5661eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference.setSummary(getString(R.string.no_battery_summary)); 5671eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 5681eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 5691eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 5704bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk private CharSequence getDataSummary() { 5714bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk if (mChartData != null) { 5724bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk long totalBytes = mChartData.detail.getTotalBytes(); 57351334310a26a29d3ac3ad4e7299110b6de0ae75cJason Monk if (totalBytes == 0) { 57451334310a26a29d3ac3ad4e7299110b6de0ae75cJason Monk return getString(R.string.no_data_usage); 57551334310a26a29d3ac3ad4e7299110b6de0ae75cJason Monk } 5764bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk Context context = getActivity(); 5774bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk return getString(R.string.data_summary_format, 5784bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk Formatter.formatFileSize(context, totalBytes), 5794bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk DateUtils.formatDateTime(context, mChartData.detail.getStart(), 5804bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_MONTH)); 5814bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 5824bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk return getString(R.string.computing_size); 5834bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 5844bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 585cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk @Override 586cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk protected AlertDialog createDialog(int id, int errorCode) { 587cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk switch (id) { 588cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk case DLG_DISABLE: 589cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return new AlertDialog.Builder(getActivity()) 590cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setMessage(getActivity().getText(R.string.app_disable_dlg_text)) 59153a5d7ff2ce3ab446f4ad046e6703ed2caa18fa4Jason Monk .setPositiveButton(R.string.app_disable_dlg_positive, 59253a5d7ff2ce3ab446f4ad046e6703ed2caa18fa4Jason Monk new DialogInterface.OnClickListener() { 593cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public void onClick(DialogInterface dialog, int which) { 594cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Disable the app 595cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk new DisableChanger(InstalledAppDetails.this, mAppEntry.info, 596cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) 597cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .execute((Object)null); 598cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 599cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk }) 600cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setNegativeButton(R.string.dlg_cancel, null) 601cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .create(); 602cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk case DLG_SPECIAL_DISABLE: 603cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return new AlertDialog.Builder(getActivity()) 604cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setMessage(getActivity().getText(R.string.app_special_disable_dlg_text)) 60553a5d7ff2ce3ab446f4ad046e6703ed2caa18fa4Jason Monk .setPositiveButton(R.string.app_disable_dlg_positive, 60653a5d7ff2ce3ab446f4ad046e6703ed2caa18fa4Jason Monk new DialogInterface.OnClickListener() { 607cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public void onClick(DialogInterface dialog, int which) { 608cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Clear user data here 609cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk uninstallPkg(mAppEntry.info.packageName, 610cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk false, true); 611cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 612cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk }) 613cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setNegativeButton(R.string.dlg_cancel, null) 614cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .create(); 615cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk case DLG_FORCE_STOP: 616cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return new AlertDialog.Builder(getActivity()) 617cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setTitle(getActivity().getText(R.string.force_stop_dlg_title)) 618cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setMessage(getActivity().getText(R.string.force_stop_dlg_text)) 619cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() { 620cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public void onClick(DialogInterface dialog, int which) { 621cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Force stop 622cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk forceStopPackage(mAppEntry.info.packageName); 623cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 624cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk }) 625cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setNegativeButton(R.string.dlg_cancel, null) 626cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .create(); 627cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk case DLG_FACTORY_RESET: 628cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return new AlertDialog.Builder(getActivity()) 629cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setTitle(getActivity().getText(R.string.app_factory_reset_dlg_title)) 630cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setMessage(getActivity().getText(R.string.app_factory_reset_dlg_text)) 631cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() { 632cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public void onClick(DialogInterface dialog, int which) { 633cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Clear user data here 634cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk uninstallPkg(mAppEntry.info.packageName, 635cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk false, false); 636cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 637cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk }) 638cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setNegativeButton(R.string.dlg_cancel, null) 639cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .create(); 640cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 641cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return null; 64250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 64350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 6449072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn private void uninstallPkg(String packageName, boolean allUsers, boolean andDisable) { 64550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Create new intent to launch Uninstaller activity 64650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu Uri packageURI = Uri.parse("package:"+packageName); 6473db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageURI); 6483db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, allUsers); 6493db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn startActivityForResult(uninstallIntent, REQUEST_UNINSTALL); 6509072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mDisableAfterUninstall = andDisable; 65150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 65250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 65342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private void forceStopPackage(String pkgName) { 654f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn ActivityManager am = (ActivityManager)getActivity().getSystemService( 65542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Context.ACTIVITY_SERVICE); 65642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu am.forceStopPackage(pkgName); 65707025891683aef83d850b0a91b37aa75b11ce33cJason Monk int userId = UserHandle.getUserId(mAppEntry.info.uid); 65807025891683aef83d850b0a91b37aa75b11ce33cJason Monk mState.invalidatePackage(pkgName, userId); 65907025891683aef83d850b0a91b37aa75b11ce33cJason Monk ApplicationsState.AppEntry newEnt = mState.getEntry(pkgName, userId); 660c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn if (newEnt != null) { 661c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn mAppEntry = newEnt; 662c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn } 663cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn checkForceStop(); 66442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 66542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 666861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn private void updateForceStopButton(boolean enabled) { 6679e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka if (mAppsControlDisallowedBySystem) { 6689e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka mForceStopButton.setEnabled(false); 6699e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka } else { 6709e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka mForceStopButton.setEnabled(enabled); 6719e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka mForceStopButton.setOnClickListener(InstalledAppDetails.this); 6729e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka } 673861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn } 674cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 675cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn private void checkForceStop() { 6765c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 6775c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn // User can't force stop device admin. 6785c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn updateForceStopButton(false); 6795c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn } else if ((mAppEntry.info.flags&ApplicationInfo.FLAG_STOPPED) == 0) { 680861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn // If the app isn't explicitly stopped, then always show the 681861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn // force stop button. 682861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn updateForceStopButton(true); 683861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn } else { 6845c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART, 6855c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn Uri.fromParts("package", mAppEntry.info.packageName, null)); 6865c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName }); 6875c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid); 688c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn intent.putExtra(Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(mAppEntry.info.uid)); 6898243c9a722e815bdcb069163de48877478c28dfdChristopher Tate getActivity().sendOrderedBroadcastAsUser(intent, UserHandle.CURRENT, null, 6908243c9a722e815bdcb069163de48877478c28dfdChristopher Tate mCheckKillProcessesReceiver, null, Activity.RESULT_CANCELED, null, null); 691861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn } 692cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn } 69370b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler 69479021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov private void startManagePermissionsActivity() { 69579021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov // start new activity to manage app permissions 69679021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov Intent intent = new Intent(Intent.ACTION_MANAGE_APP_PERMISSIONS); 69779021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov intent.putExtra(Intent.EXTRA_PACKAGE_NAME, mAppEntry.info.packageName); 698e492ee06adbf4661d8b8b53f41f236c9173c5ca4Julia Reynolds intent.putExtra(AppHeader.EXTRA_HIDE_INFO_BUTTON, true); 69979021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov try { 70079021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov startActivity(intent); 70179021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov } catch (ActivityNotFoundException e) { 70279021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov Log.w(LOG_TAG, "No app can handle android.intent.action.MANAGE_APP_PERMISSIONS"); 70379021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov } 70479021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov } 70579021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov 706255452fdf4b368f150477e818b326a60210f22c1Jason Monk private void startAppInfoFragment(Class<?> fragment, CharSequence title) { 707cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // start new fragment to display extended information 708cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk Bundle args = new Bundle(); 709255452fdf4b368f150477e818b326a60210f22c1Jason Monk args.putString(ARG_PACKAGE_NAME, mAppEntry.info.packageName); 710255452fdf4b368f150477e818b326a60210f22c1Jason Monk args.putInt(ARG_PACKAGE_UID, mAppEntry.info.uid); 711e492ee06adbf4661d8b8b53f41f236c9173c5ca4Julia Reynolds args.putBoolean(AppHeader.EXTRA_HIDE_INFO_BUTTON, true); 7129db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn 713cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk SettingsActivity sa = (SettingsActivity) getActivity(); 714cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk sa.startPreferencePanel(fragment.getName(), args, -1, title, this, SUB_INFO_FRAGMENT); 7159db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 7169db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn 717afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project /* 718afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Method implementing functionality of buttons clicked 719afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * @see android.view.View.OnClickListener#onClick(android.view.View) 720afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 721afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public void onClick(View v) { 7226e2e8e17cfea09548067baa8b361dbc31dce385cJason Monk if (mAppEntry == null) { 7236e2e8e17cfea09548067baa8b361dbc31dce385cJason Monk setIntentAndFinish(true, true); 7246e2e8e17cfea09548067baa8b361dbc31dce385cJason Monk return; 7256e2e8e17cfea09548067baa8b361dbc31dce385cJason Monk } 7260f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn String packageName = mAppEntry.info.packageName; 72742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu if(v == mUninstallButton) { 728ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka EnforcedAdmin admin = RestrictedLockUtils.checkIfUninstallBlocked(getActivity(), 729ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka packageName, mUserId); 7309e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka boolean uninstallBlockedBySystem = mAppsControlDisallowedBySystem || 7319e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka RestrictedLockUtils.hasBaseUserRestriction(getActivity(), packageName, mUserId); 7329e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka if (admin != null && !uninstallBlockedBySystem) { 733ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getActivity(), admin); 734ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 73577537b697b411df54dedd65b1e5ca4eb5dd00846Jason Monk if (mAppEntry.info.enabled && !isDisabledUntilUsed()) { 736dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk if (mUpdatedSysApp) { 737dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk showDialogInner(DLG_SPECIAL_DISABLE, 0); 738f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn } else { 739dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk showDialogInner(DLG_DISABLE, 0); 740f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn } 7419db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } else { 742dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk new DisableChanger(this, mAppEntry.info, 743dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) 744dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk .execute((Object) null); 7459db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } 746dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_INSTALLED) == 0) { 747dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk uninstallPkg(packageName, true, false); 748dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk } else { 749dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk uninstallPkg(packageName, false, false); 750afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 751afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else if (v == mForceStopButton) { 7529e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka if (mAppsControlDisallowedAdmin != null && !mAppsControlDisallowedBySystem) { 753ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka RestrictedLockUtils.sendShowAdminSupportDetailsIntent( 754ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka getActivity(), mAppsControlDisallowedAdmin); 755ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka } else { 756ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka showDialogInner(DLG_FORCE_STOP, 0); 757ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka //forceStopPackage(mAppInfo.packageName); 758ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka } 759afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 760afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 761aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn 762aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn @Override 763cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public boolean onPreferenceClick(Preference preference) { 764cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk if (preference == mStoragePreference) { 765cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk startAppInfoFragment(AppStorageSettings.class, mStoragePreference.getTitle()); 766cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } else if (preference == mNotificationPreference) { 767255452fdf4b368f150477e818b326a60210f22c1Jason Monk startAppInfoFragment(AppNotificationSettings.class, 768255452fdf4b368f150477e818b326a60210f22c1Jason Monk getString(R.string.app_notifications_title)); 769cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } else if (preference == mPermissionsPreference) { 77079021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov startManagePermissionsActivity(); 771cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } else if (preference == mLaunchPreference) { 772cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk startAppInfoFragment(AppLaunchSettings.class, mLaunchPreference.getTitle()); 773ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } else if (preference == mMemoryPreference) { 774ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk ProcessStatsBase.launchMemoryDetail((SettingsActivity) getActivity(), 775e492ee06adbf4661d8b8b53f41f236c9173c5ca4Julia Reynolds mStatsManager.getMemInfo(), mStats, false); 776cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } else if (preference == mDataPreference) { 777b37e2887d3112082589997f1bbd802ec282cca6dJason Monk startAppInfoFragment(AppDataUsage.class, getString(R.string.app_data_usage)); 7781eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } else if (preference == mBatteryPreference) { 7791eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk BatteryEntry entry = new BatteryEntry(getActivity(), null, mUserManager, mSipper); 7801eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk PowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(), 781e492ee06adbf4661d8b8b53f41f236c9173c5ca4Julia Reynolds mBatteryHelper, BatteryStats.STATS_SINCE_CHARGED, entry, true, false); 782cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } else { 783cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return false; 784cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 785cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return true; 786cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 787cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 7882cdafc6be386bb767404e42fc728a1a810aa896aJason Monk public static void setupAppSnippet(View appSnippet, CharSequence label, Drawable icon, 7892cdafc6be386bb767404e42fc728a1a810aa896aJason Monk CharSequence versionName) { 7902cdafc6be386bb767404e42fc728a1a810aa896aJason Monk LayoutInflater.from(appSnippet.getContext()).inflate(R.layout.widget_text_views, 7912cdafc6be386bb767404e42fc728a1a810aa896aJason Monk (ViewGroup) appSnippet.findViewById(android.R.id.widget_frame)); 7922cdafc6be386bb767404e42fc728a1a810aa896aJason Monk 7932cdafc6be386bb767404e42fc728a1a810aa896aJason Monk ImageView iconView = (ImageView) appSnippet.findViewById(android.R.id.icon); 7942cdafc6be386bb767404e42fc728a1a810aa896aJason Monk iconView.setImageDrawable(icon); 7952cdafc6be386bb767404e42fc728a1a810aa896aJason Monk // Set application name. 7962cdafc6be386bb767404e42fc728a1a810aa896aJason Monk TextView labelView = (TextView) appSnippet.findViewById(android.R.id.title); 7972cdafc6be386bb767404e42fc728a1a810aa896aJason Monk labelView.setText(label); 7982cdafc6be386bb767404e42fc728a1a810aa896aJason Monk // Version number of application 7992cdafc6be386bb767404e42fc728a1a810aa896aJason Monk TextView appVersion = (TextView) appSnippet.findViewById(R.id.widget_text1); 8002cdafc6be386bb767404e42fc728a1a810aa896aJason Monk 8012cdafc6be386bb767404e42fc728a1a810aa896aJason Monk if (!TextUtils.isEmpty(versionName)) { 802b01459997ed4d0232855e4dbc080bd1238e1256dJason Monk appVersion.setSelected(true); 8032cdafc6be386bb767404e42fc728a1a810aa896aJason Monk appVersion.setVisibility(View.VISIBLE); 8042cdafc6be386bb767404e42fc728a1a810aa896aJason Monk appVersion.setText(appSnippet.getContext().getString(R.string.version_text, 8052cdafc6be386bb767404e42fc728a1a810aa896aJason Monk String.valueOf(versionName))); 8062cdafc6be386bb767404e42fc728a1a810aa896aJason Monk } else { 8072cdafc6be386bb767404e42fc728a1a810aa896aJason Monk appVersion.setVisibility(View.INVISIBLE); 8082cdafc6be386bb767404e42fc728a1a810aa896aJason Monk } 8092cdafc6be386bb767404e42fc728a1a810aa896aJason Monk } 8102cdafc6be386bb767404e42fc728a1a810aa896aJason Monk 8113069581512bcb9687cb8d79675f6c4950c9ac087Jason Monk public static NetworkTemplate getTemplate(Context context) { 812b37e2887d3112082589997f1bbd802ec282cca6dJason Monk if (DataUsageList.hasReadyMobileRadio(context)) { 81310e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk return NetworkTemplate.buildTemplateMobileWildcard(); 81410e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk } 81510e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk if (DataUsageSummary.hasWifiRadio(context)) { 81610e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk return NetworkTemplate.buildTemplateWifiWildcard(); 81710e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk } 81810e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk return NetworkTemplate.buildTemplateEthernet(); 81910e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk } 82010e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk 821cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public static CharSequence getNotificationSummary(AppEntry appEntry, Context context) { 822584b2b2bc17a4ccf42952b188722de1091c101beJason Monk return getNotificationSummary(appEntry, context, new NotificationBackend()); 823cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 824cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 825cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public static CharSequence getNotificationSummary(AppEntry appEntry, Context context, 826584b2b2bc17a4ccf42952b188722de1091c101beJason Monk NotificationBackend backend) { 827584b2b2bc17a4ccf42952b188722de1091c101beJason Monk AppRow appRow = backend.loadAppRow(context.getPackageManager(), appEntry.info); 828584b2b2bc17a4ccf42952b188722de1091c101beJason Monk return getNotificationSummary(appRow, context); 829584b2b2bc17a4ccf42952b188722de1091c101beJason Monk } 830584b2b2bc17a4ccf42952b188722de1091c101beJason Monk 831584b2b2bc17a4ccf42952b188722de1091c101beJason Monk public static CharSequence getNotificationSummary(AppRow appRow, Context context) { 832cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk if (appRow.banned) { 833cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return context.getString(R.string.notifications_disabled); 834e07f385ae0acfcf8466859cb65f883e0b9830d90Julia Reynolds } else if (appRow.bannedTopics) { 835e07f385ae0acfcf8466859cb65f883e0b9830d90Julia Reynolds return context.getString(R.string.notifications_partially_disabled); 836cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 8376f526fcaf3dc83a5988a522bfa2b542390ece234Julia Reynolds return context.getString(R.string.notifications_enabled); 838cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 839cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 840ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk private class MemoryUpdater extends AsyncTask<Void, Void, ProcStatsPackageEntry> { 841ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk 842ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk @Override 843ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk protected ProcStatsPackageEntry doInBackground(Void... params) { 844ed91bbdb1f2087a9ffcfebc6c0425d1f45976e22Julia Reynolds if (getActivity() == null) { 845ed91bbdb1f2087a9ffcfebc6c0425d1f45976e22Julia Reynolds return null; 846ed91bbdb1f2087a9ffcfebc6c0425d1f45976e22Julia Reynolds } 847ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk if (mPackageInfo == null) { 848ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk return null; 849ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 850ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk if (mStatsManager == null) { 851ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mStatsManager = new ProcStatsData(getActivity(), false); 852ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mStatsManager.setDuration(ProcessStatsBase.sDurations[0]); 853ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 854ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mStatsManager.refreshStats(true); 855ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk for (ProcStatsPackageEntry pkgEntry : mStatsManager.getEntries()) { 856ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk for (ProcStatsEntry entry : pkgEntry.mEntries) { 857ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk if (entry.mUid == mPackageInfo.applicationInfo.uid) { 858ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk pkgEntry.updateMetrics(); 859ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk return pkgEntry; 860ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 861ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 862ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 863ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk return null; 864ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 865ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk 866ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk @Override 867ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk protected void onPostExecute(ProcStatsPackageEntry entry) { 868ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk if (getActivity() == null) { 869ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk return; 870ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 871ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk if (entry != null) { 872ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mStats = entry; 873ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mMemoryPreference.setEnabled(true); 874ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk double amount = Math.max(entry.mRunWeight, entry.mBgWeight) 875ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk * mStatsManager.getMemInfo().weightToRam; 876ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mMemoryPreference.setSummary(getString(R.string.memory_use_summary, 877ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk Formatter.formatShortFileSize(getContext(), (long) amount))); 878ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } else { 879ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mMemoryPreference.setEnabled(false); 880ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mMemoryPreference.setSummary(getString(R.string.no_memory_use_summary)); 881ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 882ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 883ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk 884ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 885ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk 8861eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private class BatteryUpdater extends AsyncTask<Void, Void, Void> { 8871eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk @Override 8881eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk protected Void doInBackground(Void... params) { 8891eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryHelper.create((Bundle) null); 8901eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, 8911eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mUserManager.getUserProfiles()); 8921eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk List<BatterySipper> usageList = mBatteryHelper.getUsageList(); 8931eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk final int N = usageList.size(); 8941eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk for (int i = 0; i < N; i++) { 8951eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk BatterySipper sipper = usageList.get(i); 8961eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk if (sipper.getUid() == mPackageInfo.applicationInfo.uid) { 8971eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mSipper = sipper; 8981eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk break; 8991eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 9001eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 9011eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk return null; 9021eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 9031eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 9041eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk @Override 9051eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk protected void onPostExecute(Void result) { 906ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk if (getActivity() == null) { 907ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk return; 908ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 9091eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk refreshUi(); 9101eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 9111eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 9121eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 9131eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private static class DisableChanger extends AsyncTask<Object, Object, Object> { 914cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk final PackageManager mPm; 915cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk final WeakReference<InstalledAppDetails> mActivity; 916cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk final ApplicationInfo mInfo; 917cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk final int mState; 918cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 919cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk DisableChanger(InstalledAppDetails activity, ApplicationInfo info, int state) { 920cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mPm = activity.mPm; 921cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mActivity = new WeakReference<InstalledAppDetails>(activity); 922cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mInfo = info; 923cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mState = state; 924cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 925cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 926cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk @Override 927cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk protected Object doInBackground(Object... params) { 928cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mPm.setApplicationEnabledSetting(mInfo.packageName, mState, 0); 929cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return null; 930aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } 931aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn } 932cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 9334bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk private final LoaderCallbacks<ChartData> mDataCallbacks = new LoaderCallbacks<ChartData>() { 9344bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 9354bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk @Override 9364bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public Loader<ChartData> onCreateLoader(int id, Bundle args) { 9374bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk return new ChartDataLoader(getActivity(), mStatsSession, args); 9384bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 9394bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 9404bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk @Override 9414bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public void onLoadFinished(Loader<ChartData> loader, ChartData data) { 9424bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mChartData = data; 9434bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mDataPreference.setSummary(getDataSummary()); 9444bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 9454bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 9464bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk @Override 9474bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public void onLoaderReset(Loader<ChartData> loader) { 948e950b54fcd6a1d496f47479c230b7c4814e67414Jason Monk // Leave last result. 9494bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 9504bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk }; 9514bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 952cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() { 953cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk @Override 954cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public void onReceive(Context context, Intent intent) { 955cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk updateForceStopButton(getResultCode() != Activity.RESULT_CANCELED); 956cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 957cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk }; 958e9866b6dc47201630c057f946423d572b8c46af8Jason Monk 959375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki private final PermissionsResultCallback mPermissionCallback 960375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki = new PermissionsResultCallback() { 961e9866b6dc47201630c057f946423d572b8c46af8Jason Monk @Override 962375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki public void onPermissionSummaryResult(int[] counts, CharSequence[] groupLabels) { 963d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk if (getActivity() == null) { 964d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk return; 965d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk } 966d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk mPermissionReceiver = null; 967375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki final Resources res = getResources(); 968375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki CharSequence summary = null; 969375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki if (counts != null) { 970375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki int totalCount = counts[1]; 971375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki int additionalCounts = counts[2]; 972375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki 973375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki if (totalCount == 0) { 974375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki summary = res.getString( 975375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki R.string.runtime_permissions_summary_no_permissions_requested); 976375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki } else { 977375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki final ArrayList<CharSequence> list = new ArrayList(Arrays.asList(groupLabels)); 978375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki if (additionalCounts > 0) { 979375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki // N additional permissions. 980375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki list.add(res.getQuantityString( 981375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki R.plurals.runtime_permissions_additional_count, 982375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki additionalCounts, additionalCounts)); 983375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki } 984375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki if (list.size() == 0) { 985375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki summary = res.getString( 986375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki R.string.runtime_permissions_summary_no_permissions_granted); 987375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki } else { 988375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki summary = ListFormatter.getInstance().format(list); 989375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki } 990375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki } 991e9866b6dc47201630c057f946423d572b8c46af8Jason Monk } 992375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki mPermissionsPreference.setSummary(summary); 993e9866b6dc47201630c057f946423d572b8c46af8Jason Monk } 994e9866b6dc47201630c057f946423d572b8c46af8Jason Monk }; 995afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project} 996