diff --git a/flutter/lib/common/widgets/dialog.dart b/flutter/lib/common/widgets/dialog.dart index 2e60304be..9f4eb1427 100644 --- a/flutter/lib/common/widgets/dialog.dart +++ b/flutter/lib/common/widgets/dialog.dart @@ -943,16 +943,20 @@ showSetOSPassword( SessionID sessionId, bool login, OverlayDialogManager dialogManager, + String? osPassword, + Function()? closeCallback, ) async { final controller = TextEditingController(); - var password = - await bind.sessionGetOption(sessionId: sessionId, arg: 'os-password') ?? - ''; + osPassword ??= await bind.sessionGetOption(sessionId: sessionId, arg: 'os-password') ?? ''; var autoLogin = await bind.sessionGetOption(sessionId: sessionId, arg: 'auto-login') != ''; - controller.text = password; + controller.text = osPassword; dialogManager.show((setState, close, context) { + closeWithCallback([dynamic]) { + close(); + if (closeCallback != null) closeCallback(); + } submit() { var text = controller.text.trim(); bind.sessionPeerOption( @@ -964,7 +968,7 @@ showSetOSPassword( if (text != '' && login) { bind.sessionInputOsPassword(sessionId: sessionId, value: text); } - close(); + closeWithCallback(); } return CustomAlertDialog( @@ -998,7 +1002,7 @@ showSetOSPassword( dialogButton( "Cancel", icon: Icon(Icons.close_rounded), - onPressed: close, + onPressed: closeWithCallback, isOutline: true, ), dialogButton( @@ -1008,7 +1012,7 @@ showSetOSPassword( ), ], onSubmit: submit, - onCancel: close, + onCancel: closeWithCallback, ); }); } diff --git a/flutter/lib/common/widgets/toolbar.dart b/flutter/lib/common/widgets/toolbar.dart index 98621a87e..4cf6fd3ea 100644 --- a/flutter/lib/common/widgets/toolbar.dart +++ b/flutter/lib/common/widgets/toolbar.dart @@ -11,6 +11,8 @@ import 'package:flutter_hbb/models/model.dart'; import 'package:flutter_hbb/models/platform_model.dart'; import 'package:get/get.dart'; +bool isEditOsPassword = false; + class TTextMenu { final Widget child; final VoidCallback onPressed; @@ -44,6 +46,28 @@ class TToggleMenu { {required this.child, required this.value, required this.onChanged}); } +handleOsPasswordEditIcon( + SessionID sessionId, OverlayDialogManager dialogManager) { + isEditOsPassword = true; + showSetOSPassword(sessionId, false, dialogManager, null, () => isEditOsPassword = false); +} + +handleOsPasswordAction( + SessionID sessionId, OverlayDialogManager dialogManager) async { + if (isEditOsPassword) { + isEditOsPassword = false; + return; + } + final password = + await bind.sessionGetOption(sessionId: sessionId, arg: 'os-password') ?? + ''; + if (password.isEmpty) { + showSetOSPassword(sessionId, true, dialogManager, password, () => isEditOsPassword = false); + } else { + bind.sessionInputOsPassword(sessionId: sessionId, value: password); + } +} + List toolbarControls(BuildContext context, String id, FFI ffi) { final ffiModel = ffi.ffiModel; final pi = ffiModel.pi; @@ -63,17 +87,26 @@ List toolbarControls(BuildContext context, String id, FFI ffi) { // osAccount / osPassword v.add( TTextMenu( - child: Row(children: [ - Text(translate(pi.is_headless ? 'OS Account' : 'OS Password')), - Offstage( - offstage: isDesktop, - child: - Icon(Icons.edit, color: MyTheme.accent).marginOnly(left: 12)) - ]), - trailingIcon: Transform.scale(scale: 0.8, child: Icon(Icons.edit)), - onPressed: () => pi.is_headless - ? showSetOSAccount(sessionId, ffi.dialogManager) - : showSetOSPassword(sessionId, false, ffi.dialogManager)), + child: Row(children: [ + Text(translate(pi.is_headless ? 'OS Account' : 'OS Password')), + Offstage( + offstage: isDesktop, + child: Icon(Icons.edit, color: MyTheme.accent).marginOnly(left: 12), + ) + ]), + trailingIcon: Transform.scale( + scale: 0.8, + child: InkWell( + onTap: () => pi.is_headless + ? showSetOSAccount(sessionId, ffi.dialogManager) + : handleOsPasswordEditIcon(sessionId, ffi.dialogManager), + child: Icon(Icons.edit), + ), + ), + onPressed: () => pi.is_headless + ? showSetOSAccount(sessionId, ffi.dialogManager) + : handleOsPasswordAction(sessionId, ffi.dialogManager), + ), ); // paste if (isMobile && perms['keyboard'] != false && perms['clipboard'] != false) {