import 'package:flutter/material.dart';
import 'package:alphyn_sdk/alphyn_sdk.dart';
class SecurityScreen extends StatefulWidget {
_SecurityScreenState createState() => _SecurityScreenState();
class _SecurityScreenState extends State<SecurityScreen> {
bool _isInitialized = false;
List<String> _scanResults = [];
List<AlphynCallbackResult> _securityEvents = [];
StreamSubscription<AlphynCallbackResult>? _eventSubscription;
_setupSecurityListener();
_eventSubscription?.cancel();
Future<void> _initializeSdk() async {
// Check initialization status (SDK is initialized natively)
final initialized = await AlphynSdk.isInitialized();
if (initialized == true) {
// Load device information
print('SDK check failed: $e');
void _setupSecurityListener() {
// Subscribe to security events stream
_eventSubscription = AlphynSdk.securityEvents().listen(
_securityEvents.insert(0, event);
if (_securityEvents.length > 50) {
_securityEvents = _securityEvents.take(50).toList();
print('Security events error: $error');
Future<void> _loadDeviceInfo() async {
final deviceId = await AlphynSdk.getDeviceId();
final appHash = await AlphynSdk.getAppHash();
Future<void> _performScan() async {
final scanResult = await AlphynSdk.getScanResult();
// getRejectReasons() returns a newline-separated string; split it into a list
final rejectReasonsRaw = await AlphynSdk.getRejectReasons();
final rejectReasons = rejectReasonsRaw.split('\n').where((line) => line.trim().isNotEmpty).toList();
if (scanResult != null && scanResult.isNotEmpty) {
_scanResults.add(scanResult);
if (rejectReasons.isNotEmpty) {
_scanResults.addAll(rejectReasons);
Future<void> _verifyTestAction() async {
// signAction signs with an enrolled user's hardware key: enrollForMfa(userId) must have
// run once on this device first. See https://docs.byteria.dev/mfa/
final result = await AlphynSdk.signAction(
actionLabel: 'test_action',
'timestamp': DateTime.now().toIso8601String(),
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Action verified! Token: ${result.token}')),
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Verification failed: ${result.errorMessage}')),
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Error: $e')),
Widget build(BuildContext context) {
appBar: AppBar(title: Text('Security Dashboard')),
padding: EdgeInsets.all(16),
crossAxisAlignment: CrossAxisAlignment.start,
Text('Device ID: $_deviceId', style: TextStyle(fontWeight: FontWeight.bold)),
Text('App Hash: $_appHash', style: TextStyle(fontWeight: FontWeight.bold)),
Text('Scan Results:', style: TextStyle(fontWeight: FontWeight.bold)),
..._scanResults.map((result) => Padding(
padding: EdgeInsets.only(left: 16, top: 4),
onPressed: _verifyTestAction,
child: Text('Verify Test Action'),
Text('Security Events (${_securityEvents.length}):', style: TextStyle(fontWeight: FontWeight.bold)),
..._securityEvents.take(10).map((event) => Padding(
padding: EdgeInsets.only(left: 16, top: 4),
child: Text('${event.originalEventType.name}: ${event.message}'),
: Center(child: CircularProgressIndicator()),