OSDN Git Service

Introduce config_disable_uninstall_update flag.
authorBen Lin <linben@google.com>
Thu, 8 Feb 2018 23:53:16 +0000 (15:53 -0800)
committerBen Lin <linben@google.com>
Tue, 13 Feb 2018 22:45:34 +0000 (14:45 -0800)
This adds the following flag:
config_disable_uninstall_update

Which by default is false. When set to true, it will hide the "Uninstall
updates" menu item for all cases.

This is useful for cases where the device OEMs want to allow users to
install apps, but do not want the ability to roll back updates on system
applications.

Bug: 62379281
Test: make RunSettingsRoboTests ROBOTEST_FILTER=AppInfoDashboardFragmentTest
Change-Id: I55fe92467ca95c05f6682174c117031d8295790e

res/values/bools.xml
src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
tests/robotests/res/values-mcc999/config.xml
tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java

index 0cf085f..f20b93c 100644 (file)
 
     <!-- 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>
index 5790d34..5e12503 100755 (executable)
@@ -82,8 +82,8 @@ public class AppInfoDashboardFragment extends DashboardFragment
     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 @@ public class AppInfoDashboardFragment extends DashboardFragment
         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);
index f43e39c..01bfa51 100644 (file)
@@ -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>
index b7e414c..d721e17 100644 (file)
 
 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.doReturn;
 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.PackageInfo;
 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 @@ public final class AppInfoDashboardFragmentTest {
     }
 
     @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);