diff --git a/res/xml/dream_fragment_overview.xml b/res/xml/dream_fragment_overview.xml index 6996908db18..fff6bfe0333 100644 --- a/res/xml/dream_fragment_overview.xml +++ b/res/xml/dream_fragment_overview.xml @@ -49,8 +49,7 @@ + android:summary="@string/dream_home_controls_toggle_summary" /> diff --git a/src/com/android/settings/dream/DreamHomeControlsPreferenceController.java b/src/com/android/settings/dream/DreamHomeControlsPreferenceController.java index 0e777ec4c9d..e2c9f5ea11e 100644 --- a/src/com/android/settings/dream/DreamHomeControlsPreferenceController.java +++ b/src/com/android/settings/dream/DreamHomeControlsPreferenceController.java @@ -21,7 +21,6 @@ import android.provider.Settings; 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 @@ import com.android.settingslib.dream.DreamBackend; 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 @@ public class DreamHomeControlsPreferenceController extends TogglePreferenceContr @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 418bb6418c1..4854fc6b578 100644 --- a/src/com/android/settings/dream/DreamSettings.java +++ b/src/com/android/settings/dream/DreamSettings.java @@ -25,6 +25,7 @@ import static com.android.settingslib.dream.DreamBackend.WHILE_DOCKED; 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 @@ public class DreamSettings extends DashboardFragment implements OnCheckedChangeL 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 @@ public class DreamSettings extends DashboardFragment implements OnCheckedChangeL 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 @@ public class DreamSettings extends DashboardFragment implements OnCheckedChangeL mDreamPickerController = dreamPickerController; } + @VisibleForTesting + void setDreamHomeControlsPreferenceController(DreamHomeControlsPreferenceController + dreamHomeControlsPreferenceController) { + mDreamHomeControlsPreferenceController = dreamHomeControlsPreferenceController; + } + private void setAllPreferencesEnabled(boolean isEnabled) { getPreferenceControllers().forEach(controllers -> { controllers.forEach(controller -> { @@ -171,6 +185,9 @@ public class DreamSettings extends DashboardFragment implements OnCheckedChangeL 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 @@ public class DreamSettings extends DashboardFragment implements OnCheckedChangeL } }); }); + updateComplicationsToggleVisibility(); } @Override @@ -188,7 +206,10 @@ public class DreamSettings extends DashboardFragment implements OnCheckedChangeL mComplicationsTogglePreference = findPreference( DreamComplicationPreferenceController.PREF_KEY); - updateComplicationsToggleVisibility(); + + mHomeControllerTogglePreference = findPreference( + DreamHomeControlsPreferenceController.PREF_KEY + ); mMainSwitchPreference = findPreference(MAIN_SWITCH_PREF_KEY); if (mMainSwitchPreference != null) { @@ -230,13 +251,29 @@ public class DreamSettings extends DashboardFragment implements OnCheckedChangeL } 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 57736151419..f172354452c 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 @@ public class DreamHomeControlsPreferenceControllerTest { 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 56dacddd614..aeb3ba042c9 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 static org.mockito.Mockito.when; 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 @@ public class DreamSettingsTest { @Mock private Preference mComplicationsTogglePref; @Mock + private Preference mHomeControllerTogglePref; + @Mock private DreamPickerController mDreamPickerController; + @Mock + private DreamHomeControlsPreferenceController mDreamHomeControlsPreferenceController; @Captor private ArgumentCaptor mDreamPickerCallbackCaptor; @@ -236,18 +241,116 @@ public class DreamSettingsTest { 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; }