Device
How to use the device sensor classes of the bit Butil?
Usage
The device sensor features are spread across a few classes. Inject the ones you need and use them like this:
@inject Bit.Butil.Battery battery
@inject Bit.Butil.NetworkInformation networkInformation
@inject Bit.Butil.WakeLock wakeLock
@inject Bit.Butil.IdleDetector idleDetector
@code {
var status = await battery.GetStatus();
var net = await networkInformation.GetStatus();
}Battery
The Battery class wraps the
Battery Status API.
IsSupported:
Returns whether the Battery Status API is available in the current browser.
GetStatus:
Returns a snapshot of the battery charging state and level (MDN).
IsSupported:
Returns whether the Battery Status API is available in the current browser.
@inject Bit.Butil.Battery battery
<BitButton OnClick="BatterySupported">IsSupported</BitButton>
<div>Is supported: @batterySupported</div>
@code {
private string? batterySupported;
private async Task BatterySupported()
{
batterySupported = (await battery.IsSupported()).ToString();
}
}GetStatus:
Returns a snapshot of the battery charging state and level (MDN).
@inject Bit.Butil.Battery battery
<BitButton OnClick="BatteryStatus">GetStatus</BitButton>
<div>Battery: @batteryStatus</div>
@code {
private string? batteryStatus;
private async Task BatteryStatus()
{
var status = await battery.GetStatus();
batteryStatus = $"level={status.Level:P0}, charging={status.Charging}";
}
}NetworkInformation
The NetworkInformation class wraps the
Network Information API
plus the always-available navigator.onLine flag.
GetStatus:
Returns the online flag, effective connection type, downlink and round-trip-time estimates.
GetStatus:
Returns the online flag, effective connection type, downlink and round-trip-time estimates.
@inject Bit.Butil.NetworkInformation networkInformation
<BitButton OnClick="NetworkStatus">GetStatus</BitButton>
<div>Network: @networkStatus</div>
@code {
private string? networkStatus;
private async Task NetworkStatus()
{
var status = await networkInformation.GetStatus();
networkStatus = $"online={status.Online}, type={status.EffectiveType ?? status.Type ?? "n/a"}, downlink={status.Downlink}, rtt={status.Rtt}";
}
}WakeLock
The WakeLock class wraps the
Screen Wake Lock API,
which prevents the screen from dimming while the app is active.
Request / Release:
Acquires or releases a screen wake lock. RequestPersistent keeps the lock re-acquired automatically when the page becomes visible again.
Request / Release:
Acquires or releases a screen wake lock. RequestPersistent keeps the lock re-acquired automatically when the page becomes visible again.
@inject Bit.Butil.WakeLock wakeLock
<BitButton OnClick="AcquireWakeLock">Request</BitButton>
<BitButton OnClick="ReleaseWakeLock">Release</BitButton>
<BitButton OnClick="AcquirePersistentWakeLock">RequestPersistent</BitButton>
@code {
private IAsyncDisposable? persistentWakeLock;
private async Task AcquireWakeLock()
{
if (await wakeLock.IsSupported() is false) return;
await wakeLock.Request();
}
private async Task ReleaseWakeLock()
{
await wakeLock.Release();
}
private async Task AcquirePersistentWakeLock()
{
persistentWakeLock = await wakeLock.RequestPersistent();
}
}IdleDetector
The IdleDetector class wraps the
Idle Detection API
(Chromium-based browsers, requires permission).
RequestPermission / Start:
Requests the idle-detection permission and starts watching the user/screen idle state until it is stopped.
RequestPermission / Start:
Requests the idle-detection permission and starts watching the user/screen idle state until it is stopped.
@inject Bit.Butil.IdleDetector idleDetector
<BitButton OnClick="RequestIdlePermission">RequestPermission</BitButton>
<BitButton OnClick="StartIdleWatch">Start</BitButton>
@code {
private ButilSubscription? idleSub;
private async Task RequestIdlePermission()
{
if (await idleDetector.IsSupported() is false) return;
var permission = await idleDetector.RequestPermission();
}
private async Task StartIdleWatch()
{
idleSub = await idleDetector.Start(60, state =>
{
var current = $"user={state.UserState}, screen={state.ScreenState}";
InvokeAsync(StateHasChanged);
});
}
}