This commit is contained in:
Adam Velebil 2024-02-05 17:18:14 +01:00
commit 02a3bc3a57
No known key found for this signature in database
GPG Key ID: C9B1E4A3CBBD2E10
5 changed files with 43 additions and 47 deletions

View File

@ -19,15 +19,14 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../android/app_methods.dart'; import '../../android/app_methods.dart';
import '../../android/qr_scanner/qr_scanner_provider.dart';
import '../../android/state.dart'; import '../../android/state.dart';
import '../../core/state.dart'; import '../../core/state.dart';
import '../../exception/cancellation_exception.dart';
import '../../fido/views/fingerprints_screen.dart'; import '../../fido/views/fingerprints_screen.dart';
import '../../fido/views/passkeys_screen.dart'; import '../../fido/views/passkeys_screen.dart';
import '../../fido/views/webauthn_page.dart'; import '../../fido/views/webauthn_page.dart';
import '../../management/views/management_screen.dart'; import '../../management/views/management_screen.dart';
import '../../oath/views/oath_screen.dart'; import '../../oath/views/oath_screen.dart';
import '../../oath/views/utils.dart';
import '../../otp/views/otp_screen.dart'; import '../../otp/views/otp_screen.dart';
import '../../piv/views/piv_screen.dart'; import '../../piv/views/piv_screen.dart';
import '../../widgets/custom_icons.dart'; import '../../widgets/custom_icons.dart';
@ -102,22 +101,7 @@ class MainPage extends ConsumerWidget {
icon: const Icon(Icons.person_add_alt_1), icon: const Icon(Icons.person_add_alt_1),
tooltip: l10n.s_add_account, tooltip: l10n.s_add_account,
onPressed: () async { onPressed: () async {
final withContext = ref.read(withContextProvider); await addOathAccount(context, ref);
final qrScanner = ref.read(qrScannerProvider);
if (qrScanner != null) {
try {
final qrData = await qrScanner.scanQr();
await AndroidQrScanner.handleScannedData(
qrData, withContext, qrScanner, l10n);
} on CancellationException catch (_) {
// ignored - user cancelled
return;
}
} else {
// no QR scanner - enter data manually
await AndroidQrScanner.showAccountManualEntryDialog(
withContext, l10n);
}
}, },
), ),
); );

View File

@ -207,6 +207,7 @@ extension on OathCredential {
} }
const String _steamCharTable = '23456789BCDFGHJKMNPQRTVWXY'; const String _steamCharTable = '23456789BCDFGHJKMNPQRTVWXY';
String _formatSteam(String response) { String _formatSteam(String response) {
final offset = int.parse(response.substring(response.length - 1), radix: 16); final offset = int.parse(response.substring(response.length - 1), radix: 16);
var number = var number =
@ -225,6 +226,7 @@ class DesktopCredentialListNotifier extends OathCredentialListNotifier {
final RpcNodeSession _session; final RpcNodeSession _session;
final bool _locked; final bool _locked;
Timer? _timer; Timer? _timer;
DesktopCredentialListNotifier(this._withContext, this._session, this._locked) DesktopCredentialListNotifier(this._withContext, this._session, this._locked)
: super(); : super();

View File

@ -18,18 +18,16 @@ import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../android/qr_scanner/qr_scanner_provider.dart';
import '../../app/message.dart'; import '../../app/message.dart';
import '../../app/models.dart'; import '../../app/models.dart';
import '../../app/state.dart'; import '../../app/state.dart';
import '../../app/views/action_list.dart'; import '../../app/views/action_list.dart';
import '../../core/state.dart';
import '../features.dart' as features; import '../features.dart' as features;
import '../icon_provider/icon_pack_dialog.dart'; import '../icon_provider/icon_pack_dialog.dart';
import '../keys.dart' as keys; import '../keys.dart' as keys;
import '../models.dart'; import '../models.dart';
import 'add_account_dialog.dart';
import 'manage_password_dialog.dart'; import 'manage_password_dialog.dart';
import 'utils.dart';
Widget oathBuildActions( Widget oathBuildActions(
BuildContext context, BuildContext context,
@ -58,25 +56,7 @@ Widget oathBuildActions(
onTap: used != null && (capacity == null || capacity > used) onTap: used != null && (capacity == null || capacity > used)
? (context) async { ? (context) async {
Navigator.of(context).popUntil((route) => route.isFirst); Navigator.of(context).popUntil((route) => route.isFirst);
if (isAndroid) { await addOathAccount(context, ref, devicePath, oathState);
final withContext = ref.read(withContextProvider);
final qrScanner = ref.read(qrScannerProvider);
if (qrScanner != null) {
final qrData = await qrScanner.scanQr();
await AndroidQrScanner.handleScannedData(
qrData, withContext, qrScanner, l10n);
} else {
// no QR scanner - enter data manually
await AndroidQrScanner.showAccountManualEntryDialog(
withContext, l10n);
}
} else {
await showBlurDialog(
context: context,
builder: (context) =>
AddAccountDialog(devicePath, oathState),
);
}
} }
: null), : null),
]), ]),

