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

Commit 6269e50e authored by Fan Zhang's avatar Fan Zhang
Browse files

Fix crash when starting daydream setting with wrong context

The context must be a UI context. This is a new requirement in P.

(Also converted the CurrentDream controller to be slice compatible)

Change-Id: I28874f296da617f4cedf6706b0663b76671f1780
Fixes: 111375261
Test: robotests
parent 00d42c51
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -16,13 +16,15 @@

<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:settings="http://schemas.android.com/apk/res-auto"
    android:key="dream_overview_screen"
    android:title="@string/screensaver_settings_title">

    <com.android.settings.widget.GearPreference
        android:key="current_screensaver"
        android:title="@string/screensaver_settings_current"
        android:fragment="com.android.settings.dream.CurrentDreamPicker" />
        android:fragment="com.android.settings.dream.CurrentDreamPicker"
        settings:controller="com.android.settings.dream.CurrentDreamPreferenceController" />

    <Preference
        android:key="when_to_start"
+19 −22
Original line number Diff line number Diff line
@@ -18,9 +18,8 @@ package com.android.settings.dream;

import android.content.Context;

import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.widget.GearPreference;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.dream.DreamBackend;
import com.android.settingslib.dream.DreamBackend.DreamInfo;

@@ -28,40 +27,38 @@ import java.util.Optional;

import androidx.preference.Preference;

public class CurrentDreamPreferenceController extends AbstractPreferenceController implements
        PreferenceControllerMixin {
public class CurrentDreamPreferenceController extends BasePreferenceController {

    private final DreamBackend mBackend;
    private final static String TAG = "CurrentDreamPreferenceController";
    private final static String CURRENT_SCREENSAVER = "current_screensaver";

    public CurrentDreamPreferenceController(Context context) {
        super(context);
    public CurrentDreamPreferenceController(Context context, String key) {
        super(context, key);
        mBackend = DreamBackend.getInstance(context);
    }

    @Override
    public boolean isAvailable() {
        return mBackend.getDreamInfos().size() > 0;
    }

    @Override
    public String getPreferenceKey() {
        return CURRENT_SCREENSAVER;
    public int getAvailabilityStatus() {
        return mBackend.getDreamInfos().size() > 0 ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
    }

    @Override
    public void updateState(Preference preference) {
        super.updateState(preference);

        preference.setSummary(mBackend.getActiveDreamName());
        setGearClickListenerForPreference(preference);
    }

    @Override
    public CharSequence getSummary() {
        return mBackend.getActiveDreamName();
    }

    private void setGearClickListenerForPreference(Preference preference) {
        if (!(preference instanceof GearPreference)) return;
        if (!(preference instanceof GearPreference)) {
            return;
        }

        GearPreference gearPreference = (GearPreference)preference;
        Optional<DreamInfo> info = getActiveDreamInfo();
        final GearPreference gearPreference = (GearPreference) preference;
        final Optional<DreamInfo> info = getActiveDreamInfo();
        if (!info.isPresent() || info.get().settingsComponentName == null) {
            gearPreference.setOnGearClickListener(null);
            return;
@@ -70,9 +67,9 @@ public class CurrentDreamPreferenceController extends AbstractPreferenceControll
    }

    private void launchScreenSaverSettings() {
        Optional<DreamInfo> info = getActiveDreamInfo();
        final Optional<DreamInfo> info = getActiveDreamInfo();
        if (!info.isPresent()) return;
        mBackend.launchSettings(info.get());
        mBackend.launchSettings(mContext, info.get());
    }

    private Optional<DreamInfo> getActiveDreamInfo() {
+0 −1
Original line number Diff line number Diff line
@@ -132,7 +132,6 @@ public class DreamSettings extends DashboardFragment {

    private static List<AbstractPreferenceController> buildPreferenceControllers(Context context) {
        List<AbstractPreferenceController> controllers = new ArrayList<>();
        controllers.add(new CurrentDreamPreferenceController(context));
        controllers.add(new WhenToDreamPreferenceController(context));
        controllers.add(new StartNowPreferenceController(context));
        return controllers;
+1 −1
Original line number Diff line number Diff line
@@ -56,7 +56,7 @@ public class CurrentDreamPreferenceControllerTest {
    public void setup() {
        MockitoAnnotations.initMocks(this);

        mController = new CurrentDreamPreferenceController(mContext);
        mController = new CurrentDreamPreferenceController(mContext, "test");
        ReflectionHelpers.setField(mController, "mBackend", mBackend);
    }