Merge "Toggle Home controls when user selects Home Control Panel Dream" into main
diff --git a/res/xml/dream_fragment_overview.xml b/res/xml/dream_fragment_overview.xml
index 6996908..fff6bfe 100644
--- a/res/xml/dream_fragment_overview.xml
+++ b/res/xml/dream_fragment_overview.xml
@@ -49,8 +49,7 @@
     <SwitchPreferenceCompat
         android:key="dream_home_controls_toggle"
         android:title="@string/dream_home_controls_toggle_title"
-        android:summary="@string/dream_home_controls_toggle_summary"
-        settings:controller="com.android.settings.dream.DreamHomeControlsPreferenceController"/>
+        android:summary="@string/dream_home_controls_toggle_summary" />
 
     <com.android.settings.applications.SpacePreference
         android:layout_height="16dp" />
diff --git a/src/com/android/settings/dream/DreamHomeControlsPreferenceController.java b/src/com/android/settings/dream/DreamHomeControlsPreferenceController.java
index 0e777ec..e2c9f5e 100644
--- a/src/com/android/settings/dream/DreamHomeControlsPreferenceController.java
+++ b/src/com/android/settings/dream/DreamHomeControlsPreferenceController.java
@@ -21,7 +21,6 @@
 
 import androidx.preference.Preference;
 
-import com.android.internal.annotations.VisibleForTesting;
 import com.android.settings.R;
 import com.android.settings.core.TogglePreferenceController;
 import com.android.settingslib.dream.DreamBackend;
@@ -33,14 +32,11 @@
 public class DreamHomeControlsPreferenceController extends TogglePreferenceController {
     private final DreamBackend mBackend;
 
-    public DreamHomeControlsPreferenceController(Context context, String key) {
-        this(context, key, DreamBackend.getInstance(context));
-    }
+    public static final String PREF_KEY = "dream_home_controls_toggle";
 
-    @VisibleForTesting
-    public DreamHomeControlsPreferenceController(Context context, String key,
+    public DreamHomeControlsPreferenceController(Context context,
             DreamBackend dreamBackend) {
-        super(context, key);
+        super(context, PREF_KEY);
         mBackend = dreamBackend;
     }
 
@@ -57,7 +53,6 @@
     @Override
     public void updateState(Preference preference) {
         super.updateState(preference);
-        preference.setEnabled(getAvailabilityStatus() == AVAILABLE);
         refreshSummary(preference);
     }
 
diff --git a/src/com/android/settings/dream/DreamSettings.java b/src/com/android/settings/dream/DreamSettings.java
index 418bb64..4854fc6 100644
--- a/src/com/android/settings/dream/DreamSettings.java
+++ b/src/com/android/settings/dream/DreamSettings.java
@@ -25,6 +25,7 @@
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.os.Bundle;
+import android.service.dreams.DreamService;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -61,9 +62,11 @@
     private MainSwitchPreference mMainSwitchPreference;
     private Button mPreviewButton;
     private Preference mComplicationsTogglePreference;
+    private Preference mHomeControllerTogglePreference;
     private RecyclerView mRecyclerView;
 
     private DreamPickerController mDreamPickerController;
+    private DreamHomeControlsPreferenceController mDreamHomeControlsPreferenceController;
 
     private final DreamPickerController.Callback mCallback =
             this::updateComplicationsToggleVisibility;
@@ -139,7 +142,12 @@
         if (mDreamPickerController == null) {
             mDreamPickerController = new DreamPickerController(context);
         }
+        if (mDreamHomeControlsPreferenceController == null) {
+            mDreamHomeControlsPreferenceController = new DreamHomeControlsPreferenceController(
+                    context, DreamBackend.getInstance(getContext()));
+        }
         controllers.add(mDreamPickerController);
+        controllers.add(mDreamHomeControlsPreferenceController);
         controllers.add(new WhenToDreamPreferenceController(context));
         return controllers;
     }
@@ -164,6 +172,12 @@
         mDreamPickerController = dreamPickerController;
     }
 
+    @VisibleForTesting
+    void setDreamHomeControlsPreferenceController(DreamHomeControlsPreferenceController
+            dreamHomeControlsPreferenceController) {
+        mDreamHomeControlsPreferenceController = dreamHomeControlsPreferenceController;
+    }
+
     private void setAllPreferencesEnabled(boolean isEnabled) {
         getPreferenceControllers().forEach(controllers -> {
             controllers.forEach(controller -> {
@@ -171,6 +185,9 @@
                 if (prefKey.equals(MAIN_SWITCH_PREF_KEY)) {
                     return;
                 }
+                if (prefKey.equals(DreamHomeControlsPreferenceController.PREF_KEY)) {
+                    return;
+                }
                 final Preference pref = findPreference(prefKey);
                 if (pref != null) {
                     pref.setEnabled(isEnabled);
@@ -178,6 +195,7 @@
                 }
             });
         });
+        updateComplicationsToggleVisibility();
     }
 
     @Override
