Merge "Create AppDataUsageSummaryController" into main
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 321eb16..0f39c6c 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -148,6 +148,7 @@
     <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
     <uses-permission android:name="android.permission.GET_BACKGROUND_INSTALLED_PACKAGES" />
     <uses-permission android:name="android.permission.SATELLITE_COMMUNICATION" />
+    <uses-permission android:name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER" />
 
     <application
             android:name=".SettingsApplication"
diff --git a/src/com/android/settings/network/SubscriptionUtil.java b/src/com/android/settings/network/SubscriptionUtil.java
index 1ab3ed5..f3eb519 100644
--- a/src/com/android/settings/network/SubscriptionUtil.java
+++ b/src/com/android/settings/network/SubscriptionUtil.java
@@ -76,8 +76,9 @@
     static final String SUB_ID = "sub_id";
     @VisibleForTesting
     static final String KEY_UNIQUE_SUBSCRIPTION_DISPLAYNAME = "unique_subscription_displayName";
-    private static final String REGEX_DISPLAY_NAME_PREFIXES = "^";
-    private static final String REGEX_DISPLAY_NAME_SUFFIXES = "\\s[0-9]+";
+    private static final String REGEX_DISPLAY_NAME_SUFFIX = "\\s[0-9]+";
+    private static final Pattern REGEX_DISPLAY_NAME_SUFFIX_PATTERN =
+            Pattern.compile(REGEX_DISPLAY_NAME_SUFFIX);
 
     private static List<SubscriptionInfo> sAvailableResultsForTesting;
     private static List<SubscriptionInfo> sActiveResultsForTesting;
@@ -461,12 +462,12 @@
 
     @VisibleForTesting
     static boolean isValidCachedDisplayName(String cachedDisplayName, String originalName) {
-        if (TextUtils.isEmpty(cachedDisplayName) || TextUtils.isEmpty(originalName)) {
+        if (TextUtils.isEmpty(cachedDisplayName) || TextUtils.isEmpty(originalName)
+                || !cachedDisplayName.startsWith(originalName)) {
             return false;
         }
-        String regex = REGEX_DISPLAY_NAME_PREFIXES + originalName + REGEX_DISPLAY_NAME_SUFFIXES;
-        Pattern pattern = Pattern.compile(regex);
-        Matcher matcher = pattern.matcher(cachedDisplayName);
+        String displayNameSuffix = cachedDisplayName.substring(originalName.length());
+        Matcher matcher = REGEX_DISPLAY_NAME_SUFFIX_PATTERN.matcher(displayNameSuffix);
         return matcher.matches();
     }
 
diff --git a/src/com/android/settings/wifi/WifiAPITest.java b/src/com/android/settings/wifi/WifiAPITest.java
index c8bcf7f..8953875 100644
--- a/src/com/android/settings/wifi/WifiAPITest.java
+++ b/src/com/android/settings/wifi/WifiAPITest.java
@@ -18,7 +18,10 @@
 
 import static android.content.Context.WIFI_SERVICE;
 
+import static com.android.settingslib.wifi.WifiEnterpriseRestrictionUtils.isChangeWifiStateAllowed;
+
 import android.app.settings.SettingsEnums;
+import android.content.Context;
 import android.content.DialogInterface;
 import android.net.wifi.WifiManager;
 import android.os.Bundle;
@@ -38,7 +41,7 @@
 public class WifiAPITest extends SettingsPreferenceFragment implements
         Preference.OnPreferenceClickListener {
 
-    private static final String TAG = "WifiAPITest";
+    private static final String TAG = "WifiAPITest+++";
     private int netid;
 
     //============================
@@ -69,18 +72,38 @@
 
     @Override
     public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+        Context context = getContext();
+        if (context == null) {
+            return;
+        }
         addPreferencesFromResource(R.xml.wifi_api_test);
 
+        boolean isChangeWifiStateAllowed = isChangeWifiStateAllowed(context);
         final PreferenceScreen preferenceScreen = getPreferenceScreen();
 
         mWifiDisconnect = (Preference) preferenceScreen.findPreference(KEY_DISCONNECT);
-        mWifiDisconnect.setOnPreferenceClickListener(this);
+        if (mWifiDisconnect != null) {
+            mWifiDisconnect.setEnabled(isChangeWifiStateAllowed);
+            if (isChangeWifiStateAllowed) {
+                mWifiDisconnect.setOnPreferenceClickListener(this);
+            }
+        }
 
         mWifiDisableNetwork = (Preference) preferenceScreen.findPreference(KEY_DISABLE_NETWORK);
-        mWifiDisableNetwork.setOnPreferenceClickListener(this);
+        if (mWifiDisableNetwork != null) {
+            mWifiDisableNetwork.setEnabled(isChangeWifiStateAllowed);
+            if (isChangeWifiStateAllowed) {
+                mWifiDisableNetwork.setOnPreferenceClickListener(this);
+            }
+        }
 
         mWifiEnableNetwork = (Preference) preferenceScreen.findPreference(KEY_ENABLE_NETWORK);
-        mWifiEnableNetwork.setOnPreferenceClickListener(this);
+        if (mWifiEnableNetwork != null) {
+            mWifiEnableNetwork.setEnabled(isChangeWifiStateAllowed);
+            if (isChangeWifiStateAllowed) {
+                mWifiEnableNetwork.setOnPreferenceClickListener(this);
+            }
+        }
 
     }
 
diff --git a/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java b/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java
index 6df281a..46c281f 100644
--- a/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java
+++ b/tests/unit/src/com/android/settings/network/SubscriptionUtilTest.java
@@ -636,6 +636,14 @@
     }
 
     @Test
+    public void isValidCachedDisplayName_withBrackets_noCrash() {
+        String originalName = "originalName(";
+        String cacheString = "originalName( 1234";
+
+        assertThat(SubscriptionUtil.isValidCachedDisplayName(cacheString, originalName)).isTrue();
+    }
+
+    @Test
     public void isConnectedToWifi_hasWiFi_returnTrue() {
         addNetworkTransportType(NetworkCapabilities.TRANSPORT_WIFI);