refactor: Remove flutter_app_lock package and use own AppLock implementation
This commit is contained in:
parent
90789d9feb
commit
9a808abdc6
7 changed files with 117 additions and 64 deletions
|
|
@ -1,7 +1,6 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:collection/collection.dart';
|
import 'package:collection/collection.dart';
|
||||||
import 'package:flutter_app_lock/flutter_app_lock.dart';
|
|
||||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||||
import 'package:matrix/matrix.dart';
|
import 'package:matrix/matrix.dart';
|
||||||
|
|
||||||
|
|
@ -11,7 +10,6 @@ import 'package:fluffychat/utils/platform_infos.dart';
|
||||||
import 'config/setting_keys.dart';
|
import 'config/setting_keys.dart';
|
||||||
import 'utils/background_push.dart';
|
import 'utils/background_push.dart';
|
||||||
import 'widgets/fluffy_chat_app.dart';
|
import 'widgets/fluffy_chat_app.dart';
|
||||||
import 'widgets/lock_screen.dart';
|
|
||||||
|
|
||||||
void main() async {
|
void main() async {
|
||||||
Logs().i('Welcome to ${AppConfig.applicationName} <3');
|
Logs().i('Welcome to ${AppConfig.applicationName} <3');
|
||||||
|
|
@ -65,18 +63,7 @@ Future<void> startGui(List<Client> clients) async {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start rendering the Flutter app and wrap it in an Applock.
|
runApp(FluffyChatApp(clients: clients, pincode: pin));
|
||||||
// We do this only for mobile applications as we saw routing
|
|
||||||
// problems on other platforms if we wrap it always.
|
|
||||||
runApp(
|
|
||||||
PlatformInfos.isMobile
|
|
||||||
? AppLock(
|
|
||||||
builder: (args) => FluffyChatApp(clients: clients),
|
|
||||||
lockScreen: const LockScreen(),
|
|
||||||
enabled: pin?.isNotEmpty ?? false,
|
|
||||||
)
|
|
||||||
: FluffyChatApp(clients: clients),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Watches the lifecycle changes to start the application when it
|
/// Watches the lifecycle changes to start the application when it
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ import 'dart:typed_data';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:adaptive_dialog/adaptive_dialog.dart';
|
import 'package:adaptive_dialog/adaptive_dialog.dart';
|
||||||
import 'package:flutter_app_lock/flutter_app_lock.dart';
|
|
||||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||||
import 'package:future_loading_dialog/future_loading_dialog.dart';
|
import 'package:future_loading_dialog/future_loading_dialog.dart';
|
||||||
|
|
@ -13,6 +12,7 @@ import 'package:matrix/matrix.dart';
|
||||||
|
|
||||||
import 'package:fluffychat/config/setting_keys.dart';
|
import 'package:fluffychat/config/setting_keys.dart';
|
||||||
import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_file_extension.dart';
|
import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_file_extension.dart';
|
||||||
|
import 'package:fluffychat/widgets/app_lock.dart';
|
||||||
import 'package:fluffychat/widgets/matrix.dart';
|
import 'package:fluffychat/widgets/matrix.dart';
|
||||||
import '../bootstrap/bootstrap_dialog.dart';
|
import '../bootstrap/bootstrap_dialog.dart';
|
||||||
import 'settings_security_view.dart';
|
import 'settings_security_view.dart';
|
||||||
|
|
@ -65,7 +65,7 @@ class SettingsSecurityController extends State<SettingsSecurity> {
|
||||||
final currentLock =
|
final currentLock =
|
||||||
await const FlutterSecureStorage().read(key: SettingKeys.appLockKey);
|
await const FlutterSecureStorage().read(key: SettingKeys.appLockKey);
|
||||||
if (currentLock?.isNotEmpty ?? false) {
|
if (currentLock?.isNotEmpty ?? false) {
|
||||||
await AppLock.of(context)!.showLockScreen();
|
AppLock.of(context).showLockScreen();
|
||||||
}
|
}
|
||||||
final newLock = await showTextInputDialog(
|
final newLock = await showTextInputDialog(
|
||||||
useRootNavigator: false,
|
useRootNavigator: false,
|
||||||
|
|
@ -86,17 +86,12 @@ class SettingsSecurityController extends State<SettingsSecurity> {
|
||||||
obscureText: true,
|
obscureText: true,
|
||||||
maxLines: 1,
|
maxLines: 1,
|
||||||
minLines: 1,
|
minLines: 1,
|
||||||
|
maxLength: 4,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
if (newLock != null) {
|
if (newLock != null) {
|
||||||
await const FlutterSecureStorage()
|
await AppLock.of(context).changePincode(newLock.single);
|
||||||
.write(key: SettingKeys.appLockKey, value: newLock.single);
|
|
||||||
if (newLock.single.isEmpty) {
|
|
||||||
AppLock.of(context)!.disable();
|
|
||||||
} else {
|
|
||||||
AppLock.of(context)!.enable();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
88
lib/widgets/app_lock.dart
Normal file
88
lib/widgets/app_lock.dart
Normal file
|
|
@ -0,0 +1,88 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
import 'package:fluffychat/config/setting_keys.dart';
|
||||||
|
import 'package:fluffychat/config/themes.dart';
|
||||||
|
import 'package:fluffychat/widgets/lock_screen.dart';
|
||||||
|
|
||||||
|
class AppLockWidget extends StatefulWidget {
|
||||||
|
const AppLockWidget({
|
||||||
|
required this.child,
|
||||||
|
required this.pincode,
|
||||||
|
super.key,
|
||||||
|
});
|
||||||
|
|
||||||
|
final String? pincode;
|
||||||
|
final Widget child;
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<AppLockWidget> createState() => AppLock();
|
||||||
|
}
|
||||||
|
|
||||||
|
class AppLock extends State<AppLockWidget> with WidgetsBindingObserver {
|
||||||
|
String? _pincode;
|
||||||
|
bool _isLocked = false;
|
||||||
|
bool get isActive => _pincode != null;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
_pincode = widget.pincode;
|
||||||
|
_isLocked = widget.pincode != null;
|
||||||
|
super.initState();
|
||||||
|
WidgetsBinding.instance.addObserver(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void didChangeAppLifecycleState(AppLifecycleState state) {
|
||||||
|
if (isActive && state == AppLifecycleState.hidden && !_isLocked) {
|
||||||
|
setState(() {
|
||||||
|
_isLocked = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool get isLocked => _isLocked;
|
||||||
|
CrossFadeState get _crossFadeState =>
|
||||||
|
_isLocked ? CrossFadeState.showSecond : CrossFadeState.showFirst;
|
||||||
|
|
||||||
|
Future<void> changePincode(String? pincode) async {
|
||||||
|
await const FlutterSecureStorage().write(
|
||||||
|
key: SettingKeys.appLockKey,
|
||||||
|
value: pincode,
|
||||||
|
);
|
||||||
|
_pincode = pincode;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool unlock(String pincode) {
|
||||||
|
final isCorrect = pincode == _pincode;
|
||||||
|
if (isCorrect) {
|
||||||
|
setState(() {
|
||||||
|
_isLocked = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return isCorrect;
|
||||||
|
}
|
||||||
|
|
||||||
|
void showLockScreen() => setState(() {
|
||||||
|
_isLocked = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
static AppLock of(BuildContext context) => Provider.of<AppLock>(
|
||||||
|
context,
|
||||||
|
listen: false,
|
||||||
|
);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) => Provider<AppLock>(
|
||||||
|
create: (_) => this,
|
||||||
|
child: AnimatedCrossFade(
|
||||||
|
firstChild: widget.child,
|
||||||
|
secondChild: const LockScreen(),
|
||||||
|
crossFadeState: _crossFadeState,
|
||||||
|
duration: FluffyThemes.animationDuration,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
@ -6,6 +6,7 @@ import 'package:matrix/matrix.dart';
|
||||||
|
|
||||||
import 'package:fluffychat/config/routes.dart';
|
import 'package:fluffychat/config/routes.dart';
|
||||||
import 'package:fluffychat/config/themes.dart';
|
import 'package:fluffychat/config/themes.dart';
|
||||||
|
import 'package:fluffychat/widgets/app_lock.dart';
|
||||||
import 'package:fluffychat/widgets/theme_builder.dart';
|
import 'package:fluffychat/widgets/theme_builder.dart';
|
||||||
import '../config/app_config.dart';
|
import '../config/app_config.dart';
|
||||||
import '../utils/custom_scroll_behaviour.dart';
|
import '../utils/custom_scroll_behaviour.dart';
|
||||||
|
|
@ -14,11 +15,13 @@ import 'matrix.dart';
|
||||||
class FluffyChatApp extends StatelessWidget {
|
class FluffyChatApp extends StatelessWidget {
|
||||||
final Widget? testWidget;
|
final Widget? testWidget;
|
||||||
final List<Client> clients;
|
final List<Client> clients;
|
||||||
|
final String? pincode;
|
||||||
|
|
||||||
const FluffyChatApp({
|
const FluffyChatApp({
|
||||||
Key? key,
|
Key? key,
|
||||||
this.testWidget,
|
this.testWidget,
|
||||||
required this.clients,
|
required this.clients,
|
||||||
|
this.pincode,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
/// getInitialLink may rereturn the value multiple times if this view is
|
/// getInitialLink may rereturn the value multiple times if this view is
|
||||||
|
|
@ -43,12 +46,11 @@ class FluffyChatApp extends StatelessWidget {
|
||||||
localizationsDelegates: L10n.localizationsDelegates,
|
localizationsDelegates: L10n.localizationsDelegates,
|
||||||
supportedLocales: L10n.supportedLocales,
|
supportedLocales: L10n.supportedLocales,
|
||||||
routerConfig: router,
|
routerConfig: router,
|
||||||
builder: (context, child) => Navigator(
|
builder: (context, child) => AppLockWidget(
|
||||||
onGenerateRoute: (_) => MaterialPageRoute(
|
pincode: pincode,
|
||||||
builder: (_) => Matrix(
|
child: Matrix(
|
||||||
clients: clients,
|
clients: clients,
|
||||||
child: testWidget ?? child,
|
child: testWidget ?? child,
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -2,14 +2,11 @@ import 'dart:async';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:flutter_app_lock/flutter_app_lock.dart';
|
|
||||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
|
||||||
|
|
||||||
import 'package:fluffychat/config/app_config.dart';
|
import 'package:fluffychat/config/app_config.dart';
|
||||||
import 'package:fluffychat/config/setting_keys.dart';
|
|
||||||
import 'package:fluffychat/config/themes.dart';
|
import 'package:fluffychat/config/themes.dart';
|
||||||
import 'package:fluffychat/utils/error_reporter.dart';
|
import 'package:fluffychat/widgets/app_lock.dart';
|
||||||
import 'package:fluffychat/widgets/theme_builder.dart';
|
import 'package:fluffychat/widgets/theme_builder.dart';
|
||||||
|
|
||||||
class LockScreen extends StatefulWidget {
|
class LockScreen extends StatefulWidget {
|
||||||
|
|
@ -40,25 +37,15 @@ class _LockScreenState extends State<LockScreen> {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final correctPin = int.tryParse(
|
if (AppLock.of(context).unlock(enteredPin.toString())) {
|
||||||
await const FlutterSecureStorage().read(key: SettingKeys.appLockKey) ??
|
setState(() {
|
||||||
'',
|
_inputBlocked = false;
|
||||||
);
|
_errorText = null;
|
||||||
if (correctPin == null) {
|
});
|
||||||
ErrorReporter(
|
_textEditingController.clear();
|
||||||
context,
|
|
||||||
'Lockscreen was displayed but pin was not stored correctly',
|
|
||||||
).onErrorCallback(
|
|
||||||
Exception(),
|
|
||||||
);
|
|
||||||
AppLock.of(context)!.didUnlock();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (correctPin == enteredPin) {
|
|
||||||
AppLock.of(context)!.didUnlock();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setState(() {
|
setState(() {
|
||||||
_errorText = L10n.of(context)!.wrongPinEntered(_coolDownSeconds);
|
_errorText = L10n.of(context)!.wrongPinEntered(_coolDownSeconds);
|
||||||
_inputBlocked = true;
|
_inputBlocked = true;
|
||||||
|
|
@ -102,12 +89,10 @@ class _LockScreenState extends State<LockScreen> {
|
||||||
shrinkWrap: true,
|
shrinkWrap: true,
|
||||||
children: [
|
children: [
|
||||||
Center(
|
Center(
|
||||||
child: _inputBlocked
|
child: Image.asset(
|
||||||
? const CircularProgressIndicator.adaptive()
|
'assets/info-logo.png',
|
||||||
: Image.asset(
|
width: 256,
|
||||||
'assets/info-logo.png',
|
),
|
||||||
width: 256,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
TextField(
|
TextField(
|
||||||
controller: _textEditingController,
|
controller: _textEditingController,
|
||||||
|
|
@ -125,6 +110,11 @@ class _LockScreenState extends State<LockScreen> {
|
||||||
hintText: '****',
|
hintText: '****',
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
if (_inputBlocked)
|
||||||
|
const Padding(
|
||||||
|
padding: EdgeInsets.all(8.0),
|
||||||
|
child: LinearProgressIndicator(),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -438,14 +438,6 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.5.0"
|
version: "1.5.0"
|
||||||
flutter_app_lock:
|
|
||||||
dependency: "direct main"
|
|
||||||
description:
|
|
||||||
name: flutter_app_lock
|
|
||||||
sha256: "98890a2a2bc507b2f85165515189750e134921f8f4022ec10bd223033633a3ba"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "3.0.0"
|
|
||||||
flutter_blurhash:
|
flutter_blurhash:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,6 @@ dependencies:
|
||||||
flutter:
|
flutter:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
flutter_app_badger: ^1.5.0
|
flutter_app_badger: ^1.5.0
|
||||||
flutter_app_lock: ^3.0.0
|
|
||||||
flutter_blurhash: ^0.7.0
|
flutter_blurhash: ^0.7.0
|
||||||
flutter_cache_manager: ^3.3.0
|
flutter_cache_manager: ^3.3.0
|
||||||
flutter_foreground_task: ^6.0.0+1
|
flutter_foreground_task: ^6.0.0+1
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue