Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8b02d17d authored by Prince's avatar Prince
Browse files

Toggle Home controls when user selects Home Control Panel Dream

Test: DreamSettingsTest
Flag: ACONFIG android.service.controls.flags.home_panel_dream STAGING
Fixes: 323887821
Change-Id: Iba7c2ff41e3e0074a28f96c4e5fa1028b80f7a92
parent 4b009070
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -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" />
+3 −8
Original line number Diff line number Diff line
@@ -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);
    }

+42 −5
Original line number Diff line number Diff line
@@ -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,15 +251,31 @@ 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();

        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() {
        mPreviewButton.post(() -> {
            mRecyclerView.setPadding(0, 0, 0, mPreviewButton.getMeasuredHeight());
+1 −1
Original line number Diff line number Diff line
@@ -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);
+104 −1
Original line number Diff line number Diff line
@@ -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<DreamPickerController.Callback> 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;
    }