secure_guard 0.2.0
secure_guard: ^0.2.0 copied to clipboard
Blocks sensitive screens while an audio or video call, a screen recording or a remote control session is active on the device.
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:secure_guard/secure_guard.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await SecureGuard.instance.start(
const SecureGuardConfig(
allowedAccessibilityServices: {'com.google.android.marvin.talkback'},
),
);
runApp(const ExampleApp());
}
class ExampleApp extends StatelessWidget {
const ExampleApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
builder: (context, child) => SecureGuardOverlay(
blockedBuilder: (context, state) => BlockedScreen(state: state),
child: child!,
),
home: const HomePage(),
);
}
}
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('secure_guard')),
body: StreamBuilder<SecureGuardState>(
stream: SecureGuard.instance.states,
initialData: SecureGuard.instance.value,
builder: (context, snapshot) {
final state = snapshot.data ?? const SecureGuardState();
return Center(
child: Text(
state.isBlocked
? 'Threats: ${state.threats.map((t) => t.name).join(', ')}\n'
'Sources: ${state.sources.join(', ')}'
: 'Device is clean',
textAlign: TextAlign.center,
),
);
},
),
);
}
}
class BlockedScreen extends StatelessWidget {
const BlockedScreen({required this.state, super.key});
final SecureGuardState state;
@override
Widget build(BuildContext context) {
return ColoredBox(
color: Colors.black,
child: Center(
child: Padding(
padding: const EdgeInsets.all(32),
child: Text(
'App is locked while ${state.threats.map((t) => t.name).join(', ')} '
'is active.',
style: const TextStyle(color: Colors.white, fontSize: 18),
textAlign: TextAlign.center,
),
),
),
);
}
}