Merge "Introduce config_disable_uninstall_update flag."
diff --git a/res/values/bools.xml b/res/values/bools.xml
index 0cf085f..f20b93c 100644
--- a/res/values/bools.xml
+++ b/res/values/bools.xml
@@ -173,4 +173,7 @@
<!-- Whether wifi_mac_address should be shown or not. -->
<bool name="config_show_wifi_mac_address">true</bool>
+
+ <!-- Whether to disable "Uninstall Updates" menu item for System apps or not.. -->
+ <bool name="config_disable_uninstall_update">false</bool>
</resources>
diff --git a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
index 5790d34..5e12503 100755
--- a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
+++ b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
@@ -82,8 +82,8 @@
private static final String TAG = "AppInfoDashboard";
// Menu identifiers
- private static final int UNINSTALL_ALL_USERS_MENU = 1;
- private static final int UNINSTALL_UPDATES = 2;
+ @VisibleForTesting static final int UNINSTALL_ALL_USERS_MENU = 1;
+ @VisibleForTesting static final int UNINSTALL_UPDATES = 2;
static final int FORCE_STOP_MENU = 3;
// Result code identifiers
@@ -330,7 +330,10 @@
menu.findItem(UNINSTALL_ALL_USERS_MENU).setVisible(shouldShowUninstallForAll(mAppEntry));
mUpdatedSysApp = (mAppEntry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
final MenuItem uninstallUpdatesItem = menu.findItem(UNINSTALL_UPDATES);
- uninstallUpdatesItem.setVisible(mUpdatedSysApp && !mAppsControlDisallowedBySystem);
+ final boolean uninstallUpdateDisabled = getContext().getResources().getBoolean(
+ R.bool.config_disable_uninstall_update);
+ uninstallUpdatesItem.setVisible(
+ mUpdatedSysApp && !mAppsControlDisallowedBySystem && !uninstallUpdateDisabled);
if (uninstallUpdatesItem.isVisible()) {
RestrictedLockUtils.setMenuItemAsDisabledByAdmin(getActivity(),
uninstallUpdatesItem, mAppsControlDisallowedAdmin);
diff --git a/tests/robotests/res/values-mcc999/config.xml b/tests/robotests/res/values-mcc999/config.xml
index f43e39c..01bfa51 100644
--- a/tests/robotests/res/values-mcc999/config.xml
+++ b/tests/robotests/res/values-mcc999/config.xml
@@ -62,4 +62,5 @@
<bool name="config_show_device_model">false</bool>
<bool name="config_show_wifi_ip_address">false</bool>
<bool name="config_show_wifi_mac_address">false</bool>
+ <bool name="config_disable_uninstall_update">true</bool>
</resources>
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java
index b7e414c..d721e17 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java
@@ -16,6 +16,10 @@
package com.android.settings.applications.appinfo;
+import static com.android.settings.applications.appinfo.AppInfoDashboardFragment
+ .UNINSTALL_ALL_USERS_MENU;
+import static com.android.settings.applications.appinfo.AppInfoDashboardFragment.UNINSTALL_UPDATES;
+
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
@@ -25,6 +29,7 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -36,6 +41,8 @@
import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
import android.os.UserManager;
+import android.view.Menu;
+import android.view.MenuItem;
import com.android.settings.SettingsActivity;
import com.android.settings.TestConfig;
@@ -129,6 +136,42 @@
}
@Test
+ public void onPrepareOptionsMenu_setUpdateMenuVisible_byDefaultForSystemApps_shouldBeTrue() {
+ Menu menu = onPrepareOptionsMenuTestsSetup();
+ mFragment.onPrepareOptionsMenu(menu);
+
+ verify(menu.findItem(UNINSTALL_UPDATES), times(1)).setVisible(true);
+ }
+
+ @Test
+ @Config(qualifiers = "mcc999")
+ public void onPrepareOptionsMenu_setUpdateMenuVisible_ifDisabledByDevice_shouldBeFalse() {
+ Menu menu = onPrepareOptionsMenuTestsSetup();
+ mFragment.onPrepareOptionsMenu(menu);
+
+ verify(menu.findItem(UNINSTALL_UPDATES), times(1)).setVisible(false);
+ }
+
+ private Menu onPrepareOptionsMenuTestsSetup() {
+ // Menu mocking
+ Menu menu = mock(Menu.class);
+ final MenuItem uninstallUpdatesMenuItem = mock(MenuItem.class);
+ final MenuItem uninstallForAllMenuItem = mock(MenuItem.class);
+ when(menu.findItem(UNINSTALL_UPDATES)).thenReturn(uninstallUpdatesMenuItem);
+ when(menu.findItem(UNINSTALL_ALL_USERS_MENU)).thenReturn(uninstallForAllMenuItem);
+
+ // Setup work to prevent NPE
+ final ApplicationInfo info = new ApplicationInfo();
+ info.flags = ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
+ info.enabled = true;
+ final AppEntry appEntry = mock(AppEntry.class);
+ appEntry.info = info;
+ mFragment.setAppEntry(appEntry);
+
+ return menu;
+ }
+
+ @Test
public void launchFragment_hasNoPackageInfo_shouldFinish() {
ReflectionHelpers.setField(mFragment, "mPackageInfo", null);