Add FeatureProvider for onboarding related settings

Add OnboardingFeatureProvider which will be used to B&R sound settings and
related tasks.
Bug: 289512753
Test: FakeFeatureFactory

Change-Id: I25e3b1f105ce0970cdf651400c153d8b4733029b
diff --git a/src/com/android/settings/core/TogglePreferenceController.java b/src/com/android/settings/core/TogglePreferenceController.java
index a6c67eb..459312a 100644
--- a/src/com/android/settings/core/TogglePreferenceController.java
+++ b/src/com/android/settings/core/TogglePreferenceController.java
@@ -21,6 +21,7 @@
 
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.slices.SliceData;
+import com.android.settings.onboarding.OnboardingFeatureProvider;
 import com.android.settings.widget.TwoStateButtonPreference;
 import com.android.settingslib.PrimarySwitchPreference;
 import com.android.settingslib.core.instrumentation.SettingsJankMonitor;
@@ -84,6 +85,11 @@
             FeatureFactory.getFeatureFactory().getMetricsFeatureProvider()
                     .logClickedPreference(preference, getMetricsCategory());
         }
+        OnboardingFeatureProvider onboardingFeatureProvider =
+                FeatureFactory.getFeatureFactory().getOnboardingFeatureProvider();
+        if (onboardingFeatureProvider != null) {
+            onboardingFeatureProvider.markPreferenceHasChanged(mContext, mPreferenceKey);
+        }
         return setChecked((boolean) newValue);
     }
 
diff --git a/src/com/android/settings/onboarding/OnboardingFeatureProvider.kt b/src/com/android/settings/onboarding/OnboardingFeatureProvider.kt
new file mode 100644
index 0000000..054694f
--- /dev/null
+++ b/src/com/android/settings/onboarding/OnboardingFeatureProvider.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.onboarding
+
+import android.content.Context
+
+/**
+ * Provider for Onboarding related features.
+ */
+interface OnboardingFeatureProvider {
+    /**
+     * Mark this toggle preference has been changed.
+     * Called after [TogglePreferenceController.onPreferenceChange()].
+     *
+     * @param context App context
+     * @param preferenceKey The key to distinguish which preference has been changed.
+     */
+    fun markPreferenceHasChanged(context: Context, preferenceKey: String)
+}
\ No newline at end of file
diff --git a/src/com/android/settings/overlay/FeatureFactory.kt b/src/com/android/settings/overlay/FeatureFactory.kt
index 256acf4..bda0e17 100644
--- a/src/com/android/settings/overlay/FeatureFactory.kt
+++ b/src/com/android/settings/overlay/FeatureFactory.kt
@@ -24,6 +24,7 @@
 import com.android.settings.biometrics2.factory.BiometricsRepositoryProvider
 import com.android.settings.bluetooth.BluetoothFeatureProvider
 import com.android.settings.connecteddevice.stylus.StylusFeatureProvider
+import com.android.settings.onboarding.OnboardingFeatureProvider
 import com.android.settings.dashboard.DashboardFeatureProvider
 import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider
 import com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFeatureProvider
@@ -149,6 +150,11 @@
      */
     abstract val stylusFeatureProvider: StylusFeatureProvider
 
+    /**
+     * Retrieves implementation for TogglePreference feature.
+     */
+    open val onboardingFeatureProvider: OnboardingFeatureProvider? = null
+
     companion object {
         private var _factory: FeatureFactory? = null
 
diff --git a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java
index 0d7c0b1..d586db5 100644
--- a/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/robotests/src/com/android/settings/testutils/FakeFeatureFactory.java
@@ -23,6 +23,7 @@
 import com.android.settings.accessibility.AccessibilitySearchFeatureProvider;
 import com.android.settings.accounts.AccountFeatureProvider;
 import com.android.settings.applications.ApplicationFeatureProvider;
+import com.android.settings.onboarding.OnboardingFeatureProvider;
 import com.android.settings.biometrics.face.FaceFeatureProvider;
 import com.android.settings.biometrics2.factory.BiometricsRepositoryProvider;
 import com.android.settings.bluetooth.BluetoothFeatureProvider;
@@ -93,6 +94,7 @@
     public WifiFeatureProvider mWifiFeatureProvider;
     public KeyboardSettingsFeatureProvider mKeyboardSettingsFeatureProvider;
     public StylusFeatureProvider mStylusFeatureProvider;
+    public OnboardingFeatureProvider mOnboardingFeatureProvider;
 
     /**
      * Call this in {@code @Before} method of the test class to use fake factory.
@@ -137,6 +139,7 @@
         mWifiFeatureProvider = mock(WifiFeatureProvider.class);
         mKeyboardSettingsFeatureProvider = mock(KeyboardSettingsFeatureProvider.class);
         mStylusFeatureProvider = mock(StylusFeatureProvider.class);
+        mOnboardingFeatureProvider = mock(OnboardingFeatureProvider.class);
     }
 
     @Override
@@ -299,4 +302,9 @@
     public StylusFeatureProvider getStylusFeatureProvider() {
         return mStylusFeatureProvider;
     }
+
+    @Override
+    public OnboardingFeatureProvider getOnboardingFeatureProvider() {
+        return mOnboardingFeatureProvider;
+    }
 }
diff --git a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
index 90b4efe..05ed662 100644
--- a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
@@ -23,6 +23,7 @@
 import com.android.settings.accessibility.AccessibilitySearchFeatureProvider;
 import com.android.settings.accounts.AccountFeatureProvider;
 import com.android.settings.applications.ApplicationFeatureProvider;
+import com.android.settings.onboarding.OnboardingFeatureProvider;
 import com.android.settings.biometrics.face.FaceFeatureProvider;
 import com.android.settings.biometrics2.factory.BiometricsRepositoryProvider;
 import com.android.settings.bluetooth.BluetoothFeatureProvider;
@@ -92,6 +93,7 @@
     public WifiFeatureProvider mWifiFeatureProvider;
     public KeyboardSettingsFeatureProvider mKeyboardSettingsFeatureProvider;
     public StylusFeatureProvider mStylusFeatureProvider;
+    public OnboardingFeatureProvider mOnboardingFeatureProvider;
 
     /**
      * Call this in {@code @Before} method of the test class to use fake factory.
@@ -136,6 +138,7 @@
         mWifiFeatureProvider = mock(WifiFeatureProvider.class);
         mKeyboardSettingsFeatureProvider = mock(KeyboardSettingsFeatureProvider.class);
         mStylusFeatureProvider = mock(StylusFeatureProvider.class);
+        mOnboardingFeatureProvider = mock(OnboardingFeatureProvider.class);
     }
 
     @Override
@@ -298,4 +301,9 @@
     public StylusFeatureProvider getStylusFeatureProvider() {
         return mStylusFeatureProvider;
     }
+
+    @Override
+    public OnboardingFeatureProvider getOnboardingFeatureProvider() {
+        return mOnboardingFeatureProvider;
+    }
 }