refactor: Remove flutter_app_lock package and use own AppLock implementation
parent
90789d9feb
commit
9a808abdc6
@ -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,
|
||||
),
|
||||
);
|
||||
}
|
Loading…
Reference in New Issue