Merge "Add "Hub Mode" settings to mobile settings." into main

This commit is contained in:
William Leshner
2025-01-27 20:28:02 -08:00
committed by Android (Google) Code Review
6 changed files with 110 additions and 25 deletions

View File

@@ -0,0 +1,9 @@
package: "com.android.settings.flags"
container: "system"
flag {
name: "enable_hub_mode_settings_on_mobile"
namespace: "systemui"
description: "This flag controls whether hub mode settings should be enabled on mobile"
bug: "389782624"
}

View File

@@ -715,6 +715,9 @@
<!-- Whether to show communal settings at the top level. --> <!-- Whether to show communal settings at the top level. -->
<bool name="config_show_communal_settings">false</bool> <bool name="config_show_communal_settings">false</bool>
<!-- Whether to show communal settings at the top level on mobile. -->
<bool name="config_show_communal_settings_mobile">false</bool>
<!-- The extra value for battery tip --> <!-- The extra value for battery tip -->
<integer name="config_battery_extra_tip_value">12</integer> <integer name="config_battery_extra_tip_value">12</integer>

View File

@@ -21,6 +21,7 @@ import android.content.Context;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.Utils; import com.android.settings.Utils;
import com.android.settings.core.BasePreferenceController; import com.android.settings.core.BasePreferenceController;
import com.android.settings.flags.Flags;
/** /**
* Controls the top-level Communal settings preference. * Controls the top-level Communal settings preference.
@@ -39,7 +40,14 @@ public class CommunalPreferenceController extends BasePreferenceController {
* Returns whether communal preferences are available. * Returns whether communal preferences are available.
*/ */
public static boolean isAvailable(Context context) { public static boolean isAvailable(Context context) {
return context.getResources().getBoolean(R.bool.config_show_communal_settings) if (context.getResources().getBoolean(R.bool.config_show_communal_settings)) {
&& Utils.canCurrentUserDream(context); return Utils.canCurrentUserDream(context);
}
if (context.getResources().getBoolean(R.bool.config_show_communal_settings_mobile)) {
return Flags.enableHubModeSettingsOnMobile() && Utils.canCurrentUserDream(context);
}
return false;
} }
} }

View File