View File

@ -44,7 +44,6 @@ import 'account_dialog.dart';
import 'account_helper.dart'; import 'account_helper.dart';
import 'account_list.dart'; import 'account_list.dart';
import 'actions.dart'; import 'actions.dart';
import 'add_account_dialog.dart';
import 'key_actions.dart'; import 'key_actions.dart';
import 'unlock_form.dart'; import 'unlock_form.dart';
import 'utils.dart'; import 'utils.dart';
@ -164,12 +163,11 @@ class _UnlockedViewState extends ConsumerState<_UnlockedView> {
ActionChip( ActionChip(
label: Text(l10n.s_add_account), label: Text(l10n.s_add_account),
onPressed: () async { onPressed: () async {
await showBlurDialog( await addOathAccount(
context: context, context,
builder: (context) => AddAccountDialog( ref,
widget.devicePath, widget.devicePath,
widget.oathState, widget.oathState,
),
); );
}, },
avatar: const Icon(Icons.person_add_alt_1_outlined), avatar: const Icon(Icons.person_add_alt_1_outlined),

View File

@ -20,14 +20,19 @@ import 'dart:math';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../android/qr_scanner/qr_scanner_provider.dart';
import '../../app/message.dart'; import '../../app/message.dart';
import '../../app/models.dart'; import '../../app/models.dart';
import '../../app/state.dart'; import '../../app/state.dart';
import '../../core/state.dart';
import '../../desktop/models.dart'; import '../../desktop/models.dart';
import '../../exception/cancellation_exception.dart';
import '../../widgets/utf8_utils.dart'; import '../../widgets/utf8_utils.dart';
import '../keys.dart'; import '../keys.dart';
import '../models.dart'; import '../models.dart';
import 'add_account_dialog.dart';
import 'add_account_page.dart'; import 'add_account_page.dart';
import 'add_multi_account_page.dart'; import 'add_multi_account_page.dart';
@ -146,3 +151,30 @@ Future<String?> handleQrFile(File file, BuildContext context,
return null; return null;
} }
} }
Future<void> addOathAccount(BuildContext context, WidgetRef ref,
[DevicePath? devicePath, OathState? oathState]) async {
if (isAndroid) {
final l10n = AppLocalizations.of(context)!;
final withContext = ref.read(withContextProvider);
final qrScanner = ref.read(qrScannerProvider);
if (qrScanner != null) {
try {
final qrData = await qrScanner.scanQr();
await AndroidQrScanner.handleScannedData(
qrData, withContext, qrScanner, l10n);
} on CancellationException catch (_) {
//ignored - user cancelled
return;
}
} else {
// no QR scanner - enter data manually
await AndroidQrScanner.showAccountManualEntryDialog(withContext, l10n);
}
} else {
await showBlurDialog(
context: context,
builder: (context) => AddAccountDialog(devicePath, oathState),
);
}
}