Hide tethering option when in a guest account

- Before this CL, users can share their mobile data through enabling
  tethering in the USB menu when in a guest account.
  It will cause main users to spend their money unexpectedly.

  This CL will hide the tethering option on the USB menu when in the
  guest account.
- Add test cases.

Bug: 166125765
Test: 1. make -j42 RunSettingsRoboTests. 2. Switch to a guest account
to verify whether the tethering option is hiding.

Change-Id: I7523b3f3c3a1372bb128a58a6a7fac973d27cfbe
Merged-In: I7523b3f3c3a1372bb128a58a6a7fac973d27cfbe
(cherry picked from commit bde627b263baf3de10e096868235edde8e740eab)
diff --git a/src/com/android/settings/connecteddevice/usb/UsbBackend.java b/src/com/android/settings/connecteddevice/usb/UsbBackend.java
index 556f76d..4773aca 100644
--- a/src/com/android/settings/connecteddevice/usb/UsbBackend.java
+++ b/src/com/android/settings/connecteddevice/usb/UsbBackend.java
@@ -50,6 +50,7 @@
     private final boolean mTetheringRestrictedBySystem;
     private final boolean mMidiSupported;
     private final boolean mTetheringSupported;
+    private final boolean mIsAdminUser;
 
     private UsbManager mUsbManager;
 
@@ -70,6 +71,7 @@
         mFileTransferRestrictedBySystem = isUsbFileTransferRestrictedBySystem(userManager);
         mTetheringRestricted = isUsbTetheringRestricted(userManager);
         mTetheringRestrictedBySystem = isUsbTetheringRestrictedBySystem(userManager);
+        mIsAdminUser = userManager.isAdminUser();
 
         mMidiSupported = context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MIDI);
         ConnectivityManager cm =
@@ -100,7 +102,8 @@
                 || (!mTetheringSupported && (functions & UsbManager.FUNCTION_RNDIS) != 0)) {
             return false;
         }
-        return !(areFunctionDisallowed(functions) || areFunctionsDisallowedBySystem(functions));
+        return !(areFunctionDisallowed(functions) || areFunctionsDisallowedBySystem(functions)
+                || areFunctionsDisallowedByNonAdminUser(functions));
     }
 
     public int getPowerRole() {
@@ -207,6 +210,11 @@
                 || (mTetheringRestrictedBySystem && ((functions & UsbManager.FUNCTION_RNDIS) != 0));
     }
 
+    @VisibleForTesting
+    boolean areFunctionsDisallowedByNonAdminUser(long functions) {
+        return !mIsAdminUser && (functions & UsbManager.FUNCTION_RNDIS) != 0;
+    }
+
     private void updatePorts() {
         mPort = null;
         mPortStatus = null;
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbBackendTest.java b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbBackendTest.java
index 4e5897d..b816a18 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbBackendTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbBackendTest.java
@@ -181,4 +181,24 @@
 
         assertThat(usbBackend.areFunctionsSupported(UsbManager.FUNCTION_MTP)).isTrue();
     }
+
+    @Test
+    public void areFunctionsDisallowedByNonAdminUser_isAdminUser_returnFalse() {
+        when(mUserManager.isAdminUser()).thenReturn(true);
+
+        final UsbBackend usbBackend = new UsbBackend(mContext, mUserManager);
+
+        assertThat(usbBackend.areFunctionsDisallowedByNonAdminUser(
+                UsbManager.FUNCTION_RNDIS)).isFalse();
+    }
+
+    @Test
+    public void areFunctionsDisallowedByNonAdminUser_isNotAdminUser_returnTrue() {
+        when(mUserManager.isAdminUser()).thenReturn(false);
+
+        final UsbBackend usbBackend = new UsbBackend(mContext, mUserManager);
+
+        assertThat(usbBackend.areFunctionsDisallowedByNonAdminUser(
+                UsbManager.FUNCTION_RNDIS)).isTrue();
+    }
 }