@@ -16,37 +16,44 @@
package com.android.settings.dream; package com.android.settings.dream;
import android.annotation.StringRes;
import android.content.Context; import android.content.Context;
import androidx.preference.Preference; import androidx.preference.Preference;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.display.AmbientDisplayAlwaysOnPreferenceController; import com.android.settings.display.AmbientDisplayAlwaysOnPreferenceController;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.dream.DreamBackend; import com.android.settingslib.dream.DreamBackend;
public class WhenToDreamPreferenceController extends AbstractPreferenceController implements public class WhenToDreamPreferenceController extends BasePreferenceController implements
PreferenceControllerMixin { PreferenceControllerMixin {
private static final String WHEN_TO_START = "when_to_start"; private static final String DEFAULT_PREF_KEY = "when_to_start";
private final DreamBackend mBackend; private final DreamBackend mBackend;
private final boolean mDreamsDisabledByAmbientModeSuppression; private final boolean mDreamsDisabledByAmbientModeSuppression;
private final boolean mDreamsEnabledOnBattery; private final boolean mDreamsEnabledOnBattery;
WhenToDreamPreferenceController(Context context) { public WhenToDreamPreferenceController(Context context) {
this(context, context.getResources().getBoolean( this(context, DEFAULT_PREF_KEY);
}
public WhenToDreamPreferenceController(Context context, String preferenceKey) {
this(context, preferenceKey, context.getResources().getBoolean(
com.android.internal.R.bool.config_dreamsDisabledByAmbientModeSuppressionConfig), com.android.internal.R.bool.config_dreamsDisabledByAmbientModeSuppressionConfig),
context.getResources().getBoolean( context.getResources().getBoolean(
com.android.internal.R.bool.config_dreamsEnabledOnBattery)); com.android.internal.R.bool.config_dreamsEnabledOnBattery));
} }
@VisibleForTesting @VisibleForTesting
WhenToDreamPreferenceController(Context context, WhenToDreamPreferenceController(
Context context,
String preferenceKey,
boolean dreamsDisabledByAmbientModeSuppression, boolean dreamsDisabledByAmbientModeSuppression,
boolean dreamsEnabledOnBattery) { boolean dreamsEnabledOnBattery) {
super(context); super(context, preferenceKey);
mBackend = DreamBackend.getInstance(context); mBackend = DreamBackend.getInstance(context);
mDreamsDisabledByAmbientModeSuppression = dreamsDisabledByAmbientModeSuppression; mDreamsDisabledByAmbientModeSuppression = dreamsDisabledByAmbientModeSuppression;
@@ -57,23 +64,27 @@ public class WhenToDreamPreferenceController extends AbstractPreferenceControlle
public void updateState(Preference preference) { public void updateState(Preference preference) {
super.updateState(preference); super.updateState(preference);
preference.setSummary(getSummaryResId());
}
@Override
public int getAvailabilityStatus() {
return AVAILABLE;
}
@Override
public CharSequence getSummary() {
return mContext.getString(getSummaryResId());
}
private @StringRes int getSummaryResId() {
if (mDreamsDisabledByAmbientModeSuppression if (mDreamsDisabledByAmbientModeSuppression
&& AmbientDisplayAlwaysOnPreferenceController.isAodSuppressedByBedtime(mContext)) { && AmbientDisplayAlwaysOnPreferenceController.isAodSuppressedByBedtime(mContext)) {
preference.setSummary(R.string.screensaver_settings_when_to_dream_bedtime); return R.string.screensaver_settings_when_to_dream_bedtime;
} else { } else {
final int resId = DreamSettings.getDreamSettingDescriptionResId( final int resId = DreamSettings.getDreamSettingDescriptionResId(
mBackend.getWhenToDreamSetting(), mDreamsEnabledOnBattery); mBackend.getWhenToDreamSetting(), mDreamsEnabledOnBattery);
preference.setSummary(resId); return resId;
} }
} }
@Override
public boolean isAvailable() {
return true;
}
@Override
public String getPreferenceKey() {
return WHEN_TO_START;
}
} }

View File

@@ -16,6 +16,10 @@
package com.android.settings.communal; package com.android.settings.communal;
import static com.android.settings.core.BasePreferenceController.AVAILABLE;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
@@ -25,12 +29,17 @@ import static org.mockito.Mockito.spy;
import android.content.Context; import android.content.Context;
import android.os.UserHandle; import android.os.UserHandle;
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.flags.Flags;
import com.android.settings.testutils.shadow.SettingsShadowResources; import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settings.testutils.shadow.ShadowUserManager; import com.android.settings.testutils.shadow.ShadowUserManager;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner; import org.robolectric.RobolectricTestRunner;
@@ -40,6 +49,9 @@ import org.robolectric.annotation.Config;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = {SettingsShadowResources.class, ShadowUserManager.class}) @Config(shadows = {SettingsShadowResources.class, ShadowUserManager.class})
public class CommunalPreferenceControllerTest { public class CommunalPreferenceControllerTest {
@Rule
public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
private ShadowUserManager mShadowUserManager; private ShadowUserManager mShadowUserManager;
private CommunalPreferenceController mController; private CommunalPreferenceController mController;
@@ -54,27 +66,68 @@ public class CommunalPreferenceControllerTest {
} }
@Test @Test
public void isAvailable_communalEnabled_shouldBeTrueForDockUser() { public void isAvailable_communalEnabled_shouldBeTrueForPrimaryUser() {
setCommunalEnabled(true); setCommunalEnabled(true);
mShadowUserManager.setUserForeground(true); mShadowUserManager.setUserForeground(true);
assertTrue(mController.isAvailable()); assertTrue(mController.isAvailable());
} }
@Test @Test
public void isAvailable_communalEnabled_shouldBeFalseForNonDockUser() { public void isAvailable_communalEnabled_shouldBeFalseForSecondaryUser() {
setCommunalEnabled(true); setCommunalEnabled(true);
mShadowUserManager.setUserForeground(false); mShadowUserManager.setUserForeground(false);
assertFalse(mController.isAvailable()); assertFalse(mController.isAvailable());
} }
@Test @Test
public void isAvailable_communalDisabled_shouldBeFalseForDockUser() { public void isAvailable_communalDisabled_shouldBeFalseForPrimaryUser() {
setCommunalEnabled(false); setCommunalEnabled(false);
mShadowUserManager.setUserForeground(true); mShadowUserManager.setUserForeground(true);
assertFalse(mController.isAvailable()); assertFalse(mController.isAvailable());
} }
@Test
@EnableFlags(Flags.FLAG_ENABLE_HUB_MODE_SETTINGS_ON_MOBILE)
public void isAvailable_communalOnMobileEnabled_shouldBeTrueForPrimaryUser() {
setCommunalEnabled(false);
setCommunalOnMobileEnabled(true);
mShadowUserManager.setUserForeground(true);
assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
}
@Test
@EnableFlags(Flags.FLAG_ENABLE_HUB_MODE_SETTINGS_ON_MOBILE)
public void isAvailable_communalOnMobileEnabled_shouldBeFalseForSecondaryUser() {
setCommunalEnabled(false);
setCommunalOnMobileEnabled(true);
mShadowUserManager.setUserForeground(false);
assertFalse(mController.isAvailable());
}
@Test
@EnableFlags(Flags.FLAG_ENABLE_HUB_MODE_SETTINGS_ON_MOBILE)
public void isAvailable_communalOnMobileDisabled_shouldBeFalseForPrimaryUser() {
setCommunalEnabled(false);
setCommunalOnMobileEnabled(false);
mShadowUserManager.setUserForeground(true);
assertFalse(mController.isAvailable());
}
@Test
@DisableFlags(Flags.FLAG_ENABLE_HUB_MODE_SETTINGS_ON_MOBILE)
public void isAvailable_hubModeSettingsOnMobileFlagDisabled_shouldBeFalseForPrimaryUser() {
setCommunalEnabled(false);
setCommunalOnMobileEnabled(true);
mShadowUserManager.setUserForeground(true);
assertFalse(mController.isAvailable());
}
private void setCommunalEnabled(boolean enabled) { private void setCommunalEnabled(boolean enabled) {
SettingsShadowResources.overrideResource(R.bool.config_show_communal_settings, enabled); SettingsShadowResources.overrideResource(R.bool.config_show_communal_settings, enabled);
} }
private void setCommunalOnMobileEnabled(boolean enabled) {
SettingsShadowResources.overrideResource(
R.bool.config_show_communal_settings_mobile, enabled);
}
} }

