Add UxRestricted message to PreferenceGroup

Added missing uxrestricted toast to compatible preferences contained
inside preference groups.

Bug: 176953799
Test: manual, atest CarSettingsUnitTests
Change-Id: I8975caa1e22594b7fab720a5ee512806efb9d1d4
(cherry picked from commit 3d2f8a03374fc6730e997b4137d080d79f14820d)
diff --git a/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceController.java b/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceController.java
index fb64c77..e3f024a 100644
--- a/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceController.java
+++ b/src/com/android/car/settings/applications/specialaccess/NotificationAccessPreferenceController.java
@@ -39,6 +39,7 @@
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.Logger;
 import com.android.car.settings.common.PreferenceController;
+import com.android.car.ui.preference.CarUiSwitchPreference;
 import com.android.settingslib.applications.ServiceListing;
 
 import java.util.List;
@@ -149,7 +150,7 @@
                 LOG.e("can't find package name", e);
             }
             String summary = service.loadLabel(packageManager).toString();
-            SwitchPreference pref = new SwitchPreference(getContext());
+            SwitchPreference pref = new CarUiSwitchPreference(getContext());
             pref.setPersistent(false);
             pref.setIcon(mIconDrawableFactory.getBadgedIcon(service, service.applicationInfo,
                     UserHandle.getUserId(service.applicationInfo.uid)));
diff --git a/src/com/android/car/settings/common/ExtraSettingsPreferenceController.java b/src/com/android/car/settings/common/ExtraSettingsPreferenceController.java
index 480c22b..7431249 100644
--- a/src/com/android/car/settings/common/ExtraSettingsPreferenceController.java
+++ b/src/com/android/car/settings/common/ExtraSettingsPreferenceController.java
@@ -109,8 +109,6 @@
 
     @Override
     protected void onApplyUxRestrictions(CarUxRestrictions uxRestrictions) {
-        super.onApplyUxRestrictions(uxRestrictions);
-
         // If preference intents into an activity that's not distraction optimized, disable the
         // preference. This will override the UXRE flags config_ignore_ux_restrictions and
         // config_always_ignore_ux_restrictions because navigating to these non distraction
diff --git a/src/com/android/car/settings/common/PreferenceController.java b/src/com/android/car/settings/common/PreferenceController.java
index e511e09..4a5787c 100644
--- a/src/com/android/car/settings/common/PreferenceController.java
+++ b/src/com/android/car/settings/common/PreferenceController.java
@@ -25,6 +25,7 @@
 import androidx.lifecycle.DefaultLifecycleObserver;
 import androidx.lifecycle.LifecycleOwner;
 import androidx.preference.Preference;
+import androidx.preference.PreferenceGroup;
 
 import com.android.car.settings.R;
 import com.android.car.ui.preference.DisabledPreferenceCallback;
@@ -459,12 +460,19 @@
                 showMessage = true;
             }
         }
-        setRestrictedWhileDrivingMessage(mPreference, showMessage);
+        if (mPreference instanceof PreferenceGroup) {
+            PreferenceGroup preferenceGroup = (PreferenceGroup) mPreference;
+            for (int i = 0; i < preferenceGroup.getPreferenceCount(); i++) {
+                setRestrictedWhileDrivingMessage(preferenceGroup.getPreference(i), showMessage);
+            }
+        } else {
+            setRestrictedWhileDrivingMessage(mPreference, showMessage);
+        }
     }
 
     /**
      * Updates the preference restricted while driving message.
-
+     *
      * @param preference  the preference to update.
      * @param showMessage whether or not the message should be shown.
      */
diff --git a/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceController.java b/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceController.java
index be1001f..6029469 100644
--- a/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceController.java
+++ b/src/com/android/car/settings/inputmethod/KeyboardManagementPreferenceController.java
@@ -31,6 +31,7 @@
 import com.android.car.settings.common.ConfirmationDialogFragment;
 import com.android.car.settings.common.FragmentController;
 import com.android.car.settings.common.PreferenceController;
+import com.android.car.ui.preference.CarUiSwitchPreference;
 
 import java.util.Collections;
 import java.util.Comparator;
