mirror of
https://github.com/ppy/osu.git
synced 2024-12-13 04:32:57 +08:00
Remove setters, cache CreatePowerStatus() and use a dummy LocalPowerStatus class in test scene
This commit is contained in:
parent
59d13b0dd3
commit
08311abc5e
@ -21,7 +21,6 @@ namespace osu.Android
|
||||
: base(null)
|
||||
{
|
||||
gameActivity = activity;
|
||||
PowerStatus = new AndroidPowerStatus();
|
||||
}
|
||||
|
||||
public override Version AssemblyVersion
|
||||
@ -76,8 +75,12 @@ namespace osu.Android
|
||||
|
||||
protected override UpdateManager CreateUpdateManager() => new SimpleUpdateManager();
|
||||
|
||||
public class AndroidPowerStatus : PowerStatus
|
||||
protected override PowerStatus CreatePowerStatus() => new AndroidPowerStatus();
|
||||
|
||||
private class AndroidPowerStatus : PowerStatus
|
||||
{
|
||||
public override double BatteryCutoff => 0.20;
|
||||
|
||||
public override double ChargeLevel => Battery.ChargeLevel;
|
||||
|
||||
public override bool IsCharging => Battery.PowerSource != BatteryPowerSource.Battery;
|
||||
|
@ -21,7 +21,6 @@ using osu.Game.Updater;
|
||||
using osu.Desktop.Windows;
|
||||
using osu.Framework.Threading;
|
||||
using osu.Game.IO;
|
||||
using osu.Game.Utils;
|
||||
|
||||
namespace osu.Desktop
|
||||
{
|
||||
@ -34,7 +33,6 @@ namespace osu.Desktop
|
||||
: base(args)
|
||||
{
|
||||
noVersionOverlay = args?.Any(a => a == "--no-version-overlay") ?? false;
|
||||
PowerStatus = new DefaultPowerStatus();
|
||||
}
|
||||
|
||||
public override StableStorage GetStorageForStableInstall()
|
||||
|
@ -49,8 +49,8 @@ namespace osu.Game.Tests.Visual.Gameplay
|
||||
[Cached]
|
||||
private readonly VolumeOverlay volumeOverlay;
|
||||
|
||||
[Resolved]
|
||||
private PowerStatus powerStatus { get; set; }
|
||||
[Cached(typeof(PowerStatus))]
|
||||
private readonly LocalPowerStatus powerStatus = new LocalPowerStatus();
|
||||
|
||||
private readonly ChangelogOverlay changelogOverlay;
|
||||
|
||||
@ -292,22 +292,22 @@ namespace osu.Game.Tests.Visual.Gameplay
|
||||
}
|
||||
}
|
||||
|
||||
[TestCase(false, 1.0)] // not charging, full battery --> no warning
|
||||
[TestCase(false, 1.0)] // not charging, above cutoff --> no warning
|
||||
[TestCase(false, 0.2)] // not charging, at cutoff --> warning
|
||||
[TestCase(false, 0.1)] // charging, below cutoff --> warning
|
||||
[TestCase(true, 0.1)] // charging, below cutoff --> no warning
|
||||
public void TestLowBatteryNotification(bool isCharging, double chargeLevel)
|
||||
{
|
||||
AddStep("reset notification lock", () => sessionStatics.GetBindable<bool>(Static.BatteryLowNotificationShownOnce).Value = false);
|
||||
AddStep("reset notification lock", () => sessionStatics.GetBindable<bool>(Static.LowBatteryNotificationShownOnce).Value = false);
|
||||
|
||||
// set charge status and level
|
||||
AddStep("load player", () => resetPlayer(false, () =>
|
||||
{
|
||||
powerStatus.IsCharging = isCharging;
|
||||
powerStatus.ChargeLevel = chargeLevel;
|
||||
powerStatus.SetCharging(isCharging);
|
||||
powerStatus.SetChargeLevel(chargeLevel);
|
||||
}));
|
||||
AddUntilStep("wait for player", () => player?.LoadState == LoadState.Ready);
|
||||
int notificationCount = !isCharging && chargeLevel <= powerStatus.BatteryCutoff ? 1 : 0;
|
||||
AddAssert("check for notification", () => notificationOverlay.UnreadCount.Value == notificationCount);
|
||||
int warning = !isCharging && chargeLevel <= powerStatus.BatteryCutoff ? 1 : 0;
|
||||
AddAssert($"notification {(warning == 1 ? "triggered" : "not triggered")}", () => notificationOverlay.UnreadCount.Value == warning);
|
||||
AddStep("click notification", () =>
|
||||
{
|
||||
var scrollContainer = (OsuScrollContainer)notificationOverlay.Children.Last();
|
||||
@ -380,5 +380,31 @@ namespace osu.Game.Tests.Visual.Gameplay
|
||||
throw new TimeoutException();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Mutable dummy PowerStatus class for <see cref="TestScenePlayerLoader.TestLowBatteryNotification"/>
|
||||
/// </summary>
|
||||
/// <inheritdoc/>
|
||||
private class LocalPowerStatus : PowerStatus
|
||||
{
|
||||
private bool isCharging = true;
|
||||
private double chargeLevel = 1;
|
||||
|
||||
public override double BatteryCutoff => 0.2;
|
||||
|
||||
public override bool IsCharging => isCharging;
|
||||
|
||||
public override double ChargeLevel => chargeLevel;
|
||||
|
||||
public void SetCharging(bool value)
|
||||
{
|
||||
isCharging = value;
|
||||
}
|
||||
|
||||
public void SetChargeLevel(double value)
|
||||
{
|
||||
chargeLevel = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -16,7 +16,7 @@ namespace osu.Game.Configuration
|
||||
{
|
||||
SetDefault(Static.LoginOverlayDisplayed, false);
|
||||
SetDefault(Static.MutedAudioNotificationShownOnce, false);
|
||||
SetDefault(Static.BatteryLowNotificationShownOnce, false);
|
||||
SetDefault(Static.LowBatteryNotificationShownOnce, false);
|
||||
SetDefault(Static.LastHoverSoundPlaybackTime, (double?)null);
|
||||
SetDefault<APISeasonalBackgrounds>(Static.SeasonalBackgrounds, null);
|
||||
}
|
||||
@ -26,7 +26,7 @@ namespace osu.Game.Configuration
|
||||
{
|
||||
LoginOverlayDisplayed,
|
||||
MutedAudioNotificationShownOnce,
|
||||
BatteryLowNotificationShownOnce,
|
||||
LowBatteryNotificationShownOnce,
|
||||
|
||||
/// <summary>
|
||||
/// Info about seasonal backgrounds available fetched from API - see <see cref="APISeasonalBackgrounds"/>.
|
||||
|
@ -694,6 +694,11 @@ namespace osu.Game
|
||||
loadComponentSingleFile(new AccountCreationOverlay(), topMostOverlayContent.Add, true);
|
||||
loadComponentSingleFile(new DialogOverlay(), topMostOverlayContent.Add, true);
|
||||
|
||||
if (CreatePowerStatus() != null)
|
||||
{
|
||||
dependencies.CacheAs(CreatePowerStatus());
|
||||
}
|
||||
|
||||
chatOverlay.State.ValueChanged += state => channelManager.HighPollRate.Value = state.NewValue == Visibility.Visible;
|
||||
|
||||
Add(externalLinkOpener = new ExternalLinkOpener());
|
||||
|
@ -96,7 +96,7 @@ namespace osu.Game
|
||||
|
||||
protected Storage Storage { get; set; }
|
||||
|
||||
protected PowerStatus PowerStatus;
|
||||
protected virtual PowerStatus CreatePowerStatus() => null;
|
||||
|
||||
[Cached]
|
||||
[Cached(typeof(IBindable<RulesetInfo>))]
|
||||
@ -332,8 +332,6 @@ namespace osu.Game
|
||||
dependencies.CacheAs(MusicController);
|
||||
|
||||
Ruleset.BindValueChanged(onRulesetChanged);
|
||||
|
||||
dependencies.CacheAs(PowerStatus);
|
||||
}
|
||||
|
||||
private void onRulesetChanged(ValueChangedEvent<RulesetInfo> r)
|
||||
|
@ -113,7 +113,7 @@ namespace osu.Game.Screens.Play
|
||||
[Resolved]
|
||||
private AudioManager audioManager { get; set; }
|
||||
|
||||
[Resolved]
|
||||
[Resolved(CanBeNull = true)]
|
||||
private PowerStatus powerStatus { get; set; }
|
||||
|
||||
public PlayerLoader(Func<Player> createPlayer)
|
||||
@ -125,7 +125,7 @@ namespace osu.Game.Screens.Play
|
||||
private void load(SessionStatics sessionStatics)
|
||||
{
|
||||
muteWarningShownOnce = sessionStatics.GetBindable<bool>(Static.MutedAudioNotificationShownOnce);
|
||||
batteryWarningShownOnce = sessionStatics.GetBindable<bool>(Static.BatteryLowNotificationShownOnce);
|
||||
batteryWarningShownOnce = sessionStatics.GetBindable<bool>(Static.LowBatteryNotificationShownOnce);
|
||||
|
||||
InternalChild = (content = new LogoTrackingContainer
|
||||
{
|
||||
@ -483,10 +483,11 @@ namespace osu.Game.Screens.Play
|
||||
|
||||
private void showBatteryWarningIfNeeded()
|
||||
{
|
||||
if (powerStatus == null) return;
|
||||
|
||||
if (!batteryWarningShownOnce.Value)
|
||||
{
|
||||
// Checks if the notification has not been shown yet, device is unplugged and if device battery is at or below the cutoff
|
||||
if (!powerStatus.IsCharging && powerStatus.ChargeLevel <= powerStatus.BatteryCutoff)
|
||||
if (powerStatus.IsLowBattery)
|
||||
{
|
||||
notificationOverlay?.Post(new BatteryWarningNotification());
|
||||
batteryWarningShownOnce.Value = true;
|
||||
@ -500,7 +501,7 @@ namespace osu.Game.Screens.Play
|
||||
|
||||
public BatteryWarningNotification()
|
||||
{
|
||||
Text = "Your battery level is low! Charge your device to prevent interruptions.";
|
||||
Text = "Your battery level is low! Charge your device to prevent interruptions during gameplay.";
|
||||
}
|
||||
|
||||
[BackgroundDependencyLoader]
|
||||
|
@ -7,17 +7,11 @@ using osu.Framework.Screens;
|
||||
using osu.Framework.Testing;
|
||||
using osu.Game.Graphics;
|
||||
using osu.Game.Screens.Backgrounds;
|
||||
using osu.Game.Utils;
|
||||
|
||||
namespace osu.Game.Tests
|
||||
{
|
||||
public class OsuTestBrowser : OsuGameBase
|
||||
{
|
||||
public OsuTestBrowser()
|
||||
{
|
||||
PowerStatus = new DefaultPowerStatus();
|
||||
}
|
||||
|
||||
protected override void LoadComplete()
|
||||
{
|
||||
base.LoadComplete();
|
||||
|
@ -3,21 +3,27 @@
|
||||
|
||||
namespace osu.Game.Utils
|
||||
{
|
||||
/// <summary>
|
||||
/// Provides access to the system's power status.
|
||||
/// Currently implemented on iOS and Android only.
|
||||
/// </summary>
|
||||
public abstract class PowerStatus
|
||||
{
|
||||
/// <summary>
|
||||
/// The maximum battery level before a warning notification
|
||||
/// is sent.
|
||||
/// The maximum battery level considered as low, from 0 to 1.
|
||||
/// </summary>
|
||||
public virtual double BatteryCutoff { get; } = 0.2;
|
||||
public virtual double BatteryCutoff { get; } = 0;
|
||||
|
||||
public virtual double ChargeLevel { get; set; }
|
||||
public virtual bool IsCharging { get; set; }
|
||||
}
|
||||
/// <summary>
|
||||
/// The charge level of the battery, from 0 to 1.
|
||||
/// </summary>
|
||||
public virtual double ChargeLevel { get; } = 0;
|
||||
|
||||
public class DefaultPowerStatus : PowerStatus
|
||||
{
|
||||
public override double ChargeLevel { get; set; } = 1;
|
||||
public override bool IsCharging { get; set; } = true;
|
||||
public virtual bool IsCharging { get; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// Returns true if <see cref="IsCharging"/> = false and <see cref="ChargeLevel"/> <= <see cref="BatteryCutoff"/>.
|
||||
/// </summary>
|
||||
public bool IsLowBattery => !IsCharging && ChargeLevel <= BatteryCutoff;
|
||||
}
|
||||
}
|
||||
|
@ -12,20 +12,16 @@ namespace osu.iOS
|
||||
{
|
||||
public class OsuGameIOS : OsuGame
|
||||
{
|
||||
public OsuGameIOS()
|
||||
: base(null)
|
||||
{
|
||||
PowerStatus = new IOSPowerStatus();
|
||||
}
|
||||
public override Version AssemblyVersion => new Version(NSBundle.MainBundle.InfoDictionary["CFBundleVersion"].ToString());
|
||||
|
||||
protected override UpdateManager CreateUpdateManager() => new SimpleUpdateManager();
|
||||
|
||||
public class IOSPowerStatus : PowerStatus
|
||||
protected override PowerStatus CreatePowerStatus() => new IOSPowerStatus();
|
||||
|
||||
private class IOSPowerStatus : PowerStatus
|
||||
{
|
||||
// The low battery alert appears at 20% on iOS
|
||||
// https://github.com/ppy/osu/issues/12239
|
||||
public override double BatteryCutoff => 0.25;
|
||||
|
||||
public override double ChargeLevel => Battery.ChargeLevel;
|
||||
|
||||
public override bool IsCharging => Battery.PowerSource != BatteryPowerSource.Battery;
|
||||
|
Loading…
Reference in New Issue
Block a user