View File

@@ -48,6 +48,7 @@ import org.robolectric.util.ReflectionHelpers;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class WhenToDreamPreferenceControllerTest { public class WhenToDreamPreferenceControllerTest {
private static final String TEST_PACKAGE = "com.android.test"; private static final String TEST_PACKAGE = "com.android.test";
private static final String PREF_KEY = "when_to_start";
private WhenToDreamPreferenceController mController; private WhenToDreamPreferenceController mController;
private Context mContext; private Context mContext;
@@ -64,7 +65,7 @@ public class WhenToDreamPreferenceControllerTest {
public void setup() throws Exception { public void setup() throws Exception {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mContext = spy(ApplicationProvider.getApplicationContext()); mContext = spy(ApplicationProvider.getApplicationContext());
mController = new WhenToDreamPreferenceController(mContext, true, true); mController = new WhenToDreamPreferenceController(mContext, PREF_KEY, true, true);
ReflectionHelpers.setField(mController, "mBackend", mBackend); ReflectionHelpers.setField(mController, "mBackend", mBackend);
when(mContext.getSystemService(PowerManager.class)).thenReturn(mPowerManager); when(mContext.getSystemService(PowerManager.class)).thenReturn(mPowerManager);
when(mPowerManager.isAmbientDisplaySuppressedForTokenByApp(anyString(), anyInt())) when(mPowerManager.isAmbientDisplaySuppressedForTokenByApp(anyString(), anyInt()))