2016-07-20 06:29:32 +03:00
|
|
|
|
using System;
|
|
|
|
|
using Bit.App.Abstractions;
|
|
|
|
|
using Plugin.Settings.Abstractions;
|
|
|
|
|
using Plugin.Fingerprint.Abstractions;
|
|
|
|
|
using Bit.App.Enums;
|
|
|
|
|
|
|
|
|
|
namespace Bit.App.Services
|
|
|
|
|
{
|
|
|
|
|
public class LockService : ILockService
|
|
|
|
|
{
|
|
|
|
|
private readonly ISettings _settings;
|
|
|
|
|
private readonly IAuthService _authService;
|
|
|
|
|
private readonly IFingerprint _fingerprint;
|
|
|
|
|
|
|
|
|
|
public LockService(
|
|
|
|
|
ISettings settings,
|
|
|
|
|
IAuthService authService,
|
|
|
|
|
IFingerprint fingerprint)
|
|
|
|
|
{
|
|
|
|
|
_settings = settings;
|
|
|
|
|
_authService = authService;
|
|
|
|
|
_fingerprint = fingerprint;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public LockType GetLockType(bool forceLock)
|
|
|
|
|
{
|
|
|
|
|
// Only lock if they are logged in
|
|
|
|
|
if(!_authService.IsAuthenticated)
|
|
|
|
|
{
|
|
|
|
|
return LockType.None;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Are we forcing a lock? (i.e. clicking a button to lock the app manually, immediately)
|
2016-08-06 06:58:31 +03:00
|
|
|
|
if(!forceLock && !_settings.GetValueOrDefault(Constants.Locked, false))
|
2016-07-20 06:29:32 +03:00
|
|
|
|
{
|
2016-07-30 23:39:52 +03:00
|
|
|
|
// Lock seconds tells if they want to lock the app or not
|
|
|
|
|
var lockSeconds = _settings.GetValueOrDefault(Constants.SettingLockSeconds, 60 * 15);
|
|
|
|
|
if(lockSeconds == -1)
|
2016-07-20 06:29:32 +03:00
|
|
|
|
{
|
|
|
|
|
return LockType.None;
|
|
|
|
|
}
|
|
|
|
|
|
2016-08-09 02:00:36 +03:00
|
|
|
|
// Has it been longer than lockSeconds since the last time the app was used?
|
2016-08-02 07:32:57 +03:00
|
|
|
|
var now = DateTime.UtcNow;
|
2016-08-09 02:00:36 +03:00
|
|
|
|
var lastBackground = _settings.GetValueOrDefault(Constants.LastActivityDate, now.AddYears(-1));
|
2016-07-30 23:39:52 +03:00
|
|
|
|
if((now - lastBackground).TotalSeconds < lockSeconds)
|
2016-07-20 06:29:32 +03:00
|
|
|
|
{
|
|
|
|
|
return LockType.None;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// What method are we using to unlock?
|
|
|
|
|
var fingerprintUnlock = _settings.GetValueOrDefault<bool>(Constants.SettingFingerprintUnlockOn);
|
|
|
|
|
var pinUnlock = _settings.GetValueOrDefault<bool>(Constants.SettingPinUnlockOn);
|
|
|
|
|
if(fingerprintUnlock && _fingerprint.IsAvailable)
|
|
|
|
|
{
|
|
|
|
|
return LockType.Fingerprint;
|
|
|
|
|
}
|
|
|
|
|
else if(pinUnlock && !string.IsNullOrWhiteSpace(_authService.PIN))
|
|
|
|
|
{
|
|
|
|
|
return LockType.PIN;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return LockType.Password;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|