InstalledAppDetails.java revision ed5c50a9cb5b67c8eed9661221f8825b69dd4da8
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 192108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monkimport android.app.Activity; 20afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.ActivityManager; 21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.AlertDialog; 22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.LoaderManager.LoaderCallbacks; 234bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.app.admin.DevicePolicyManager; 243e912e7ea537ae34234ccbe6fef9b2519a4da51bJulia Reynoldsimport android.content.ActivityNotFoundException; 2567cd6ab93a526fe65877743e458590f4e6f187eeTony Mantlerimport android.content.BroadcastReceiver; 2679021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganovimport android.content.ComponentName; 27cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackbornimport android.content.Context; 28c9029d99a36d78331b109b64c1f61812db7cedd9Michael Jurkaimport android.content.DialogInterface; 29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent; 30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Loader; 31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.ApplicationInfo; 324bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.content.pm.PackageInfo; 33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager; 3450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.content.pm.PackageManager.NameNotFoundException; 35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.ResolveInfo; 36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.UserInfo; 37cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport android.content.res.Resources; 38d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevotimport android.graphics.drawable.Drawable; 39375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onukiimport android.icu.text.ListFormatter; 402cdafc6be386bb767404e42fc728a1a810aa896aJason Monkimport android.net.INetworkStatsService; 41b37e2887d3112082589997f1bbd802ec282cca6dJason Monkimport android.net.INetworkStatsSession; 424bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.net.NetworkTemplate; 434bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.net.TrafficStats; 444bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.net.Uri; 454bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.os.AsyncTask; 46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.BatteryStats; 479db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackbornimport android.os.Bundle; 481eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport android.os.RemoteException; 49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.ServiceManager; 504bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.os.UserHandle; 514bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.os.UserManager; 523db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.support.v7.preference.Preference; 53ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shankaimport android.support.v7.preference.Preference.OnPreferenceClickListener; 54beb5e5210b55926fa4a7302a9e9d00ef49f40314Julia Reynoldsimport android.text.TextUtils; 5539b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.text.format.DateUtils; 5639b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.text.format.Formatter; 572108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monkimport android.util.Log; 582108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monkimport android.view.LayoutInflater; 592cdafc6be386bb767404e42fc728a1a810aa896aJason Monkimport android.view.Menu; 604bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.view.MenuInflater; 614bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monkimport android.view.MenuItem; 6279021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganovimport android.view.View; 632cdafc6be386bb767404e42fc728a1a810aa896aJason Monkimport android.view.ViewGroup; 643db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.widget.Button; 653db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.widget.ImageView; 663db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackbornimport android.widget.TextView; 67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.internal.logging.MetricsProto.MetricsEvent; 680c55bb103cb63df5b1e8665369f28251551d0524Jason Monkimport com.android.internal.os.BatterySipper; 692cdafc6be386bb767404e42fc728a1a810aa896aJason Monkimport com.android.internal.os.BatteryStatsHelper; 70a4e32a24c4f70c6c54a459cbeaf70a6eac63f52cGustav Senntonimport com.android.settings.AppHeader; 71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.settings.DeviceAdminAdd; 72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.settings.R; 73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.settings.SettingsActivity; 749d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wrenimport com.android.settings.Utils; 751eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport com.android.settings.applications.PermissionsSummaryHelper.PermissionsResultCallback; 761eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport com.android.settings.datausage.AppDataUsage; 773e912e7ea537ae34234ccbe6fef9b2519a4da51bJulia Reynoldsimport com.android.settings.datausage.DataUsageList; 78e492ee06adbf4661d8b8b53f41f236c9173c5ca4Julia Reynoldsimport com.android.settings.datausage.DataUsageSummary; 7902a06eff4269e8b7958a5719a3733147086f8424Suprabh Shuklaimport com.android.settings.fuelgauge.BatteryEntry; 80cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport com.android.settings.fuelgauge.PowerUsageDetail; 81cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport com.android.settings.notification.AppNotificationSettings; 82cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monkimport com.android.settings.notification.NotificationBackend; 83e9866b6dc47201630c057f946423d572b8c46af8Jason Monkimport com.android.settings.notification.NotificationBackend.AppRow; 84b37e2887d3112082589997f1bbd802ec282cca6dJason Monkimport com.android.settingslib.AppItem; 85b37e2887d3112082589997f1bbd802ec282cca6dJason Monkimport com.android.settingslib.RestrictedLockUtils; 86b37e2887d3112082589997f1bbd802ec282cca6dJason Monkimport com.android.settingslib.applications.AppUtils; 871eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport com.android.settingslib.applications.ApplicationsState; 881eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monkimport com.android.settingslib.applications.ApplicationsState.AppEntry; 89255452fdf4b368f150477e818b326a60210f22c1Jason Monkimport com.android.settingslib.net.ChartData; 90584b2b2bc17a4ccf42952b188722de1091c101beJason Monkimport com.android.settingslib.net.ChartDataLoader; 91584b2b2bc17a4ccf42952b188722de1091c101beJason Monk 92de557d48badd10b7313ea2b40ff8156577a14678Wei Liuimport java.lang.ref.WeakReference; 93ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shankaimport java.util.ArrayList; 944f4424a820688638930f871ad421e05588549ae5Tony Mantlerimport java.util.Arrays; 95de557d48badd10b7313ea2b40ff8156577a14678Wei Liuimport java.util.HashSet; 9639b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport java.util.List; 97de557d48badd10b7313ea2b40ff8156577a14678Wei Liu 98de557d48badd10b7313ea2b40ff8156577a14678Wei Liuimport static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; 99cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 100cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk/** 101cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk * Activity to display application information from Settings. This activity presents 102375c3a080ebc7651a16cf09c12841a6f4d6b8c73Makoto Onuki * extended information associated with a package like code, data, total size, permissions 103cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk * used by the application and also the set of default launchable activities. 104cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk * For system applications, an option to clear user data is displayed only if data size is > 0. 105cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk * System applications that do not want clear user data do not have this option. 106ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka * For non-system applications, there is no option to clear data. Instead there is an option to 107ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka * uninstall the application. 108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */ 109afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpublic class InstalledAppDetails extends AppInfoBase 110afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project implements View.OnClickListener, OnPreferenceClickListener { 111afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 112afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project private static final String LOG_TAG = "InstalledAppDetails"; 113afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 114afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project // Menu identifiers 115afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public static final int UNINSTALL_ALL_USERS_MENU = 1; 116afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project public static final int UNINSTALL_UPDATES = 2; 117cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 118cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Result code identifiers 119cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public static final int REQUEST_UNINSTALL = 0; 12079021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov private static final int REQUEST_REMOVE_DEVICE_ADMIN = 1; 12179021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov 122cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final int SUB_INFO_FRAGMENT = 1; 123cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 124dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk private static final int LOADER_CHART_DATA = 2; 125cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 126cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final int DLG_FORCE_STOP = DLG_BASE + 1; 127cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final int DLG_DISABLE = DLG_BASE + 2; 12802a06eff4269e8b7958a5719a3733147086f8424Suprabh Shukla private static final int DLG_SPECIAL_DISABLE = DLG_BASE + 3; 12902a06eff4269e8b7958a5719a3733147086f8424Suprabh Shukla private static final int DLG_FACTORY_RESET = DLG_BASE + 4; 130cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 131cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_HEADER = "header_view"; 1324bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk private static final String KEY_NOTIFICATION = "notification_settings"; 1334bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk private static final String KEY_STORAGE = "storage_settings"; 134cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_PERMISSION = "permission_settings"; 135cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_DATA = "data_settings"; 136cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_LAUNCH = "preferred_settings"; 137cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_BATTERY = "battery"; 138cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private static final String KEY_MEMORY = "memory"; 139cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 140cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private final HashSet<String> mHomePackages = new HashSet<String>(); 141cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 142cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private boolean mInitialized; 143cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private boolean mShowUninstalled; 1441eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private LayoutPreference mHeader; 145ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk private Button mUninstallButton; 146cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private boolean mUpdatedSysApp = false; 147cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private Button mForceStopButton; 148f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn private Preference mNotificationPreference; 149ab616d477be693fc455329953711264af0ed7814Dianne Hackborn private Preference mStoragePreference; 150ab616d477be693fc455329953711264af0ed7814Dianne Hackborn private Preference mPermissionsPreference; 15160a09ea2388db01a661beeb9995a7ecf770a4200Jason Monk private Preference mLaunchPreference; 15242241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private Preference mDataPreference; 15342241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private Preference mMemoryPreference; 154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 155cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private boolean mDisableAfterUninstall; 156cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Used for updating notification preference. 157cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private final NotificationBackend mBackend = new NotificationBackend(); 158cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 159cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private ChartData mChartData; 160ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk private INetworkStatsSession mStatsSession; 1618243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 1629072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn private Preference mBatteryPreference; 163cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 164584b2b2bc17a4ccf42952b188722de1091c101beJason Monk private BatteryStatsHelper mBatteryHelper; 16542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu private BatterySipper mSipper; 1664bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 1674bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk protected ProcStatsData mStatsManager; 1684bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk protected ProcStatsPackageEntry mStats; 1691eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 1701eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private BroadcastReceiver mPermissionReceiver; 1711eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 1721eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk private boolean handleDisableable(Button button) { 1731eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk boolean disableable = false; 174ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk // Try to prevent the user from bricking their phone 175ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk // by not allowing disabling of apps signed with the 176ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk // system cert and any launcher app in the system. 177d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk if (mHomePackages.contains(mAppEntry.info.packageName) 178d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk || Utils.isSystemPackage(mPm, mPackageInfo)) { 1799072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn // Disable button for core system applications. 1809072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn button.setText(R.string.disable_text); 1818243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } else if (mAppEntry.info.enabled && !isDisabledUntilUsed()) { 1828243c9a722e815bdcb069163de48877478c28dfdChristopher Tate button.setText(R.string.disable_text); 1838243c9a722e815bdcb069163de48877478c28dfdChristopher Tate disableable = true; 184b58b5127040b3c843fe42544a89a1085cf7e74f6Dan Sandler } else { 185b58b5127040b3c843fe42544a89a1085cf7e74f6Dan Sandler button.setText(R.string.enable_text); 1868243c9a722e815bdcb069163de48877478c28dfdChristopher Tate disableable = true; 1878243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 18877537b697b411df54dedd65b1e5ca4eb5dd00846Jason Monk 1898243c9a722e815bdcb069163de48877478c28dfdChristopher Tate return disableable; 1908243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 1918243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 1928243c9a722e815bdcb069163de48877478c28dfdChristopher Tate private boolean isDisabledUntilUsed() { 1938243c9a722e815bdcb069163de48877478c28dfdChristopher Tate return mAppEntry.info.enabledSetting 1949072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED; 1958243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 1969072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn 1979072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn private void initUninstallButtons() { 1989072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn final boolean isBundled = (mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0; 19977537b697b411df54dedd65b1e5ca4eb5dd00846Jason Monk boolean enabled = true; 20077537b697b411df54dedd65b1e5ca4eb5dd00846Jason Monk if (isBundled) { 20177537b697b411df54dedd65b1e5ca4eb5dd00846Jason Monk enabled = handleDisableable(mUninstallButton); 20277537b697b411df54dedd65b1e5ca4eb5dd00846Jason Monk } else { 20377537b697b411df54dedd65b1e5ca4eb5dd00846Jason Monk if ((mPackageInfo.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED) == 0 204de03ac27b74d1d69c1fea36e7fb00f068ab16b21Suchi Amalapurapu && mUserManager.getUsers().size() >= 2) { 205568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // When we have multiple users, there is a separate menu 20642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // to uninstall for all users. 207dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk enabled = false; 208dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk } 20942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu mUninstallButton.setText(R.string.uninstall_text); 210dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk } 2114de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // If this is a device admin, it can't be uninstalled or disabled. 2124de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn // We do this here so the text of the button is still set correctly. 2134de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn if (isBundled && mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 214c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn enabled = false; 215b99e029db14ae276a47da39da9378b6af9aef403Suchi Amalapurapu } 216dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk 21742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // We don't allow uninstalling DO/PO on *any* users, because if it's a system app, 218c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate // "uninstall" is actually "downgrade to the system version + disable", and "downgrade" 2195c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn // will clear data on all users. 22002a06eff4269e8b7958a5719a3733147086f8424Suprabh Shukla if (isProfileOrDeviceOwner(mPackageInfo.packageName)) { 2215c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn enabled = false; 2225c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn } 223c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate 2244cfe39f5397d037d106abf07db31b0e01484bd92Makoto Onuki // If the uninstall intent is already queued, disable the uninstall button 2254cfe39f5397d037d106abf07db31b0e01484bd92Makoto Onuki if (mDpm.isUninstallInQueue(mPackageName)) { 2264cfe39f5397d037d106abf07db31b0e01484bd92Makoto Onuki enabled = false; 227d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot } 228d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot 229d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot // Home apps need special handling. Bundled ones we don't risk downgrading 230d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot // because that can interfere with home-key resolution. Furthermore, we 23102a06eff4269e8b7958a5719a3733147086f8424Suprabh Shukla // can't allow uninstallation of the only home app, and we don't want to 23202a06eff4269e8b7958a5719a3733147086f8424Suprabh Shukla // allow uninstallation of an explicitly preferred one -- the user can go 23302a06eff4269e8b7958a5719a3733147086f8424Suprabh Shukla // to Home settings and pick a different one, after which we'll permit 23402a06eff4269e8b7958a5719a3733147086f8424Suprabh Shukla // uninstallation of the now-not-default one. 23502a06eff4269e8b7958a5719a3733147086f8424Suprabh Shukla if (enabled && mHomePackages.contains(mPackageInfo.packageName)) { 236568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate if (isBundled) { 237568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate enabled = false; 238568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate } else { 239568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate ArrayList<ResolveInfo> homeActivities = new ArrayList<ResolveInfo>(); 240568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate ComponentName currentDefaultHome = mPm.getHomeActivities(homeActivities); 241568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate if (currentDefaultHome == null) { 242c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate // No preferred default, so permit uninstall only when 243568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // there is more than one candidate 244568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate enabled = (mHomePackages.size() > 1); 245c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate } else { 246568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // There is an explicit default home app -- forbid uninstall of 247568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // that one, but permit it for installed-but-inactive ones. 248568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate enabled = !mPackageInfo.packageName.equals(currentDefaultHome.getPackageName()); 249568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate } 250568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate } 251568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate } 252568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate 253568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate mUninstallButton.setEnabled(enabled); 254568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate if (enabled) { 255568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate // Register listener 256568eeca569f97bfdd7cf6ae3b9cb5e7360eadc2cChristopher Tate mUninstallButton.setOnClickListener(this); 257c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate } 258c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate } 259c44d7c6be64be790878ddf1f21c0d9e91d238245Christopher Tate 2609e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka /** Returns if the supplied package is device owner or profile owner of at least one user */ 2619e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka private boolean isProfileOrDeviceOwner(String packageName) { 2629e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka List<UserInfo> userInfos = mUserManager.getUsers(); 2639e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka DevicePolicyManager dpm = (DevicePolicyManager) 264a4e32a24c4f70c6c54a459cbeaf70a6eac63f52cGustav Sennton getContext().getSystemService(Context.DEVICE_POLICY_SERVICE); 265a4e32a24c4f70c6c54a459cbeaf70a6eac63f52cGustav Sennton if (dpm.isDeviceOwnerAppOnAnyUser(packageName)) { 266a4e32a24c4f70c6c54a459cbeaf70a6eac63f52cGustav Sennton return true; 267a4e32a24c4f70c6c54a459cbeaf70a6eac63f52cGustav Sennton } 268a4e32a24c4f70c6c54a459cbeaf70a6eac63f52cGustav Sennton for (UserInfo userInfo : userInfos) { 269a4e32a24c4f70c6c54a459cbeaf70a6eac63f52cGustav Sennton ComponentName cn = dpm.getProfileOwnerAsUser(userInfo.id); 270a4e32a24c4f70c6c54a459cbeaf70a6eac63f52cGustav Sennton if (cn != null && cn.getPackageName().equals(packageName)) { 271a4e32a24c4f70c6c54a459cbeaf70a6eac63f52cGustav Sennton return true; 272a4e32a24c4f70c6c54a459cbeaf70a6eac63f52cGustav Sennton } 273a4e32a24c4f70c6c54a459cbeaf70a6eac63f52cGustav Sennton } 27442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu return false; 27542241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 27642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 27742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu /** Called when the activity is first created. */ 27842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu @Override 27942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu public void onCreate(Bundle icicle) { 28042241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu super.onCreate(icicle); 281d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot 282d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot setHasOptionsMenu(true); 283d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot addPreferencesFromResource(R.xml.installed_app_details); 284d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot 285d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot if (Utils.isBandwidthControlEnabled()) { 2864cfe39f5397d037d106abf07db31b0e01484bd92Makoto Onuki INetworkStatsService statsService = INetworkStatsService.Stub.asInterface( 287d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot ServiceManager.getService(Context.NETWORK_STATS_SERVICE)); 288d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot try { 289d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot mStatsSession = statsService.openSession(); 290d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot } catch (RemoteException e) { 291d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot throw new RuntimeException(e); 292d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot } 293d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot } else { 294d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot removePreference(KEY_DATA); 295d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot } 296d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot mBatteryHelper = new BatteryStatsHelper(getActivity(), true); 297d0dfdda2f6be820b9447f79c2505b5a87da4b5c5Nicolas Prevot } 298afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 299afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project @Override 300f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn protected int getMetricsCategory() { 301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return MetricsEvent.APPLICATIONS_INSTALLED_APP_DETAILS; 3023db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 3030fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn 304cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk @Override 3052108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk public void onResume() { 3064bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk super.onResume(); 307b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk if (mFinishing) { 308b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk return; 309b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk } 310b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk mState.requestSize(mPackageName, mUserId); 311b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk AppItem app = new AppItem(mAppEntry.info.uid); 312b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk app.addUid(mAppEntry.info.uid); 313b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk if (mStatsSession != null) { 314b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk getLoaderManager().restartLoader(LOADER_CHART_DATA, 315b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk ChartDataLoader.buildArgs(getTemplate(getContext()), app), 316b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk mDataCallbacks); 3174bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 3181eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk new BatteryUpdater().execute(); 3194bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk new MemoryUpdater().execute(); 3204bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 3214bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 3228a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren @Override 3239d1bfd1e8de6e46137a9571507c03526880d6a46Chris Wren public void onPause() { 3248a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren getLoaderManager().destroyLoader(LOADER_CHART_DATA); 3258a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren super.onPause(); 3268a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren } 3274bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 3284bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk @Override 32965ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk public void onDestroy() { 33065ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk TrafficStats.closeQuietly(mStatsSession); 33165ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk if (mPermissionReceiver != null) { 332646befdd16fee63fb399aec47950973b64add3baJason Monk getContext().unregisterReceiver(mPermissionReceiver); 3334bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mPermissionReceiver = null; 3344bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 335b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk 336b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk super.onDestroy(); 337b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk } 338b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk 339b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk public void onActivityCreated(Bundle savedInstanceState) { 34065ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk super.onActivityCreated(savedInstanceState); 341ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk if (mFinishing) { 3422108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk return; 3434bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk } 3444bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk handleHeader(); 3454bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk 3464bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mNotificationPreference = findPreference(KEY_NOTIFICATION); 3474bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mNotificationPreference.setOnPreferenceClickListener(this); 3484bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mStoragePreference = findPreference(KEY_STORAGE); 3494bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mStoragePreference.setOnPreferenceClickListener(this); 3504bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mPermissionsPreference = findPreference(KEY_PERMISSION); 3514bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mPermissionsPreference.setOnPreferenceClickListener(this); 3524bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mDataPreference = findPreference(KEY_DATA); 3534bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk if (mDataPreference != null) { 354d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk mDataPreference.setOnPreferenceClickListener(this); 355d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk } 356d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk mBatteryPreference = findPreference(KEY_BATTERY); 357d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk mBatteryPreference.setEnabled(false); 3584bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mBatteryPreference.setOnPreferenceClickListener(this); 3594bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk mMemoryPreference = findPreference(KEY_MEMORY); 360f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn mMemoryPreference.setOnPreferenceClickListener(this); 361f4eb85bc3c57ca70b577cea1524431fead4a4cccDianne Hackborn 362cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mLaunchPreference = findPreference(KEY_LAUNCH); 363cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk if (mAppEntry != null && mAppEntry.info != null) { 36465ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk if ((mAppEntry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0 || 36565ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk !mAppEntry.info.enabled) { 36665ecadc62550b10eb634c14dd671f47b66ea8dbfJason Monk mLaunchPreference.setEnabled(false); 367cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } else { 36838ba9a2d4350fc7d063ec21c994183258bf7a443Fabrice Di Meglio mLaunchPreference.setOnPreferenceClickListener(this); 369cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 370cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } else { 371cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mLaunchPreference.setEnabled(false); 372cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 373cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 374cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 375cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private void handleHeader() { 376b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk mHeader = (LayoutPreference) findPreference(KEY_HEADER); 377b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk 378b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk // Get Control button panel 3791eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk View btnPanel = mHeader.findViewById(R.id.control_buttons_panel); 3801eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mForceStopButton = (Button) btnPanel.findViewById(R.id.right_button); 3811eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mForceStopButton.setText(R.string.force_stop); 382ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mUninstallButton = (Button) btnPanel.findViewById(R.id.left_button); 383ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk mForceStopButton.setEnabled(false); 3848b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio } 3858b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio 386f7806581e582e5921d0eb4caa9751d1aa429bc47Jason Monk @Override 387ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 388ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio menu.add(0, UNINSTALL_UPDATES, 0, R.string.app_factory_reset) 389ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 390ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio menu.add(0, UNINSTALL_ALL_USERS_MENU, 1, R.string.uninstall_all_users_text) 391ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); 392ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio } 3938b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio 394ae35e0c013980439a20bf1c93a6aa88e8c9daaf9Fabrice Di Meglio @Override 3958b2ea39cbc5b0923646b5ad4d5f66ff3c66a9f7fFabrice Di Meglio public void onPrepareOptionsMenu(Menu menu) { 396cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk if (mFinishing) { 3971f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn return; 398cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 39960a09ea2388db01a661beeb9995a7ecf770a4200Jason Monk boolean showIt = true; 4001f6ddac9f41f341073e7cedd8f777a43b7d11679Dianne Hackborn if (mUpdatedSysApp) { 40142241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu showIt = false; 402cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } else if (mAppEntry == null) { 403cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk showIt = false; 40442241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 405cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk showIt = false; 406cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn } else if (mPackageInfo == null || mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 4070c55bb103cb63df5b1e8665369f28251551d0524Jason Monk showIt = false; 4080c55bb103cb63df5b1e8665369f28251551d0524Jason Monk } else if (UserHandle.myUserId() != 0) { 4090c55bb103cb63df5b1e8665369f28251551d0524Jason Monk showIt = false; 4100c55bb103cb63df5b1e8665369f28251551d0524Jason Monk } else if (mUserManager.getUsers().size() < 2) { 4110c55bb103cb63df5b1e8665369f28251551d0524Jason Monk showIt = false; 4120c55bb103cb63df5b1e8665369f28251551d0524Jason Monk } 4130c55bb103cb63df5b1e8665369f28251551d0524Jason Monk menu.findItem(UNINSTALL_ALL_USERS_MENU).setVisible(showIt); 4140c55bb103cb63df5b1e8665369f28251551d0524Jason Monk mUpdatedSysApp = (mAppEntry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0; 4150c55bb103cb63df5b1e8665369f28251551d0524Jason Monk MenuItem uninstallUpdatesItem = menu.findItem(UNINSTALL_UPDATES); 4160c55bb103cb63df5b1e8665369f28251551d0524Jason Monk uninstallUpdatesItem.setVisible(mUpdatedSysApp); 4170c55bb103cb63df5b1e8665369f28251551d0524Jason Monk if (uninstallUpdatesItem.isVisible()) { 4180c55bb103cb63df5b1e8665369f28251551d0524Jason Monk RestrictedLockUtils.setMenuItemAsDisabledByAdmin(getActivity(), 4190c55bb103cb63df5b1e8665369f28251551d0524Jason Monk uninstallUpdatesItem, mAppsControlDisallowedAdmin); 4200c55bb103cb63df5b1e8665369f28251551d0524Jason Monk } 4210c55bb103cb63df5b1e8665369f28251551d0524Jason Monk } 4220c55bb103cb63df5b1e8665369f28251551d0524Jason Monk 4230c55bb103cb63df5b1e8665369f28251551d0524Jason Monk @Override 4240c55bb103cb63df5b1e8665369f28251551d0524Jason Monk public boolean onOptionsItemSelected(MenuItem item) { 4250c55bb103cb63df5b1e8665369f28251551d0524Jason Monk switch (item.getItemId()) { 4260c55bb103cb63df5b1e8665369f28251551d0524Jason Monk case UNINSTALL_ALL_USERS_MENU: 427d6807c37dc7d3bdde58e173cf348d9383dd4b3a5Sudheer Shanka uninstallPkg(mAppEntry.info.packageName, true, false); 4280c55bb103cb63df5b1e8665369f28251551d0524Jason Monk return true; 429afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project case UNINSTALL_UPDATES: 430f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu showDialogInner(DLG_FACTORY_RESET, 0); 4313db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn return true; 4323db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 433dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk return false; 434dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk } 4353db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 4363db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn @Override 4373db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn public void onActivityResult(int requestCode, int resultCode, Intent data) { 4383db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn super.onActivityResult(requestCode, resultCode, data); 4393db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (requestCode == REQUEST_UNINSTALL) { 4403db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (mDisableAfterUninstall) { 44138f1889fea1a8ef7f4160044f4fd7e57a9bccd23Jason Monk mDisableAfterUninstall = false; 44238f1889fea1a8ef7f4160044f4fd7e57a9bccd23Jason Monk try { 44338f1889fea1a8ef7f4160044f4fd7e57a9bccd23Jason Monk ApplicationInfo ainfo = getActivity().getPackageManager().getApplicationInfo( 4443db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn mAppEntry.info.packageName, PackageManager.GET_UNINSTALLED_PACKAGES 4453db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn | PackageManager.GET_DISABLED_COMPONENTS); 4463db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if ((ainfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0) { 4470fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn new DisableChanger(this, mAppEntry.info, 4480fca4296ac08fcf42b58fac3a016ea068fcf6257Dianne Hackborn PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) 4493db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn .execute((Object)null); 4503db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 45154b3f501ca4a7ff88ead39247d2277d2efc82bb6Jeff Sharkey } catch (NameNotFoundException e) { 4523db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4533db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4543db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (!refreshUi()) { 4557a1c4cdfae66e8b110de3988e65586871a969c04Amith Yamasani setIntentAndFinish(true, true); 4563db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4573db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4583db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (requestCode == REQUEST_REMOVE_DEVICE_ADMIN) { 459dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk if (!refreshUi()) { 460ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka setIntentAndFinish(true, true); 4619e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka } 462ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka } 463ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka } 464ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka 465ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka // Utility method to set application label and icon. 4663db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn private void setAppLabelAndIcon(PackageInfo pkgInfo) { 4673db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn final View appSnippet = mHeader.findViewById(R.id.app_snippet); 4683db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn mState.ensureIcon(mAppEntry); 4693db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn setupAppSnippet(appSnippet, mAppEntry.label, mAppEntry.icon, 470dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk pkgInfo != null ? pkgInfo.versionName : null); 471dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk } 472dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk 473dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk private boolean signaturesMatch(String pkg1, String pkg2) { 474dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk if (pkg1 != null && pkg2 != null) { 475bacc708f96f8ff375261cbb3541b6b949b79e91aAmith Yamasani try { 476dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk final int match = mPm.checkSignatures(pkg1, pkg2); 4773db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (match >= PackageManager.SIGNATURE_MATCH) { 4783db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn return true; 4793db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4803db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } catch (Exception e) { 4813db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn // e.g. named alternate package not found during lookup; 4823db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn // this is an expected case sometimes 4833db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4843db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4859072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn return false; 4869072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 487b5545c8395e5d67dc99bdeb53f5e7877c8bdb2d5Amith Yamasani 488b5545c8395e5d67dc99bdeb53f5e7877c8bdb2d5Amith Yamasani @Override 489b5545c8395e5d67dc99bdeb53f5e7877c8bdb2d5Amith Yamasani protected boolean refreshUi() { 4909072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn retrieveAppEntry(); 4913db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (mAppEntry == null) { 4923db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn return false; // onCreate must have failed, make sure to exit 4933db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn } 4943db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn 49502a06eff4269e8b7958a5719a3733147086f8424Suprabh Shukla if (mPackageInfo == null) { 49602a06eff4269e8b7958a5719a3733147086f8424Suprabh Shukla return false; // onCreate must have failed, make sure to exit 49702a06eff4269e8b7958a5719a3733147086f8424Suprabh Shukla } 49802a06eff4269e8b7958a5719a3733147086f8424Suprabh Shukla 49902a06eff4269e8b7958a5719a3733147086f8424Suprabh Shukla // Get list of "home" apps and trace through any meta-data references 5003db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn List<ResolveInfo> homeActivities = new ArrayList<ResolveInfo>(); 5013db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn mPm.getHomeActivities(homeActivities); 5020dd9902c89e7b705fd73158aadf1bf27843ad201Dianne Hackborn mHomePackages.clear(); 503f4c4b59f13a0cadd55832004e56ff7b6d827f7f0Suchi Amalapurapu for (int i = 0; i< homeActivities.size(); i++) { 504cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk ResolveInfo ri = homeActivities.get(i); 5050f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn final String activityPkg = ri.activityInfo.packageName; 5062cdafc6be386bb767404e42fc728a1a810aa896aJason Monk mHomePackages.add(activityPkg); 5072cdafc6be386bb767404e42fc728a1a810aa896aJason Monk 50850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // Also make sure to include anything proxying for the home app 50950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu final Bundle metadata = ri.activityInfo.metaData; 5108243c9a722e815bdcb069163de48877478c28dfdChristopher Tate if (metadata != null) { 5118243c9a722e815bdcb069163de48877478c28dfdChristopher Tate final String metaPkg = metadata.getString(ActivityManager.META_HOME_ALTERNATE); 5128243c9a722e815bdcb069163de48877478c28dfdChristopher Tate if (signaturesMatch(metaPkg, activityPkg)) { 5138243c9a722e815bdcb069163de48877478c28dfdChristopher Tate mHomePackages.add(metaPkg); 5148243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 5158243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 5168243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 5178243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 5188243c9a722e815bdcb069163de48877478c28dfdChristopher Tate checkForceStop(); 5198243c9a722e815bdcb069163de48877478c28dfdChristopher Tate setAppLabelAndIcon(mPackageInfo); 5208243c9a722e815bdcb069163de48877478c28dfdChristopher Tate initUninstallButtons(); 5218243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 5228243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // Update the preference summaries. 5238243c9a722e815bdcb069163de48877478c28dfdChristopher Tate Activity context = getActivity(); 5248243c9a722e815bdcb069163de48877478c28dfdChristopher Tate mStoragePreference.setSummary(AppStorageSettings.getSummary(mAppEntry, context)); 525cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk if (mPermissionReceiver != null) { 526cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk getContext().unregisterReceiver(mPermissionReceiver); 527cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 5280f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mPermissionReceiver = PermissionsSummaryHelper.getPermissionSummary(getContext(), 5290f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mPackageName, mPermissionCallback); 530b0bcf9f7f50b56cb15a72be39fe11fe1351992c1Jeff Brown mLaunchPreference.setSummary(AppUtils.getLaunchByDefaultSummary(mAppEntry, mUsbManager, 531b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani mPm, context)); 532b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani mNotificationPreference.setSummary(getNotificationSummary(mAppEntry, context, 5330f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn mBackend)); 53450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu if (mDataPreference != null) { 535b1bf9cf3835ce41f3864f1056554f0180624e2c7Amith Yamasani mDataPreference.setSummary(getDataSummary()); 5368243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } 5378243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 5388243c9a722e815bdcb069163de48877478c28dfdChristopher Tate updateBattery(); 5398243c9a722e815bdcb069163de48877478c28dfdChristopher Tate 5408243c9a722e815bdcb069163de48877478c28dfdChristopher Tate if (!mInitialized) { 5418243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // First time init: are we displaying an uninstalled app? 5428243c9a722e815bdcb069163de48877478c28dfdChristopher Tate mInitialized = true; 5438243c9a722e815bdcb069163de48877478c28dfdChristopher Tate mShowUninstalled = (mAppEntry.info.flags&ApplicationInfo.FLAG_INSTALLED) == 0; 5448243c9a722e815bdcb069163de48877478c28dfdChristopher Tate } else { 5458243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // All other times: if the app no longer exists then we want 5468243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // to go away. 5478243c9a722e815bdcb069163de48877478c28dfdChristopher Tate try { 5488243c9a722e815bdcb069163de48877478c28dfdChristopher Tate ApplicationInfo ainfo = context.getPackageManager().getApplicationInfo( 5498243c9a722e815bdcb069163de48877478c28dfdChristopher Tate mAppEntry.info.packageName, PackageManager.GET_UNINSTALLED_PACKAGES 5508243c9a722e815bdcb069163de48877478c28dfdChristopher Tate | PackageManager.GET_DISABLED_COMPONENTS); 5518243c9a722e815bdcb069163de48877478c28dfdChristopher Tate if (!mShowUninstalled) { 5528243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // If we did not start out with the app uninstalled, then 5538243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // it transitioning to the uninstalled state for the current 5548243c9a722e815bdcb069163de48877478c28dfdChristopher Tate // user means we should go away as well. 5550f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn return (ainfo.flags&ApplicationInfo.FLAG_INSTALLED) != 0; 5560f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } 557cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } catch (NameNotFoundException e) { 558cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return false; 559cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 560cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 561cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 562d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk return true; 563d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk } 564d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk 565d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk private void updateBattery() { 566d0d7b924cbecf05809d349d01fcefc5abfb3d3eaJason Monk if (mSipper != null) { 5674f4424a820688638930f871ad421e05588549ae5Tony Mantler mBatteryPreference.setEnabled(true); 568cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk int dischargeAmount = mBatteryHelper.getStats().getDischargeAmount( 569cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk BatteryStats.STATS_SINCE_CHARGED); 570cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk final int percentOfMax = (int) ((mSipper.totalPowerMah) 571b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk / mBatteryHelper.getTotalPower() * dischargeAmount + .5f); 572b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk mBatteryPreference.setSummary(getString(R.string.battery_summary, percentOfMax)); 573b45e27bc0f52d64a71aecba661770b30f6299301Jason Monk } else { 574ab616d477be693fc455329953711264af0ed7814Dianne Hackborn mBatteryPreference.setEnabled(false); 5751eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk mBatteryPreference.setSummary(getString(R.string.no_battery_summary)); 5761eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 577ab616d477be693fc455329953711264af0ed7814Dianne Hackborn } 578ab616d477be693fc455329953711264af0ed7814Dianne Hackborn 579ab616d477be693fc455329953711264af0ed7814Dianne Hackborn private CharSequence getDataSummary() { 580ab616d477be693fc455329953711264af0ed7814Dianne Hackborn if (mChartData != null) { 5814de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn long totalBytes = mChartData.detail.getTotalBytes(); 5824de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn if (totalBytes == 0) { 5834de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn return getString(R.string.no_data_usage); 5849072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn } 585cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk Context context = getActivity(); 5869072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn return getString(R.string.data_summary_format, 5879072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn Formatter.formatFileSize(context, totalBytes), 5884de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn DateUtils.formatDateTime(context, mChartData.detail.getStart(), 5894de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_MONTH)); 5904de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn } 5914de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn return getString(R.string.computing_size); 5924de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn } 5934de4061c8bb9475cbc5d98f83bf3b2c8ec222407Dianne Hackborn 5949072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn @Override 5959072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn protected AlertDialog createDialog(int id, int errorCode) { 5969072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn switch (id) { 597ab616d477be693fc455329953711264af0ed7814Dianne Hackborn case DLG_DISABLE: 598ab616d477be693fc455329953711264af0ed7814Dianne Hackborn return new AlertDialog.Builder(getActivity()) 5990f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn .setMessage(getActivity().getText(R.string.app_disable_dlg_text)) 600afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project .setPositiveButton(R.string.app_disable_dlg_positive, 6013465b67740e17711af2b36b09e2250a02275d860Jake Hamby new DialogInterface.OnClickListener() { 6021eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk public void onClick(DialogInterface dialog, int which) { 6031eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk // Disable the app 6041eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk new DisableChanger(InstalledAppDetails.this, mAppEntry.info, 6051eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) 6061eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk .execute((Object)null); 6071eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 6081eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk }) 6091eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk .setNegativeButton(R.string.dlg_cancel, null) 6101eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk .create(); 6111eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk case DLG_SPECIAL_DISABLE: 6121eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk return new AlertDialog.Builder(getActivity()) 6131eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk .setMessage(getActivity().getText(R.string.app_special_disable_dlg_text)) 6141eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk .setPositiveButton(R.string.app_disable_dlg_positive, 6151eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk new DialogInterface.OnClickListener() { 6164bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public void onClick(DialogInterface dialog, int which) { 6174bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk // Clear user data here 6184bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk uninstallPkg(mAppEntry.info.packageName, 61951334310a26a29d3ac3ad4e7299110b6de0ae75cJason Monk false, true); 62051334310a26a29d3ac3ad4e7299110b6de0ae75cJason Monk } 62151334310a26a29d3ac3ad4e7299110b6de0ae75cJason Monk }) 6224bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk .setNegativeButton(R.string.dlg_cancel, null) 6234bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk .create(); 6244bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk case DLG_FORCE_STOP: 6254bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk return new AlertDialog.Builder(getActivity()) 6264bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk .setTitle(getActivity().getText(R.string.force_stop_dlg_title)) 6274bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk .setMessage(getActivity().getText(R.string.force_stop_dlg_text)) 6284bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() { 6294bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk public void onClick(DialogInterface dialog, int which) { 6304bb075bc4fb415eacb0fe2d7e74f16de2d9c718aJason Monk // Force stop 631cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk forceStopPackage(mAppEntry.info.packageName); 632cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 633cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk }) 634cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setNegativeButton(R.string.dlg_cancel, null) 635cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .create(); 636cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk case DLG_FACTORY_RESET: 63753a5d7ff2ce3ab446f4ad046e6703ed2caa18fa4Jason Monk return new AlertDialog.Builder(getActivity()) 63853a5d7ff2ce3ab446f4ad046e6703ed2caa18fa4Jason Monk .setTitle(getActivity().getText(R.string.app_factory_reset_dlg_title)) 639cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setMessage(getActivity().getText(R.string.app_factory_reset_dlg_text)) 640cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() { 641cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public void onClick(DialogInterface dialog, int which) { 642cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk // Clear user data here 643cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk uninstallPkg(mAppEntry.info.packageName, 644cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk false, false); 645cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 646cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk }) 647cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .setNegativeButton(R.string.dlg_cancel, null) 648cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk .create(); 649cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 650b5545c8395e5d67dc99bdeb53f5e7877c8bdb2d5Amith Yamasani return null; 65153a5d7ff2ce3ab446f4ad046e6703ed2caa18fa4Jason Monk } 65253a5d7ff2ce3ab446f4ad046e6703ed2caa18fa4Jason Monk 653cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private void uninstallPkg(String packageName, boolean allUsers, boolean andDisable) { 654b5545c8395e5d67dc99bdeb53f5e7877c8bdb2d5Amith Yamasani // Create new intent to launch Uninstaller activity 655cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk Uri packageURI = Uri.parse("package:"+packageName); 656cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageURI); 657cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, allUsers); 658cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk startActivityForResult(uninstallIntent, REQUEST_UNINSTALL); 659cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mDisableAfterUninstall = andDisable; 660cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 661cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 662cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk private void forceStopPackage(String pkgName) { 663cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk ActivityManager am = (ActivityManager)getActivity().getSystemService( 664cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk Context.ACTIVITY_SERVICE); 665cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk am.forceStopPackage(pkgName); 666cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk int userId = UserHandle.getUserId(mAppEntry.info.uid); 667cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mState.invalidatePackage(pkgName, userId); 668cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk ApplicationsState.AppEntry newEnt = mState.getEntry(pkgName, userId); 669cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk if (newEnt != null) { 670cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk mAppEntry = newEnt; 671cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 672cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk checkForceStop(); 673cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 674cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 67550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu private void updateForceStopButton(boolean enabled) { 67650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu mForceStopButton.setEnabled(enabled); 6779072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn mForceStopButton.setOnClickListener(InstalledAppDetails.this); 67850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } 67950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu 6803db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn private void checkForceStop() { 6813db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 6823db54cb97630fe83342c2ca189d13ff5a1a598d3Dianne Hackborn // User can't force stop device admin. 6839072d9efc6f9c4ef260736c345e81390ac988d7aDianne Hackborn updateForceStopButton(false); 68450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu } else if ((mAppEntry.info.flags&ApplicationInfo.FLAG_STOPPED) == 0) { 68550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu // If the app isn't explicitly stopped, then always show the 68642241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu // force stop button. 687b5545c8395e5d67dc99bdeb53f5e7877c8bdb2d5Amith Yamasani updateForceStopButton(true); 68842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } else { 68942241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART, 69007025891683aef83d850b0a91b37aa75b11ce33cJason Monk Uri.fromParts("package", mAppEntry.info.packageName, null)); 69107025891683aef83d850b0a91b37aa75b11ce33cJason Monk intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName }); 69207025891683aef83d850b0a91b37aa75b11ce33cJason Monk intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid); 693c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn intent.putExtra(Intent.EXTRA_USER_HANDLE, UserHandle.getUserId(mAppEntry.info.uid)); 694c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn getActivity().sendOrderedBroadcastAsUser(intent, UserHandle.CURRENT, null, 695c442e52dca4d32e2ea391e361c847ce834bf0dfdDianne Hackborn mCheckKillProcessesReceiver, null, Activity.RESULT_CANCELED, null, null); 696cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn } 69742241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu } 69842241e75d2775b6b44b82b939e66fbb50d4b189bSuchi Amalapurapu 699861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn private void startManagePermissionsActivity() { 7009e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka // start new activity to manage app permissions 7019e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka Intent intent = new Intent(Intent.ACTION_MANAGE_APP_PERMISSIONS); 7029e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka intent.putExtra(Intent.EXTRA_PACKAGE_NAME, mAppEntry.info.packageName); 7039e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka intent.putExtra(AppHeader.EXTRA_HIDE_INFO_BUTTON, true); 7049e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka try { 7059e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka startActivity(intent); 706861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn } catch (ActivityNotFoundException e) { 707cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk Log.w(LOG_TAG, "No app can handle android.intent.action.MANAGE_APP_PERMISSIONS"); 708cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn } 7095c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn } 7105c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn 7115c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn private void startAppInfoFragment(Class<?> fragment, CharSequence title) { 7125c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn // start new fragment to display extended information 713861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn Bundle args = new Bundle(); 714861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn args.putString(ARG_PACKAGE_NAME, mAppEntry.info.packageName); 715861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn args.putInt(ARG_PACKAGE_UID, mAppEntry.info.uid); 716861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn args.putBoolean(AppHeader.EXTRA_HIDE_INFO_BUTTON, true); 7175c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn 7185c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn SettingsActivity sa = (SettingsActivity) getActivity(); 7195c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn sa.startPreferencePanel(fragment.getName(), args, -1, title, this, SUB_INFO_FRAGMENT); 7205c2b48d4d52a2b6b3ae3c745e7016da390a4e1d7Dianne Hackborn } 721c715fb1207361bb2a793752eefb02f1956075739Dianne Hackborn 7228243c9a722e815bdcb069163de48877478c28dfdChristopher Tate /* 7238243c9a722e815bdcb069163de48877478c28dfdChristopher Tate * Method implementing functionality of buttons clicked 724861c04fbd4841253a02299b7498a8cf609e8874dDianne Hackborn * @see android.view.View.OnClickListener#onClick(android.view.View) 725cb497546ba55ef98fb561dd9a07c7a485a918f4bDianne Hackborn */ 72670b599983967b68894a9c41df2279424f6ab3fefDaniel Sandler public void onClick(View v) { 72779021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov if (mAppEntry == null) { 72879021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov setIntentAndFinish(true, true); 72979021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov return; 73079021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov } 731e492ee06adbf4661d8b8b53f41f236c9173c5ca4Julia Reynolds String packageName = mAppEntry.info.packageName; 73279021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov if(v == mUninstallButton) { 73379021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 73479021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov Activity activity = getActivity(); 73579021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov Intent uninstallDAIntent = new Intent(activity, DeviceAdminAdd.class); 73679021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov uninstallDAIntent.putExtra(DeviceAdminAdd.EXTRA_DEVICE_ADMIN_PACKAGE_NAME, 73779021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov mPackageName); 73879021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov activity.startActivityForResult(uninstallDAIntent, REQUEST_REMOVE_DEVICE_ADMIN); 739255452fdf4b368f150477e818b326a60210f22c1Jason Monk return; 740cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 741cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk EnforcedAdmin admin = RestrictedLockUtils.checkIfUninstallBlocked(getActivity(), 742255452fdf4b368f150477e818b326a60210f22c1Jason Monk packageName, mUserId); 743255452fdf4b368f150477e818b326a60210f22c1Jason Monk if (admin != null) { 744e492ee06adbf4661d8b8b53f41f236c9173c5ca4Julia Reynolds RestrictedLockUtils.sendShowAdminSupportDetailsIntent(getActivity(), admin); 7459db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 746cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk if (mAppEntry.info.enabled && !isDisabledUntilUsed()) { 747cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk if (mUpdatedSysApp) { 7489db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn showDialogInner(DLG_SPECIAL_DISABLE, 0); 7499db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } else { 750afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project showDialogInner(DLG_DISABLE, 0); 751afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 752afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } else { 753afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project new DisableChanger(this, mAppEntry.info, 754afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) 7556e2e8e17cfea09548067baa8b361dbc31dce385cJason Monk .execute((Object) null); 7566e2e8e17cfea09548067baa8b361dbc31dce385cJason Monk } 7576e2e8e17cfea09548067baa8b361dbc31dce385cJason Monk } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_INSTALLED) == 0) { 7586e2e8e17cfea09548067baa8b361dbc31dce385cJason Monk uninstallPkg(packageName, true, false); 7590f9daab75f1557722b6e687a68eebfd5d28cbc51Dianne Hackborn } else { 760b5545c8395e5d67dc99bdeb53f5e7877c8bdb2d5Amith Yamasani uninstallPkg(packageName, false, false); 76102a06eff4269e8b7958a5719a3733147086f8424Suprabh Shukla } 76202a06eff4269e8b7958a5719a3733147086f8424Suprabh Shukla } else if (v == mForceStopButton) { 76302a06eff4269e8b7958a5719a3733147086f8424Suprabh Shukla if (mAppsControlDisallowedAdmin != null) { 76402a06eff4269e8b7958a5719a3733147086f8424Suprabh Shukla RestrictedLockUtils.sendShowAdminSupportDetailsIntent( 76502a06eff4269e8b7958a5719a3733147086f8424Suprabh Shukla getActivity(), mAppsControlDisallowedAdmin); 76602a06eff4269e8b7958a5719a3733147086f8424Suprabh Shukla } else { 76702a06eff4269e8b7958a5719a3733147086f8424Suprabh Shukla showDialogInner(DLG_FORCE_STOP, 0); 76802a06eff4269e8b7958a5719a3733147086f8424Suprabh Shukla //forceStopPackage(mAppInfo.packageName); 769ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka } 770ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka } 7719e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka } 7729e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka 7739e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka @Override 774ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka public boolean onPreferenceClick(Preference preference) { 775ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka if (preference == mStoragePreference) { 77677537b697b411df54dedd65b1e5ca4eb5dd00846Jason Monk startAppInfoFragment(AppStorageSettings.class, mStoragePreference.getTitle()); 777b5545c8395e5d67dc99bdeb53f5e7877c8bdb2d5Amith Yamasani } else if (preference == mNotificationPreference) { 778b5545c8395e5d67dc99bdeb53f5e7877c8bdb2d5Amith Yamasani startAppInfoFragment(AppNotificationSettings.class, 779b5545c8395e5d67dc99bdeb53f5e7877c8bdb2d5Amith Yamasani getString(R.string.app_notifications_title)); 780b5545c8395e5d67dc99bdeb53f5e7877c8bdb2d5Amith Yamasani } else if (preference == mPermissionsPreference) { 781dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk startManagePermissionsActivity(); 782f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn } else if (preference == mLaunchPreference) { 783dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk startAppInfoFragment(AppLaunchSettings.class, mLaunchPreference.getTitle()); 784f0b63c2c3ec65e8864d5b76a993e87f592170a3dDianne Hackborn } else if (preference == mMemoryPreference) { 7859db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn ProcessStatsBase.launchMemoryDetail((SettingsActivity) getActivity(), 786dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk mStatsManager.getMemInfo(), mStats, false); 787dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk } else if (preference == mDataPreference) { 788dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk startAppInfoFragment(AppDataUsage.class, getString(R.string.app_data_usage)); 7899db5ee35d5345e13e6e6b857dbad5a83e9f037d1Dianne Hackborn } else if (preference == mBatteryPreference) { 790dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk BatteryEntry entry = new BatteryEntry(getActivity(), null, mUserManager, mSipper); 791dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk PowerUsageDetail.startBatteryDetailPage((SettingsActivity) getActivity(), 792dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk mBatteryHelper, BatteryStats.STATS_SINCE_CHARGED, entry, true, false); 793dff06ccbf30b76bf12396a3afda9f9531cdca7a5Jason Monk } else { 794afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project return false; 795afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project } 7969e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka return true; 797ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka } 798ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka 799ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka public static void setupAppSnippet(View appSnippet, CharSequence label, Drawable icon, 800ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka CharSequence versionName) { 801ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka LayoutInflater.from(appSnippet.getContext()).inflate(R.layout.widget_text_views, 802ef550767b0b469534a94c293ea517a19778b58b0Sudheer Shanka (ViewGroup) appSnippet.findViewById(android.R.id.widget_frame)); 803afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project 804afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project ImageView iconView = (ImageView) appSnippet.findViewById(android.R.id.icon); 805aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn iconView.setImageDrawable(icon); 806b5545c8395e5d67dc99bdeb53f5e7877c8bdb2d5Amith Yamasani // Set application name. 807b5545c8395e5d67dc99bdeb53f5e7877c8bdb2d5Amith Yamasani TextView labelView = (TextView) appSnippet.findViewById(android.R.id.title); 808b5545c8395e5d67dc99bdeb53f5e7877c8bdb2d5Amith Yamasani labelView.setText(label); 809b5545c8395e5d67dc99bdeb53f5e7877c8bdb2d5Amith Yamasani // Version number of application 810b5545c8395e5d67dc99bdeb53f5e7877c8bdb2d5Amith Yamasani TextView appVersion = (TextView) appSnippet.findViewById(R.id.widget_text1); 811b5545c8395e5d67dc99bdeb53f5e7877c8bdb2d5Amith Yamasani 812b5545c8395e5d67dc99bdeb53f5e7877c8bdb2d5Amith Yamasani if (!TextUtils.isEmpty(versionName)) { 813aef746c45f14c8a170dba48c4b55f93cae0e24e4Dianne Hackborn appVersion.setSelected(true); 814cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk appVersion.setVisibility(View.VISIBLE); 815cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk appVersion.setText(appSnippet.getContext().getString(R.string.version_text, 816cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk String.valueOf(versionName))); 817cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } else { 818255452fdf4b368f150477e818b326a60210f22c1Jason Monk appVersion.setVisibility(View.INVISIBLE); 819255452fdf4b368f150477e818b326a60210f22c1Jason Monk } 820cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 82179021c27c9087abf83fc602a6c2bb161be1b7b7aSvet Ganov 822cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public static NetworkTemplate getTemplate(Context context) { 823cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk if (DataUsageList.hasReadyMobileRadio(context)) { 824ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk return NetworkTemplate.buildTemplateMobileWildcard(); 825ab2046aa76bb00b9a49c62c314e4d40415eebecfJason Monk } 826e492ee06adbf4661d8b8b53f41f236c9173c5ca4Julia Reynolds if (DataUsageSummary.hasWifiRadio(context)) { 827cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return NetworkTemplate.buildTemplateWifiWildcard(); 828b37e2887d3112082589997f1bbd802ec282cca6dJason Monk } 8291eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk return NetworkTemplate.buildTemplateEthernet(); 8301eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk } 8311eb54eb2ff250eccdd700601011bd6457ddcbec1Jason Monk 832e492ee06adbf4661d8b8b53f41f236c9173c5ca4Julia Reynolds public static CharSequence getNotificationSummary(AppEntry appEntry, Context context) { 833cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk return getNotificationSummary(appEntry, context, new NotificationBackend()); 834cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk } 835cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk 836cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk public static CharSequence getNotificationSummary(AppEntry appEntry, Context context, 837cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk NotificationBackend backend) { 838cd91128a2de5d111c59fe442c72b764d9a9acb3aJason Monk AppRow appRow = backend.loadAppRow(context.getPackageManager(), appEntry.info); 8392108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk return getNotificationSummary(appRow, context); 8402108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 8412108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk 8422108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk public static CharSequence getNotificationSummary(AppRow appRow, Context context) { 8432108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk if (appRow.banned) { 8442108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk return context.getString(R.string.notifications_disabled); 8452108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 8462108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk return context.getString(R.string.notifications_enabled); 8472108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 8482108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk 8492108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk private class MemoryUpdater extends AsyncTask<Void, Void, ProcStatsPackageEntry> { 8502108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk 8512108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk @Override 8522108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk protected ProcStatsPackageEntry doInBackground(Void... params) { 8532108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk if (getActivity() == null) { 8542108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk return null; 8552108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 8562108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk if (mPackageInfo == null) { 8572108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk return null; 8582108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 8592108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk if (mStatsManager == null) { 8602108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk mStatsManager = new ProcStatsData(getActivity(), false); 8612108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk mStatsManager.setDuration(ProcessStatsBase.sDurations[0]); 8622108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 8632108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk mStatsManager.refreshStats(true); 8642108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk for (ProcStatsPackageEntry pkgEntry : mStatsManager.getEntries()) { 8652108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk for (ProcStatsEntry entry : pkgEntry.mEntries) { 8662108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk if (entry.mUid == mPackageInfo.applicationInfo.uid) { 8672108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk pkgEntry.updateMetrics(); 8682108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk return pkgEntry; 8692108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 8702108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 8712108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 8722108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk return null; 8732108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 8742108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk 8752108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk @Override 8762108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk protected void onPostExecute(ProcStatsPackageEntry entry) { 8772108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk if (getActivity() == null) { 8782108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk return; 8792108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 8802108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk if (entry != null) { 8812108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk mStats = entry; 8822108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk mMemoryPreference.setEnabled(true); 8832108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk double amount = Math.max(entry.mRunWeight, entry.mBgWeight) 8842108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk * mStatsManager.getMemInfo().weightToRam; 8852108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk mMemoryPreference.setSummary(getString(R.string.memory_use_summary, 8862108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk Formatter.formatShortFileSize(getContext(), (long) amount))); 8872108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } else { 8882108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk mMemoryPreference.setEnabled(false); 8892108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk mMemoryPreference.setSummary(getString(R.string.no_memory_use_summary)); 8902108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 8912108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 8922108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk 8932108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 8942108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk 8952108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk private class BatteryUpdater extends AsyncTask<Void, Void, Void> { 8962108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk @Override 8972108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk protected Void doInBackground(Void... params) { 8982108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk mBatteryHelper.create((Bundle) null); 8992108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk mBatteryHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, 9002108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk mUserManager.getUserProfiles()); 9012108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk List<BatterySipper> usageList = mBatteryHelper.getUsageList(); 9022108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk final int N = usageList.size(); 9032108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk for (int i = 0; i < N; i++) { 9042108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk BatterySipper sipper = usageList.get(i); 905d6807c37dc7d3bdde58e173cf348d9383dd4b3a5Sudheer Shanka if (sipper.getUid() == mPackageInfo.applicationInfo.uid) { 906d6807c37dc7d3bdde58e173cf348d9383dd4b3a5Sudheer Shanka mSipper = sipper; 907d6807c37dc7d3bdde58e173cf348d9383dd4b3a5Sudheer Shanka break; 908d6807c37dc7d3bdde58e173cf348d9383dd4b3a5Sudheer Shanka } 909d6807c37dc7d3bdde58e173cf348d9383dd4b3a5Sudheer Shanka } 910d6807c37dc7d3bdde58e173cf348d9383dd4b3a5Sudheer Shanka return null; 911d6807c37dc7d3bdde58e173cf348d9383dd4b3a5Sudheer Shanka } 912d6807c37dc7d3bdde58e173cf348d9383dd4b3a5Sudheer Shanka 913d6807c37dc7d3bdde58e173cf348d9383dd4b3a5Sudheer Shanka @Override 914d6807c37dc7d3bdde58e173cf348d9383dd4b3a5Sudheer Shanka protected void onPostExecute(Void result) { 915d6807c37dc7d3bdde58e173cf348d9383dd4b3a5Sudheer Shanka if (getActivity() == null) { 916d6807c37dc7d3bdde58e173cf348d9383dd4b3a5Sudheer Shanka return; 917d6807c37dc7d3bdde58e173cf348d9383dd4b3a5Sudheer Shanka } 918d6807c37dc7d3bdde58e173cf348d9383dd4b3a5Sudheer Shanka refreshUi(); 919d6807c37dc7d3bdde58e173cf348d9383dd4b3a5Sudheer Shanka } 920d6807c37dc7d3bdde58e173cf348d9383dd4b3a5Sudheer Shanka } 921d6807c37dc7d3bdde58e173cf348d9383dd4b3a5Sudheer Shanka 922d6807c37dc7d3bdde58e173cf348d9383dd4b3a5Sudheer Shanka private static class DisableChanger extends AsyncTask<Object, Object, Object> { 923d6807c37dc7d3bdde58e173cf348d9383dd4b3a5Sudheer Shanka final PackageManager mPm; 924d6807c37dc7d3bdde58e173cf348d9383dd4b3a5Sudheer Shanka final WeakReference<InstalledAppDetails> mActivity; 9252108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk final ApplicationInfo mInfo; 9262108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk final int mState; 9272108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk 92801a44916003ebdff399406405548c6058b114c5aJason Monk DisableChanger(InstalledAppDetails activity, ApplicationInfo info, int state) { 92901a44916003ebdff399406405548c6058b114c5aJason Monk mPm = activity.mPm; 93001a44916003ebdff399406405548c6058b114c5aJason Monk mActivity = new WeakReference<InstalledAppDetails>(activity); 9312108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk mInfo = info; 9322108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk mState = state; 9332108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 9342108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk 9352108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk @Override 9362108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk protected Object doInBackground(Object... params) { 9372108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk mPm.setApplicationEnabledSetting(mInfo.packageName, mState, 0); 9382108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk return null; 9392108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 9402108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 9412108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk 9422108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk private final LoaderCallbacks<ChartData> mDataCallbacks = new LoaderCallbacks<ChartData>() { 9432108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk 9442108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk @Override 9452108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk public Loader<ChartData> onCreateLoader(int id, Bundle args) { 9462108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk return new ChartDataLoader(getActivity(), mStatsSession, args); 9472108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 9482108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk 9492108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk @Override 9502108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk public void onLoadFinished(Loader<ChartData> loader, ChartData data) { 9512108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk mChartData = data; 9522108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk mDataPreference.setSummary(getDataSummary()); 9532108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 9542108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk 9552108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk @Override 9562108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk public void onLoaderReset(Loader<ChartData> loader) { 9572108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk // Leave last result. 9582108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 9592108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk }; 9602108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk 9612108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk private final BroadcastReceiver mCheckKillProcessesReceiver = new BroadcastReceiver() { 9622108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk @Override 9632108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk public void onReceive(Context context, Intent intent) { 9642108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk updateForceStopButton(getResultCode() != Activity.RESULT_CANCELED); 9652108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 9662108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk }; 9672108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk 9682108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk private final PermissionsResultCallback mPermissionCallback 9692108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk = new PermissionsResultCallback() { 9702108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk @Override 9712108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk public void onPermissionSummaryResult(int[] counts, CharSequence[] groupLabels) { 9722108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk if (getActivity() == null) { 9732108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk return; 9742108d361bb1c4113d2250711d9ac8e6bc0de9245Jason Monk } 9752cdafc6be386bb767404e42fc728a1a810aa896aJason Monk mPermissionReceiver = null; 9762cdafc6be386bb767404e42fc728a1a810aa896aJason Monk final Resources res = getResources(); 9772cdafc6be386bb767404e42fc728a1a810aa896aJason Monk CharSequence summary = null; 9782cdafc6be386bb767404e42fc728a1a810aa896aJason Monk if (counts != null) { 9792cdafc6be386bb767404e42fc728a1a810aa896aJason Monk int totalCount = counts[1]; 9802cdafc6be386bb767404e42fc728a1a810aa896aJason Monk int additionalCounts = counts[2]; 9812cdafc6be386bb767404e42fc728a1a810aa896aJason Monk 9822cdafc6be386bb767404e42fc728a1a810aa896aJason Monk if (totalCount == 0) { 9832cdafc6be386bb767404e42fc728a1a810aa896aJason Monk summary = res.getString( 9842cdafc6be386bb767404e42fc728a1a810aa896aJason Monk R.string.runtime_permissions_summary_no_permissions_requested); 9852cdafc6be386bb767404e42fc728a1a810aa896aJason Monk } else { 9862cdafc6be386bb767404e42fc728a1a810aa896aJason Monk final ArrayList<CharSequence> list = new ArrayList(Arrays.asList(groupLabels)); 9872cdafc6be386bb767404e42fc728a1a810aa896aJason Monk if (additionalCounts > 0) { 9882cdafc6be386bb767404e42fc728a1a810aa896aJason Monk // N additional permissions. 989b01459997ed4d0232855e4dbc080bd1238e1256dJason Monk list.add(res.getQuantityString( 9902cdafc6be386bb767404e42fc728a1a810aa896aJason Monk R.plurals.runtime_permissions_additional_count, 9912cdafc6be386bb767404e42fc728a1a810aa896aJason Monk additionalCounts, additionalCounts)); 9922cdafc6be386bb767404e42fc728a1a810aa896aJason Monk } 9932cdafc6be386bb767404e42fc728a1a810aa896aJason Monk if (list.size() == 0) { 9942cdafc6be386bb767404e42fc728a1a810aa896aJason Monk summary = res.getString( 9952cdafc6be386bb767404e42fc728a1a810aa896aJason Monk R.string.runtime_permissions_summary_no_permissions_granted); 9962cdafc6be386bb767404e42fc728a1a810aa896aJason Monk } else { 9972cdafc6be386bb767404e42fc728a1a810aa896aJason Monk summary = ListFormatter.getInstance().format(list); 9983069581512bcb9687cb8d79675f6c4950c9ac087Jason Monk } 999b37e2887d3112082589997f1bbd802ec282cca6dJason Monk } 100010e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk } 100110e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk mPermissionsPreference.setSummary(summary); 100210e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk } 100310e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk }; 100410e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk} 100510e1a94ef7bf7034e0e9bebe471c868abb3825a9Jason Monk