126 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Dart
		
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Dart
		
	
	
	
| import 'package:flutter/material.dart';
 | |
| 
 | |
| import 'package:extera_next/generated/l10n/l10n.dart';
 | |
| import 'package:matrix/matrix.dart';
 | |
| 
 | |
| import 'package:extera_next/config/setting_keys.dart';
 | |
| import 'package:extera_next/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart';
 | |
| import 'package:extera_next/widgets/adaptive_dialogs/show_text_input_dialog.dart';
 | |
| import 'package:extera_next/widgets/app_lock.dart';
 | |
| import 'package:extera_next/widgets/future_loading_dialog.dart';
 | |
| import 'package:extera_next/widgets/matrix.dart';
 | |
| import '../bootstrap/bootstrap_dialog.dart';
 | |
| import 'settings_security_view.dart';
 | |
| 
 | |
| class SettingsSecurity extends StatefulWidget {
 | |
|   const SettingsSecurity({super.key});
 | |
| 
 | |
|   @override
 | |
|   SettingsSecurityController createState() => SettingsSecurityController();
 | |
| }
 | |
| 
 | |
| class SettingsSecurityController extends State<SettingsSecurity> {
 | |
|   void setAppLockAction() async {
 | |
|     if (AppLock.of(context).isActive) {
 | |
|       AppLock.of(context).showLockScreen();
 | |
|     }
 | |
|     final newLock = await showTextInputDialog(
 | |
|       useRootNavigator: false,
 | |
|       context: context,
 | |
|       title: L10n.of(context).pleaseChooseAPasscode,
 | |
|       message: L10n.of(context).pleaseEnter4Digits,
 | |
|       cancelLabel: L10n.of(context).cancel,
 | |
|       validator: (text) {
 | |
|         if (text.isEmpty || (text.length == 4 && int.tryParse(text)! >= 0)) {
 | |
|           return null;
 | |
|         }
 | |
|         return L10n.of(context).pleaseEnter4Digits;
 | |
|       },
 | |
|       keyboardType: TextInputType.number,
 | |
|       obscureText: true,
 | |
|       maxLines: 1,
 | |
|       minLines: 1,
 | |
|       maxLength: 4,
 | |
|     );
 | |
|     if (newLock != null) {
 | |
|       await AppLock.of(context).changePincode(newLock);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   void deleteAccountAction() async {
 | |
|     if (await showOkCancelAlertDialog(
 | |
|           useRootNavigator: false,
 | |
|           context: context,
 | |
|           title: L10n.of(context).warning,
 | |
|           message: L10n.of(context).deactivateAccountWarning,
 | |
|           okLabel: L10n.of(context).ok,
 | |
|           cancelLabel: L10n.of(context).cancel,
 | |
|           isDestructive: true,
 | |
|         ) ==
 | |
|         OkCancelResult.cancel) {
 | |
|       return;
 | |
|     }
 | |
|     final supposedMxid = Matrix.of(context).client.userID!;
 | |
|     final mxid = await showTextInputDialog(
 | |
|       useRootNavigator: false,
 | |
|       context: context,
 | |
|       title: L10n.of(context).confirmMatrixId,
 | |
|       validator: (text) => text == supposedMxid
 | |
|           ? null
 | |
|           : L10n.of(context).supposedMxid(supposedMxid),
 | |
|       isDestructive: true,
 | |
|       okLabel: L10n.of(context).delete,
 | |
|       cancelLabel: L10n.of(context).cancel,
 | |
|     );
 | |
|     if (mxid == null || mxid.isEmpty || mxid != supposedMxid) {
 | |
|       return;
 | |
|     }
 | |
|     final input = await showTextInputDialog(
 | |
|       useRootNavigator: false,
 | |
|       context: context,
 | |
|       title: L10n.of(context).pleaseEnterYourPassword,
 | |
|       okLabel: L10n.of(context).ok,
 | |
|       cancelLabel: L10n.of(context).cancel,
 | |
|       isDestructive: true,
 | |
|       obscureText: true,
 | |
|       keyboardType: TextInputType.visiblePassword,
 | |
|       hintText: L10n.of(context).password,
 | |
|       minLines: 1,
 | |
|       maxLines: 1,
 | |
|     );
 | |
|     if (input == null) return;
 | |
|     await showFutureLoadingDialog(
 | |
|       context: context,
 | |
|       future: () => Matrix.of(context).client.deactivateAccount(
 | |
|             auth: AuthenticationPassword(
 | |
|               password: input,
 | |
|               identifier: AuthenticationUserIdentifier(
 | |
|                 user: Matrix.of(context).client.userID!,
 | |
|               ),
 | |
|             ),
 | |
|           ),
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   void showBootstrapDialog(BuildContext context) async {
 | |
|     await BootstrapDialog(
 | |
|       client: Matrix.of(context).client,
 | |
|     ).show(context);
 | |
|   }
 | |
| 
 | |
|   Future<void> dehydrateAction() => Matrix.of(context).dehydrateAction(context);
 | |
| 
 | |
|   void changeShareKeysWith(ShareKeysWith? shareKeysWith) async {
 | |
|     if (shareKeysWith == null) return;
 | |
|     AppSettings.shareKeysWith.setItem(
 | |
|       Matrix.of(context).store,
 | |
|       shareKeysWith.name,
 | |
|     );
 | |
|     Matrix.of(context).client.shareKeysWith = shareKeysWith;
 | |
|     setState(() {});
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context) => SettingsSecurityView(this);
 | |
| }
 |