@@ -188,7 +206,10 @@
 
         mComplicationsTogglePreference = findPreference(
                 DreamComplicationPreferenceController.PREF_KEY);
-        updateComplicationsToggleVisibility();
+
+        mHomeControllerTogglePreference = findPreference(
+                DreamHomeControlsPreferenceController.PREF_KEY
+        );
 
         mMainSwitchPreference = findPreference(MAIN_SWITCH_PREF_KEY);
         if (mMainSwitchPreference != null) {
@@ -230,13 +251,29 @@
     }
 
     private void updateComplicationsToggleVisibility() {
-        if (mDreamPickerController == null || mComplicationsTogglePreference == null) {
+        if (mDreamPickerController == null) {
             return;
         }
-
         final DreamBackend.DreamInfo activeDream = mDreamPickerController.getActiveDreamInfo();
-        mComplicationsTogglePreference.setVisible(
-                activeDream != null && activeDream.supportsComplications);
+
+        final DreamBackend dreamBackend = DreamBackend.getInstance(getContext());
+
+
+        if (mComplicationsTogglePreference != null) {
+            mComplicationsTogglePreference.setVisible(
+                    activeDream != null && activeDream.supportsComplications);
+        }
+
+        if (mHomeControllerTogglePreference != null) {
+            boolean isEnabled = dreamBackend.isEnabled()
+                                && (activeDream == null
+                                || (activeDream.dreamCategory
+                                & DreamService.DREAM_CATEGORY_HOME_PANEL) == 0)
+                                && mDreamHomeControlsPreferenceController
+                                    .getAvailabilityStatus()
+                                    == mDreamHomeControlsPreferenceController.AVAILABLE;
+            mHomeControllerTogglePreference.setEnabled(isEnabled);
+        }
     }
 
     private void updatePaddingForPreviewButton() {
diff --git a/tests/robotests/src/com/android/settings/dream/DreamHomeControlsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/dream/DreamHomeControlsPreferenceControllerTest.java
index 5773615..f172354 100644
--- a/tests/robotests/src/com/android/settings/dream/DreamHomeControlsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/dream/DreamHomeControlsPreferenceControllerTest.java
@@ -63,7 +63,7 @@
         mContext = ApplicationProvider.getApplicationContext();
         mShadowContentResolver = Shadow.extract(mContext.getContentResolver());
         mBackend = new DreamBackend(mContext);
-        mController = new DreamHomeControlsPreferenceController(mContext, "key", mBackend);
+        mController = new DreamHomeControlsPreferenceController(mContext, mBackend);
         mPreference = new SwitchPreference(mContext);
         mPreference.setKey(mController.getPreferenceKey());
         when(mScreen.findPreference(mPreference.getKey())).thenReturn(mPreference);
diff --git a/tests/robotests/src/com/android/settings/dream/DreamSettingsTest.java b/tests/robotests/src/com/android/settings/dream/DreamSettingsTest.java
index 56dacdd..aeb3ba0 100644
--- a/tests/robotests/src/com/android/settings/dream/DreamSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/dream/DreamSettingsTest.java
@@ -26,6 +26,7 @@
 
 import android.content.Context;
 import android.os.Bundle;
+import android.service.dreams.DreamService;
 
 import androidx.preference.Preference;
 import androidx.preference.PreferenceManager;
@@ -88,7 +89,11 @@
     @Mock
     private Preference mComplicationsTogglePref;
     @Mock
+    private Preference mHomeControllerTogglePref;
+    @Mock
     private DreamPickerController mDreamPickerController;
+    @Mock
+    private DreamHomeControlsPreferenceController mDreamHomeControlsPreferenceController;
     @Captor
     private ArgumentCaptor<DreamPickerController.Callback> mDreamPickerCallbackCaptor;
 
@@ -236,18 +241,116 @@
         verify(mComplicationsTogglePref).setVisible(true);
     }
 
+    @Test
+    public void homeControlToggle_enableWhenDreamCategoryIsDefault() {
+        MockitoAnnotations.initMocks(this);
+
+        final Context context = ApplicationProvider.getApplicationContext();
+        final DreamSettings dreamSettings = prepareDreamSettings(context);
+
+         // Active dream does not support complications
+        final DreamBackend.DreamInfo activeDream = new DreamBackend.DreamInfo();
+        activeDream.dreamCategory = DreamService.DREAM_CATEGORY_DEFAULT;
+
+        when(mDreamPickerController.getActiveDreamInfo()).thenReturn(activeDream);
+
+        dreamSettings.onAttach(context);
+        dreamSettings.onCreate(Bundle.EMPTY);
+
+        verify(mHomeControllerTogglePref).setEnabled(true);
+    }
+
+    @Test
+    public void homePanelToggle_disableWhenDreamCategoryIsHomePanel() {
+        MockitoAnnotations.initMocks(this);
+
+        final Context context = ApplicationProvider.getApplicationContext();
+        final DreamSettings dreamSettings = prepareDreamSettings(context);
+
+        // Active dream does not support complications
+        final DreamBackend.DreamInfo activeDream = new DreamBackend.DreamInfo();
+        activeDream.dreamCategory = DreamService.DREAM_CATEGORY_HOME_PANEL;
+
+        when(mDreamPickerController.getActiveDreamInfo()).thenReturn(activeDream);
+
+        dreamSettings.onAttach(context);
+        dreamSettings.onCreate(Bundle.EMPTY);
+
+        verify(mHomeControllerTogglePref).setEnabled(false);
+    }
+
+    @Test
+    public void homePanelToggle_disableWhenSwitchingFromDefaultToHomePanel() {
+        MockitoAnnotations.initMocks(this);
+
+        final Context context = ApplicationProvider.getApplicationContext();
+        final DreamSettings dreamSettings = prepareDreamSettings(context);
+
+
+        // Active dream does not support complications
+        final DreamBackend.DreamInfo activeDream = new DreamBackend.DreamInfo();
+        activeDream.dreamCategory = DreamService.DREAM_CATEGORY_DEFAULT;
+
+        when(mDreamPickerController.getActiveDreamInfo()).thenReturn(activeDream);
+
+        dreamSettings.onAttach(context);
+        dreamSettings.onCreate(Bundle.EMPTY);
+
+        verify(mHomeControllerTogglePref).setEnabled(true);
+        verify(mDreamPickerController).addCallback(mDreamPickerCallbackCaptor.capture());
+
+        activeDream.dreamCategory = DreamService.DREAM_CATEGORY_HOME_PANEL;
+        mDreamPickerCallbackCaptor.getValue().onActiveDreamChanged();
+        verify(mHomeControllerTogglePref).setEnabled(false);
+    }
+
+    @Test
+    public void homePanelToggle_showWhenSwitchingFromHomePanelToDefault() {
+        MockitoAnnotations.initMocks(this);
+
+        final Context context = ApplicationProvider.getApplicationContext();
+        final DreamSettings dreamSettings = prepareDreamSettings(context);
+
+
+        // Active dream does not support complications
+        final DreamBackend.DreamInfo activeDream = new DreamBackend.DreamInfo();
+        activeDream.dreamCategory = DreamService.DREAM_CATEGORY_HOME_PANEL;
+
+        when(mDreamPickerController.getActiveDreamInfo()).thenReturn(activeDream);
+
+        dreamSettings.onAttach(context);
+        dreamSettings.onCreate(Bundle.EMPTY);
+
+        verify(mHomeControllerTogglePref).setEnabled(false);
+        verify(mDreamPickerController).addCallback(mDreamPickerCallbackCaptor.capture());
+
+        activeDream.dreamCategory = DreamService.DREAM_CATEGORY_DEFAULT;
+        mDreamPickerCallbackCaptor.getValue().onActiveDreamChanged();
+        verify(mHomeControllerTogglePref).setEnabled(true);
+    }
+
     private DreamSettings prepareDreamSettings(Context context) {
         final TestDreamSettings dreamSettings = new TestDreamSettings(context);
         when(mDreamPickerController.getPreferenceKey()).thenReturn(DreamPickerController.PREF_KEY);
+        when(mDreamHomeControlsPreferenceController.getPreferenceKey())
+                .thenReturn(DreamHomeControlsPreferenceController.PREF_KEY);
         when(mDreamPickerPref.getExtras()).thenReturn(new Bundle());
         when(mDreamPickerPref.getKey()).thenReturn(DreamPickerController.PREF_KEY);
         when(mComplicationsTogglePref.getKey()).thenReturn(
                 DreamComplicationPreferenceController.PREF_KEY);
-
+        when(mHomeControllerTogglePref.getExtras()).thenReturn(new Bundle());
+        when(mHomeControllerTogglePref.getKey()).thenReturn(
+                DreamHomeControlsPreferenceController.PREF_KEY);
+        when(mDreamHomeControlsPreferenceController.getAvailabilityStatus())
+                .thenReturn(mDreamHomeControlsPreferenceController.AVAILABLE);
         dreamSettings.addPreference(DreamPickerController.PREF_KEY, mDreamPickerPref);
         dreamSettings.addPreference(DreamComplicationPreferenceController.PREF_KEY,
                 mComplicationsTogglePref);
+        dreamSettings.addPreference(DreamHomeControlsPreferenceController.PREF_KEY,
+                mHomeControllerTogglePref);
         dreamSettings.setDreamPickerController(mDreamPickerController);
+        dreamSettings
+                .setDreamHomeControlsPreferenceController(mDreamHomeControlsPreferenceController);
 
         return dreamSettings;
     }