@@ -183,7 +184,7 @@
      * @return {@code SwitchPreference} which allows a user to enable/disable an input method.
      */
     private SwitchPreference createSwitchPreference(InputMethodInfo inputMethodInfo) {
-        SwitchPreference switchPreference = new SwitchPreference(getContext());
+        SwitchPreference switchPreference = new CarUiSwitchPreference(getContext());
         switchPreference.setKey(String.valueOf(inputMethodInfo.getId()));
         switchPreference.setIcon(InputMethodUtil.getPackageIcon(mPackageManager, inputMethodInfo));
         switchPreference.setTitle(InputMethodUtil.getPackageLabel(mPackageManager,
diff --git a/src/com/android/car/settings/users/PermissionsPreferenceController.java b/src/com/android/car/settings/users/PermissionsPreferenceController.java
index e8800a4..422530c 100644
--- a/src/com/android/car/settings/users/PermissionsPreferenceController.java
+++ b/src/com/android/car/settings/users/PermissionsPreferenceController.java
@@ -28,6 +28,7 @@
 
 import com.android.car.settings.R;
 import com.android.car.settings.common.FragmentController;
+import com.android.car.ui.preference.CarUiSwitchPreference;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -86,7 +87,7 @@
         super(context, preferenceKey, fragmentController, uxRestrictions);
 
         for (UserPermission permission : PERMISSIONS_LIST) {
-            SwitchPreference preference = new SwitchPreference(context);
+            SwitchPreference preference = new CarUiSwitchPreference(context);
             preference.setTitle(permission.getPermissionTitle());
             preference.getExtras().putString(PERMISSION_TYPE_KEY, permission.getPermissionKey());
             preference.setOnPreferenceChangeListener((pref, newValue) -> {
diff --git a/tests/unit/src/com/android/car/settings/common/ExtraSettingsPreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/common/ExtraSettingsPreferenceControllerTest.java
index 6c7d36b..ca7e998 100644
--- a/tests/unit/src/com/android/car/settings/common/ExtraSettingsPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/common/ExtraSettingsPreferenceControllerTest.java
@@ -175,6 +175,23 @@
     }
 
     @Test
+    public void onUxRestrictionsChanged_distractionOptimized_restrictedMessageUnset() {
+        mMetaData.putBoolean(META_DATA_DISTRACTION_OPTIMIZED, true);
+        mPreferenceBundleMap.put(mPreference, mMetaData);
+        when(mExtraSettingsLoaderMock.loadPreferences(FAKE_INTENT)).thenReturn(
+                mPreferenceBundleMap);
+        mPreferenceController.setExtraSettingsLoader(mExtraSettingsLoaderMock);
+
+        mPreferenceController.onCreate(mLifecycleOwner);
+
+        Mockito.reset(mPreference);
+        mPreferenceController.onUxRestrictionsChanged(NO_SETUP_UX_RESTRICTIONS);
+
+        verify((DisabledPreferenceCallback) mPreference)
+                .setMessageToShowWhenDisabledPreferenceClicked("");
+    }
+
+    @Test
     public void onCreate_hasDynamicTitleData_placeholderAdded() {
         mMetaData.putString(META_DATA_PREFERENCE_TITLE_URI, FAKE_PROVIDER);
         mPreferenceBundleMap.put(mPreference, mMetaData);
diff --git a/tests/unit/src/com/android/car/settings/common/PreferenceControllerTest.java b/tests/unit/src/com/android/car/settings/common/PreferenceControllerTest.java
index 9181f05..e759bca 100644
--- a/tests/unit/src/com/android/car/settings/common/PreferenceControllerTest.java
+++ b/tests/unit/src/com/android/car/settings/common/PreferenceControllerTest.java
@@ -16,6 +16,7 @@
 
 package com.android.car.settings.common;
 
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 
 import android.car.drivingstate.CarUxRestrictions;
@@ -23,6 +24,8 @@
 
 import androidx.lifecycle.LifecycleOwner;
 import androidx.preference.Preference;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
 import androidx.test.annotation.UiThreadTest;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -100,6 +103,31 @@
     }
 
     @Test
+    @UiThreadTest
+    public void onUxRestrictionsChanged_restricted_preferenceGroup_restrictedMessageSet() {
+        PreferenceManager preferenceManager = new PreferenceManager(mContext);
+        PreferenceScreen preferenceScreen = preferenceManager.createPreferenceScreen(mContext);
+        CarUiPreference preference1 = mock(CarUiPreference.class);
+        CarUiPreference preference2 = mock(CarUiPreference.class);
+        preferenceScreen.addPreference(preference1);
+        preferenceScreen.addPreference(preference2);
+
+        mPreferenceController.setPreference(preferenceScreen);
+        mPreferenceController.onCreate(mLifecycleOwner);
+
+        Mockito.reset(preference1);
+        Mockito.reset(preference2);
+        mPreferenceController.onUxRestrictionsChanged(NO_SETUP_UX_RESTRICTIONS);
+
+        verify((DisabledPreferenceCallback) preference1)
+                .setMessageToShowWhenDisabledPreferenceClicked(
+                        ResourceTestUtils.getString(mContext, "restricted_while_driving"));
+        verify((DisabledPreferenceCallback) preference2)
+                .setMessageToShowWhenDisabledPreferenceClicked(
+                        ResourceTestUtils.getString(mContext, "restricted_while_driving"));
+    }
+
+    @Test
     public void onCreate_unrestricted_disabled_restrictedMessageUnset() {
         mPreference.setEnabled(false);
         mPreferenceController.setPreference(mPreference);