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
This commit is contained in:
Fan Zhang
2018-07-12 13:22:23 -07:00
parent 00d42c510d
commit 6269e50e8e
4 changed files with 26 additions and 28 deletions

View File

@@ -16,13 +16,15 @@
<PreferenceScreen <PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="dream_overview_screen" android:key="dream_overview_screen"
android:title="@string/screensaver_settings_title"> android:title="@string/screensaver_settings_title">
<com.android.settings.widget.GearPreference <com.android.settings.widget.GearPreference
android:key="current_screensaver" android:key="current_screensaver"
android:title="@string/screensaver_settings_current" 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 <Preference
android:key="when_to_start" android:key="when_to_start"

View File

@@ -18,9 +18,8 @@ package com.android.settings.dream;
import android.content.Context; 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.settings.widget.GearPreference;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.dream.DreamBackend; import com.android.settingslib.dream.DreamBackend;
import com.android.settingslib.dream.DreamBackend.DreamInfo; import com.android.settingslib.dream.DreamBackend.DreamInfo;
@@ -28,40 +27,38 @@ import java.util.Optional;
import androidx.preference.Preference; import androidx.preference.Preference;
public class CurrentDreamPreferenceController extends AbstractPreferenceController implements public class CurrentDreamPreferenceController extends BasePreferenceController {
PreferenceControllerMixin {
private final DreamBackend mBackend;
private final static String TAG = "CurrentDreamPreferenceController";
private final static String CURRENT_SCREENSAVER = "current_screensaver";
public CurrentDreamPreferenceController(Context context) { private final DreamBackend mBackend;
super(context);
public CurrentDreamPreferenceController(Context context, String key) {
super(context, key);
mBackend = DreamBackend.getInstance(context); mBackend = DreamBackend.getInstance(context);
} }
@Override @Override
public boolean isAvailable() { public int getAvailabilityStatus() {
return mBackend.getDreamInfos().size() > 0; return mBackend.getDreamInfos().size() > 0 ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
}
@Override
public String getPreferenceKey() {
return CURRENT_SCREENSAVER;
} }
@Override @Override
public void updateState(Preference preference) { public void updateState(Preference preference) {
super.updateState(preference); super.updateState(preference);
preference.setSummary(mBackend.getActiveDreamName());
setGearClickListenerForPreference(preference); setGearClickListenerForPreference(preference);
} }
private void setGearClickListenerForPreference(Preference preference) { @Override
if (!(preference instanceof GearPreference)) return; public CharSequence getSummary() {
return mBackend.getActiveDreamName();
}
GearPreference gearPreference = (GearPreference)preference; private void setGearClickListenerForPreference(Preference preference) {
Optional<DreamInfo> info = getActiveDreamInfo(); if (!(preference instanceof GearPreference)) {
return;
}
final GearPreference gearPreference = (GearPreference) preference;
final Optional<DreamInfo> info = getActiveDreamInfo();
if (!info.isPresent() || info.get().settingsComponentName == null) { if (!info.isPresent() || info.get().settingsComponentName == null) {
gearPreference.setOnGearClickListener(null); gearPreference.setOnGearClickListener(null);
return; return;
@@ -70,9 +67,9 @@ public class CurrentDreamPreferenceController extends AbstractPreferenceControll
} }
private void launchScreenSaverSettings() { private void launchScreenSaverSettings() {
Optional<DreamInfo> info = getActiveDreamInfo(); final Optional<DreamInfo> info = getActiveDreamInfo();
if (!info.isPresent()) return; if (!info.isPresent()) return;
mBackend.launchSettings(info.get()); mBackend.launchSettings(mContext, info.get());
} }
private Optional<DreamInfo> getActiveDreamInfo() { private Optional<DreamInfo> getActiveDreamInfo() {

View File

@@ -132,7 +132,6 @@ public class DreamSettings extends DashboardFragment {
private static List<AbstractPreferenceController> buildPreferenceControllers(Context context) { private static List<AbstractPreferenceController> buildPreferenceControllers(Context context) {
List<AbstractPreferenceController> controllers = new ArrayList<>(); List<AbstractPreferenceController> controllers = new ArrayList<>();
controllers.add(new CurrentDreamPreferenceController(context));
controllers.add(new WhenToDreamPreferenceController(context)); controllers.add(new WhenToDreamPreferenceController(context));
controllers.add(new StartNowPreferenceController(context)); controllers.add(new StartNowPreferenceController(context));
return controllers; return controllers;

View File

@@ -56,7 +56,7 @@ public class CurrentDreamPreferenceControllerTest {
public void setup() { public void setup() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mController = new CurrentDreamPreferenceController(mContext); mController = new CurrentDreamPreferenceController(mContext, "test");
ReflectionHelpers.setField(mController, "mBackend", mBackend); ReflectionHelpers.setField(mController, "mBackend", mBackend);
} }