mirror of
https://github.com/Yubico/yubioath-flutter.git
synced 2024-12-24 10:42:47 +03:00
split currentDeviceProvider to desktop and android
This commit is contained in:
parent
972fad795e
commit
eff800181c
@ -43,5 +43,6 @@ Future<List<Override>> initializeAndGetOverrides() async {
|
|||||||
credentialListProvider.overrideWithProvider(androidCredentialListProvider),
|
credentialListProvider.overrideWithProvider(androidCredentialListProvider),
|
||||||
currentAppProvider.overrideWithProvider(androidSubPageProvider),
|
currentAppProvider.overrideWithProvider(androidSubPageProvider),
|
||||||
managementStateProvider.overrideWithProvider(androidManagementState),
|
managementStateProvider.overrideWithProvider(androidManagementState),
|
||||||
|
currentDeviceProvider.overrideWithProvider(androidCurrentDeviceProvider)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -48,3 +48,28 @@ class _AndroidAttachedDevicesNotifier extends AttachedDevicesNotifier {
|
|||||||
|
|
||||||
final androidDeviceDataProvider =
|
final androidDeviceDataProvider =
|
||||||
Provider<YubiKeyData?>((ref) => ref.watch(androidYubikeyProvider));
|
Provider<YubiKeyData?>((ref) => ref.watch(androidYubikeyProvider));
|
||||||
|
|
||||||
|
final androidCurrentDeviceProvider =
|
||||||
|
StateNotifierProvider<CurrentDeviceNotifier, DeviceNode?>((ref) {
|
||||||
|
final provider = _AndroidCurrentDeviceNotifier();
|
||||||
|
ref.listen(attachedDevicesProvider, provider._updateAttachedDevices);
|
||||||
|
return provider;
|
||||||
|
});
|
||||||
|
|
||||||
|
class _AndroidCurrentDeviceNotifier extends CurrentDeviceNotifier {
|
||||||
|
_AndroidCurrentDeviceNotifier() : super(null);
|
||||||
|
|
||||||
|
_updateAttachedDevices(
|
||||||
|
List<DeviceNode>? previous, List<DeviceNode?> devices) {
|
||||||
|
if (devices.isNotEmpty) {
|
||||||
|
state = devices.first;
|
||||||
|
} else {
|
||||||
|
state = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
setCurrentDevice(DeviceNode device) {
|
||||||
|
state = device;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -73,51 +73,14 @@ final currentDeviceDataProvider = Provider<YubiKeyData?>(
|
|||||||
(ref) => throw UnimplementedError(),
|
(ref) => throw UnimplementedError(),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Override with platform implementation
|
||||||
final currentDeviceProvider =
|
final currentDeviceProvider =
|
||||||
StateNotifierProvider<CurrentDeviceNotifier, DeviceNode?>((ref) {
|
StateNotifierProvider<CurrentDeviceNotifier, DeviceNode?>(
|
||||||
final provider = CurrentDeviceNotifier(ref.watch(prefProvider));
|
(ref) => throw UnimplementedError());
|
||||||
ref.listen(attachedDevicesProvider, provider._updateAttachedDevices);
|
|
||||||
return provider;
|
|
||||||
});
|
|
||||||
|
|
||||||
class CurrentDeviceNotifier extends StateNotifier<DeviceNode?> {
|
abstract class CurrentDeviceNotifier extends StateNotifier<DeviceNode?> {
|
||||||
static const String _lastDevice = 'APP_STATE_LAST_DEVICE';
|
CurrentDeviceNotifier(DeviceNode? state) : super(state);
|
||||||
final SharedPreferences _prefs;
|
setCurrentDevice(DeviceNode device);
|
||||||
CurrentDeviceNotifier(this._prefs) : super(null);
|
|
||||||
|
|
||||||
_updateAttachedDevices(List<DeviceNode>? previous, List<DeviceNode> devices) {
|
|
||||||
if (!devices.contains(state)) {
|
|
||||||
final lastDevice = _prefs.getString(_lastDevice) ?? '';
|
|
||||||
try {
|
|
||||||
state = devices.firstWhere(
|
|
||||||
(dev) => dev.when(
|
|
||||||
usbYubiKey: (path, name, pid, info) =>
|
|
||||||
lastDevice == 'serial:${info?.serial}',
|
|
||||||
nfcReader: (path, name) => lastDevice == 'name:$name',
|
|
||||||
), orElse: () {
|
|
||||||
var usbDevices = devices.whereType<UsbYubiKeyNode>();
|
|
||||||
return usbDevices.isNotEmpty ? usbDevices.first : devices.first;
|
|
||||||
});
|
|
||||||
} on StateError {
|
|
||||||
state = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
setCurrentDevice(DeviceNode device) {
|
|
||||||
state = device;
|
|
||||||
device.when(
|
|
||||||
usbYubiKey: (path, name, pid, info) {
|
|
||||||
final serial = info?.serial;
|
|
||||||
if (serial != null) {
|
|
||||||
_prefs.setString(_lastDevice, 'serial:$serial');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
nfcReader: (path, name) {
|
|
||||||
_prefs.setString(_lastDevice, 'name:$name');
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final currentAppProvider =
|
final currentAppProvider =
|
||||||
|
@ -100,5 +100,6 @@ Future<List<Override>> initializeAndGetOverrides(
|
|||||||
qrScannerProvider.overrideWithProvider(desktopQrScannerProvider),
|
qrScannerProvider.overrideWithProvider(desktopQrScannerProvider),
|
||||||
managementStateProvider.overrideWithProvider(desktopManagementState),
|
managementStateProvider.overrideWithProvider(desktopManagementState),
|
||||||
fidoStateProvider.overrideWithProvider(desktopFidoState),
|
fidoStateProvider.overrideWithProvider(desktopFidoState),
|
||||||
|
currentDeviceProvider.overrideWithProvider(desktopCurrentDeviceProvider)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,10 @@ import 'dart:io';
|
|||||||
|
|
||||||
import 'package:logging/logging.dart';
|
import 'package:logging/logging.dart';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
import 'package:window_manager/window_manager.dart';
|
import 'package:window_manager/window_manager.dart';
|
||||||
|
|
||||||
|
import '../app/state.dart';
|
||||||
import '../core/state.dart';
|
import '../core/state.dart';
|
||||||
import '../app/models.dart';
|
import '../app/models.dart';
|
||||||
import 'models.dart';
|
import 'models.dart';
|
||||||
@ -113,3 +115,49 @@ class _WindowStateNotifier extends StateNotifier<WindowState>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final desktopCurrentDeviceProvider =
|
||||||
|
StateNotifierProvider<CurrentDeviceNotifier, DeviceNode?>((ref) {
|
||||||
|
final provider = _DesktopCurrentDeviceNotifier(ref.watch(prefProvider));
|
||||||
|
ref.listen(attachedDevicesProvider, provider._updateAttachedDevices);
|
||||||
|
return provider;
|
||||||
|
});
|
||||||
|
|
||||||
|
class _DesktopCurrentDeviceNotifier extends CurrentDeviceNotifier {
|
||||||
|
static const String _lastDevice = 'APP_STATE_LAST_DEVICE';
|
||||||
|
final SharedPreferences _prefs;
|
||||||
|
_DesktopCurrentDeviceNotifier(this._prefs) : super(null);
|
||||||
|
|
||||||
|
_updateAttachedDevices(List<DeviceNode>? previous, List<DeviceNode> devices) {
|
||||||
|
if (!devices.contains(state)) {
|
||||||
|
final lastDevice = _prefs.getString(_lastDevice) ?? '';
|
||||||
|
try {
|
||||||
|
state = devices.firstWhere(
|
||||||
|
(dev) => dev.when(
|
||||||
|
usbYubiKey: (path, name, pid, info) =>
|
||||||
|
lastDevice == 'serial:${info?.serial}',
|
||||||
|
nfcReader: (path, name) => lastDevice == 'name:$name',
|
||||||
|
),
|
||||||
|
orElse: () => devices.whereType<UsbYubiKeyNode>().first);
|
||||||
|
} on StateError {
|
||||||
|
state = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
setCurrentDevice(DeviceNode device) {
|
||||||
|
state = device;
|
||||||
|
device.when(
|
||||||
|
usbYubiKey: (path, name, pid, info) {
|
||||||
|
final serial = info?.serial;
|
||||||
|
if (serial != null) {
|
||||||
|
_prefs.setString(_lastDevice, 'serial:$serial');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
nfcReader: (path, name) {
|
||||||
|
_prefs.setString(_lastDevice, 'name:$name');
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user