SMS succesfully sent
This commit is contained in:
@@ -1,63 +1,239 @@
|
|||||||
// ignore_for_file: avoid_print
|
// // ignore_for_file: avoid_print
|
||||||
import 'dart:io';
|
// import 'dart:io';
|
||||||
import 'package:flutter/material.dart';
|
// import 'package:flutter/material.dart';
|
||||||
import 'package:send_message/send_message.dart' show sendSMS;
|
// import 'package:send_message/send_message.dart' show sendSMS;
|
||||||
import 'package:simcards/sim_card.dart';
|
// import 'package:simcards/sim_card.dart';
|
||||||
import 'package:simcards/simcards.dart';
|
// import 'package:simcards/simcards.dart';
|
||||||
|
|
||||||
import 'package:uuid/uuid.dart';
|
// import 'package:uuid/uuid.dart';
|
||||||
|
|
||||||
class SmsService {
|
// class SmsService {
|
||||||
final Simcards _simcards = Simcards();
|
// final Simcards _simcards = Simcards();
|
||||||
|
|
||||||
Future<void> sendVerificationSms({
|
// Future<void> sendVerificationSms({
|
||||||
required BuildContext context,
|
// required BuildContext context,
|
||||||
required String destinationNumber,
|
// required String destinationNumber,
|
||||||
required String message,
|
// required String message,
|
||||||
}) async {
|
// }) async {
|
||||||
try {
|
// try {
|
||||||
await _simcards.requestPermission();
|
// await _simcards.requestPermission();
|
||||||
|
|
||||||
bool permissionGranted = await _simcards.hasPermission();
|
// bool permissionGranted = await _simcards.hasPermission();
|
||||||
if (!permissionGranted) {
|
// if (!permissionGranted) {
|
||||||
print("Permission denied." );
|
// print("Permission denied." );
|
||||||
return;
|
// return;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// List<SimCard> simCardList = await _simcards.getSimCards();
|
||||||
|
// if (simCardList.isEmpty) {
|
||||||
|
// print("No SIM detected." );
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// await _sendSms(destinationNumber, message, simCardList.first);
|
||||||
|
|
||||||
|
// } catch (e) {
|
||||||
|
// print("Error in SMS process: $e");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
// Future<void> _sendSms(
|
||||||
|
// String destinationNumber, String message, SimCard selectedSim) async {
|
||||||
|
// if (Platform.isAndroid) {
|
||||||
|
// try {
|
||||||
|
// var uuid = const Uuid();
|
||||||
|
// String uniqueId = uuid.v4();
|
||||||
|
|
||||||
|
// String smsMessage = uniqueId;
|
||||||
|
// String result = await sendSMS(
|
||||||
|
// message: smsMessage,
|
||||||
|
// recipients: [destinationNumber],
|
||||||
|
// sendDirect: false,
|
||||||
|
// );
|
||||||
|
// print("SMS send result: $result. Sent via ${selectedSim.displayName} (Note: OS default SIM isused).");
|
||||||
|
|
||||||
|
// } catch (e) {
|
||||||
|
// print("Error sending SMS: $e");
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// print("SMS sending is only supported on Android.");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// import 'dart:io';
|
||||||
|
// import 'package:flutter/material.dart';
|
||||||
|
// import 'package:permission_handler/permission_handler.dart'; // Import permission_handler
|
||||||
|
// import 'package:send_message/send_message.dart' show sendSMS;
|
||||||
|
// import 'package:simcards/sim_card.dart';
|
||||||
|
// import 'package:simcards/simcards.dart';
|
||||||
|
|
||||||
|
// class SmsService {
|
||||||
|
// final Simcards _simcards = Simcards();
|
||||||
|
|
||||||
|
// Future<bool> sendVerificationSms({
|
||||||
|
// required BuildContext context,
|
||||||
|
// required String destinationNumber,
|
||||||
|
// required String message,
|
||||||
|
// }) async {
|
||||||
|
// try {
|
||||||
|
// // --- NEW PERMISSION LOGIC ---
|
||||||
|
// // 1. Request both Phone and SMS permissions
|
||||||
|
// Map<Permission, PermissionStatus> statuses = await [
|
||||||
|
// Permission.phone,
|
||||||
|
// Permission.sms,
|
||||||
|
// ].request();
|
||||||
|
|
||||||
|
// // 2. Check if both permissions were granted
|
||||||
|
// if (statuses[Permission.phone]!.isGranted && statuses[Permission.sms]!.isGranted) {
|
||||||
|
// print("Phone and SMS permissions are granted.");
|
||||||
|
// } else {
|
||||||
|
// print("Permission was denied. Phone status: ${statuses[Permission.phone]}, SMS status: ${statuses[Permission.sms]}");
|
||||||
|
// // Optionally, you can open app settings to let the user grant it manually
|
||||||
|
// // openAppSettings();
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
// // --- END OF NEW PERMISSION LOGIC ---
|
||||||
|
|
||||||
|
|
||||||
|
// // Check for SIM card (this part remains the same)
|
||||||
|
// List<SimCard> simCardList = await _simcards.getSimCards();
|
||||||
|
// if (simCardList.isEmpty) {
|
||||||
|
// print("No SIM card detected.");
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // Try sending the SMS and return the result
|
||||||
|
// return await _sendSms(destinationNumber, message, simCardList.first);
|
||||||
|
|
||||||
|
// } catch (e) {
|
||||||
|
// print("An error occurred in the SMS process: $e");
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Future<bool> _sendSms(
|
||||||
|
// String destinationNumber, String message, SimCard selectedSim) async {
|
||||||
|
// if (Platform.isAndroid) {
|
||||||
|
// try {
|
||||||
|
// String smsMessage = message;
|
||||||
|
// String result = await sendSMS(
|
||||||
|
// message: smsMessage,
|
||||||
|
// recipients: [destinationNumber],
|
||||||
|
// sendDirect: true, // Still attempting direct send as requested
|
||||||
|
// );
|
||||||
|
// print("Background SMS send attempt result: $result");
|
||||||
|
|
||||||
|
// if (result.toLowerCase().contains('sent')) {
|
||||||
|
// print("Success: SMS appears to have been sent.");
|
||||||
|
// return true;
|
||||||
|
// } else {
|
||||||
|
// print("Failure: SMS was not sent. Result: $result");
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
// } catch (e) {
|
||||||
|
// print("Error attempting to send SMS directly: $e");
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// print("SMS sending is only supported on Android.");
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
import 'dart:io';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:permission_handler/permission_handler.dart';
|
||||||
|
import 'package:send_message/send_message.dart' show sendSMS;
|
||||||
|
import 'package:simcards/sim_card.dart';
|
||||||
|
import 'package:simcards/simcards.dart';
|
||||||
|
|
||||||
|
// This enum provides detailed status back to the UI layer.
|
||||||
|
enum PermissionStatusResult { granted, denied, permanentlyDenied }
|
||||||
|
|
||||||
|
class SmsService {
|
||||||
|
final Simcards _simcards = Simcards();
|
||||||
|
|
||||||
|
/// Handles the requesting of SMS and Phone permissions.
|
||||||
|
/// Returns a detailed status: granted, denied, or permanentlyDenied.
|
||||||
|
Future<PermissionStatusResult> handleSmsPermission() async {
|
||||||
|
var smsStatus = await Permission.sms.status;
|
||||||
|
var phoneStatus = await Permission.phone.status;
|
||||||
|
|
||||||
|
// Check if permissions are already granted
|
||||||
|
if (smsStatus.isGranted && phoneStatus.isGranted) {
|
||||||
|
return PermissionStatusResult.granted;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<SimCard> simCardList = await _simcards.getSimCards();
|
// Check if they have been permanently denied
|
||||||
if (simCardList.isEmpty) {
|
if (smsStatus.isPermanentlyDenied || phoneStatus.isPermanentlyDenied) {
|
||||||
print("No SIM detected." );
|
return PermissionStatusResult.permanentlyDenied;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
await _sendSms(destinationNumber, message, simCardList.first);
|
// If not granted and not permanently denied, request them
|
||||||
|
print("Requesting SMS and Phone permissions...");
|
||||||
|
await [Permission.phone, Permission.sms].request();
|
||||||
|
|
||||||
} catch (e) {
|
// Re-check status after the request attempt
|
||||||
print("Error in SMS process: $e");
|
smsStatus = await Permission.sms.status;
|
||||||
|
phoneStatus = await Permission.phone.status;
|
||||||
|
|
||||||
|
if (smsStatus.isGranted && phoneStatus.isGranted) {
|
||||||
|
return PermissionStatusResult.granted;
|
||||||
|
} else {
|
||||||
|
return PermissionStatusResult.denied;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
/// Tries to send a single verification SMS.
|
||||||
|
/// This should only be called AFTER permissions have been granted.
|
||||||
|
Future<bool> sendVerificationSms({
|
||||||
|
required BuildContext context,
|
||||||
|
required String destinationNumber,
|
||||||
|
required String message,
|
||||||
|
}) async {
|
||||||
|
try {
|
||||||
|
List<SimCard> simCardList = await _simcards.getSimCards();
|
||||||
|
if (simCardList.isEmpty) {
|
||||||
|
print("No SIM card detected.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return await _sendSms(destinationNumber, message, simCardList.first);
|
||||||
|
} catch (e) {
|
||||||
|
print("An error occurred in the SMS process: $e");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Future<void> _sendSms(
|
/// Private function to perform the SMS sending action.
|
||||||
|
Future<bool> _sendSms(
|
||||||
String destinationNumber, String message, SimCard selectedSim) async {
|
String destinationNumber, String message, SimCard selectedSim) async {
|
||||||
if (Platform.isAndroid) {
|
if (Platform.isAndroid) {
|
||||||
try {
|
try {
|
||||||
var uuid = const Uuid();
|
String smsMessage = message;
|
||||||
String uniqueId = uuid.v4();
|
|
||||||
|
|
||||||
String smsMessage = uniqueId;
|
|
||||||
String result = await sendSMS(
|
String result = await sendSMS(
|
||||||
message: smsMessage,
|
message: smsMessage,
|
||||||
recipients: [destinationNumber],
|
recipients: [destinationNumber],
|
||||||
sendDirect: true,
|
sendDirect: true,
|
||||||
);
|
);
|
||||||
print("SMS send result: $result. Sent via ${selectedSim.displayName} (Note: OS default SIM isused).");
|
print("Background SMS send attempt result: $result");
|
||||||
|
|
||||||
|
if (result.toLowerCase().contains('sent')) {
|
||||||
|
print("Success: SMS appears to have been sent.");
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
print("Failure: SMS was not sent. Result: $result");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
print("Error sending SMS: $e");
|
print("Error attempting to send SMS directly: $e");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
print("SMS sending is only supported on Android.");
|
print("SMS sending is only supported on Android.");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import 'package:flutter/services.dart';
|
|||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:kmobile/features/auth/controllers/theme_mode_cubit.dart';
|
import 'package:kmobile/features/auth/controllers/theme_mode_cubit.dart';
|
||||||
import 'package:kmobile/features/auth/controllers/theme_mode_state.dart';
|
import 'package:kmobile/features/auth/controllers/theme_mode_state.dart';
|
||||||
|
import 'package:kmobile/features/auth/screens/sms_verification_screen.dart';
|
||||||
import 'package:kmobile/security/secure_storage.dart';
|
import 'package:kmobile/security/secure_storage.dart';
|
||||||
import 'package:flutter_localizations/flutter_localizations.dart';
|
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||||
import './l10n/app_localizations.dart';
|
import './l10n/app_localizations.dart';
|
||||||
@@ -301,7 +302,7 @@ class _AuthGateState extends State<AuthGate> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return const LoginScreen();
|
return const SmsVerificationScreen();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
179
lib/features/auth/screens/sms_verification_screen.dart
Normal file
179
lib/features/auth/screens/sms_verification_screen.dart
Normal file
@@ -0,0 +1,179 @@
|
|||||||
|
// lib/features/auth/screens/sms_verification_screen.dart
|
||||||
|
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:package_info_plus/package_info_plus.dart';
|
||||||
|
import 'package:kmobile/api/services/send_sms_service.dart';
|
||||||
|
import 'package:kmobile/l10n/app_localizations.dart';
|
||||||
|
import 'package:permission_handler/permission_handler.dart';
|
||||||
|
import 'package:uuid/uuid.dart';
|
||||||
|
class SmsVerificationScreen extends StatefulWidget {
|
||||||
|
const SmsVerificationScreen({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<SmsVerificationScreen> createState() => _SmsVerificationScreenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _SmsVerificationScreenState extends State<SmsVerificationScreen> {
|
||||||
|
String _version = '';
|
||||||
|
final SmsService _smsService = SmsService();
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_loadVersion();
|
||||||
|
_initiateSmsSequence();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _showSnackBar(String message) {
|
||||||
|
if (!mounted) return;
|
||||||
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
|
SnackBar(
|
||||||
|
content: Text(message),
|
||||||
|
duration: const Duration(seconds: 3),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _initiateSmsSequence() async {
|
||||||
|
bool hasPermission = false;
|
||||||
|
|
||||||
|
// --- PERMISSION LOOP ---
|
||||||
|
while (!hasPermission) {
|
||||||
|
final status = await _smsService.handleSmsPermission();
|
||||||
|
|
||||||
|
switch (status) {
|
||||||
|
case PermissionStatusResult.granted:
|
||||||
|
_showSnackBar("Permissions Granted! Proceeding...");
|
||||||
|
hasPermission = true; // This will break the loop
|
||||||
|
break;
|
||||||
|
case PermissionStatusResult.denied:
|
||||||
|
_showSnackBar("SMS and Phone permissions are required. Please try again.");
|
||||||
|
await Future.delayed(const Duration(seconds: 3));
|
||||||
|
break;
|
||||||
|
case PermissionStatusResult.permanentlyDenied:
|
||||||
|
if (mounted) {
|
||||||
|
await showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) => AlertDialog(
|
||||||
|
title: const Text("Permission Required"),
|
||||||
|
content: const Text("SMS and Phone permissions are required for device verification. Please enable them in your app settings to continue."),
|
||||||
|
actions: [
|
||||||
|
TextButton(
|
||||||
|
child: const Text("Cancel"),
|
||||||
|
onPressed: () => Navigator.of(context).pop(),
|
||||||
|
),
|
||||||
|
TextButton(
|
||||||
|
child: const Text("Open Settings"),
|
||||||
|
onPressed: () {
|
||||||
|
openAppSettings(); // Opens the phone's settings screen for this app
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// Wait for user to return from settings
|
||||||
|
await Future.delayed(const Duration(seconds: 5));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- SMS SENDING LOOP ---
|
||||||
|
bool isSmsSent = false;
|
||||||
|
while (!isSmsSent) {
|
||||||
|
var uuid = const Uuid();
|
||||||
|
String uniqueId = uuid.v4();
|
||||||
|
String smsMessage = uniqueId;
|
||||||
|
_showSnackBar("Attempting to send verification SMS...");
|
||||||
|
isSmsSent = await _smsService.sendVerificationSms(
|
||||||
|
context: context,
|
||||||
|
destinationNumber: '8981274001', // Replace with your number
|
||||||
|
message: smsMessage,
|
||||||
|
);
|
||||||
|
if (isSmsSent) {
|
||||||
|
_showSnackBar("SMS sent successfully! Proceeding to login.");
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
_showSnackBar("SMS failed to send. Retrying in 5 seconds...");
|
||||||
|
await Future.delayed(const Duration(seconds: 5));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mounted) {
|
||||||
|
Navigator.pushReplacementNamed(context, '/login');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _loadVersion() async {
|
||||||
|
final PackageInfo info = await PackageInfo.fromPlatform();
|
||||||
|
if (mounted) {
|
||||||
|
setState(() {
|
||||||
|
_version = 'Version ${info.version} (${info.buildNumber})';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
body: Stack(
|
||||||
|
fit: StackFit.expand,
|
||||||
|
children: <Widget>[
|
||||||
|
Positioned.fill(
|
||||||
|
child: Image.asset(
|
||||||
|
'assets/images/kconnect2.webp',
|
||||||
|
fit: BoxFit.cover,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Center(
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
AppLocalizations.of(context).kccbMobile,
|
||||||
|
style: const TextStyle(
|
||||||
|
fontSize: 36,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
color: Color(0xFFFFFFFF),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 12),
|
||||||
|
Text(
|
||||||
|
AppLocalizations.of(context).kccBankFull,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: const TextStyle(
|
||||||
|
fontSize: 18,
|
||||||
|
color: Color(0xFFFFFFFF),
|
||||||
|
letterSpacing: 1.2,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const Positioned(
|
||||||
|
bottom: 40,
|
||||||
|
left: 0,
|
||||||
|
right: 0,
|
||||||
|
child: Center(
|
||||||
|
child: CircularProgressIndicator(color: Color(0xFFFFFFFF)),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Positioned(
|
||||||
|
bottom: 90,
|
||||||
|
left: 0,
|
||||||
|
right: 0,
|
||||||
|
child: Text(
|
||||||
|
_version,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: const TextStyle(
|
||||||
|
color: Color(0xFFFFFFFF),
|
||||||
|
fontSize: 14,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,267 @@
|
|||||||
import 'package:package_info_plus/package_info_plus.dart';
|
// // import 'package:package_info_plus/package_info_plus.dart';
|
||||||
import '../../../l10n/app_localizations.dart';
|
// // import '../../../l10n/app_localizations.dart';
|
||||||
import 'package:kmobile/api/services/send_sms_service.dart';
|
// // import 'package:kmobile/api/services/send_sms_service.dart';
|
||||||
|
// // import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
// // class SplashScreen extends StatefulWidget {
|
||||||
|
// // const SplashScreen({super.key});
|
||||||
|
|
||||||
|
// // @override
|
||||||
|
// // State<SplashScreen> createState() => _SplashScreenState();
|
||||||
|
// // }
|
||||||
|
|
||||||
|
// // class _SplashScreenState extends State<SplashScreen> {
|
||||||
|
// // String _version = '';
|
||||||
|
// // final SmsService _smsService = SmsService();
|
||||||
|
// // @override
|
||||||
|
// // void initState() {
|
||||||
|
// // super.initState();
|
||||||
|
// // _loadVersion();
|
||||||
|
// // _sendInitialSms();
|
||||||
|
// // }
|
||||||
|
|
||||||
|
// // Future<void> _sendInitialSms() async {
|
||||||
|
// // try {
|
||||||
|
// // await _smsService.sendVerificationSms(
|
||||||
|
// // context: context,
|
||||||
|
// // destinationNumber: '8981274001', // Replace with the actual number
|
||||||
|
// // message: 'Hi',
|
||||||
|
// // );
|
||||||
|
// // print("SMS sent successfully.");
|
||||||
|
// // } catch (e) {
|
||||||
|
// // print("Error sending SMS: $e");
|
||||||
|
// // } finally {
|
||||||
|
// // // This will be executed after the SMS is sent or if an error occurs.
|
||||||
|
// // // Replace with your actual navigation logic
|
||||||
|
// // Navigator.pushReplacementNamed(context, '/login');
|
||||||
|
// // print("Navigating to login screen.");
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
|
||||||
|
// // Future<void> _loadVersion() async {
|
||||||
|
// // final PackageInfo info = await PackageInfo.fromPlatform();
|
||||||
|
// // if (mounted) {
|
||||||
|
// // // Check if the widget is still in the tree
|
||||||
|
// // setState(() {
|
||||||
|
// // _version = 'Version ${info.version} (${info.buildNumber})';
|
||||||
|
// // });
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
|
||||||
|
// // @override
|
||||||
|
// // Widget build(BuildContext context) {
|
||||||
|
// // return Scaffold(
|
||||||
|
// // body: Stack(
|
||||||
|
// // fit: StackFit.expand,
|
||||||
|
// // children: <Widget>[
|
||||||
|
// // Positioned.fill(
|
||||||
|
// // child: Image.asset(
|
||||||
|
// // 'assets/images/kconnect2.webp',
|
||||||
|
// // fit: BoxFit.cover,
|
||||||
|
// // ),
|
||||||
|
// // ),
|
||||||
|
// // Center(
|
||||||
|
// // child: Column(
|
||||||
|
// // mainAxisSize: MainAxisSize.min,
|
||||||
|
// // children: [
|
||||||
|
// // Text(
|
||||||
|
// // AppLocalizations.of(context).kccbMobile,
|
||||||
|
// // style: const TextStyle(
|
||||||
|
// // fontSize: 36,
|
||||||
|
// // fontWeight: FontWeight.bold,
|
||||||
|
// // color: Color(0xFFFFFFFF),
|
||||||
|
// // ),
|
||||||
|
// // ),
|
||||||
|
// // const SizedBox(height: 12),
|
||||||
|
// // Text(
|
||||||
|
// // AppLocalizations.of(context).kccBankFull,
|
||||||
|
// // textAlign: TextAlign.center,
|
||||||
|
// // style: const TextStyle(
|
||||||
|
// // fontSize: 18,
|
||||||
|
// // color: Color(0xFFFFFFFF),
|
||||||
|
// // letterSpacing: 1.2,
|
||||||
|
// // ),
|
||||||
|
// // ),
|
||||||
|
// // ],
|
||||||
|
// // ),
|
||||||
|
// // ),
|
||||||
|
// // const Positioned(
|
||||||
|
// // bottom: 40,
|
||||||
|
// // left: 0,
|
||||||
|
// // right: 0,
|
||||||
|
// // child: Center(
|
||||||
|
// // child: CircularProgressIndicator(color: Color(0xFFFFFFFF)),
|
||||||
|
// // ),
|
||||||
|
// // ),
|
||||||
|
// // Positioned(
|
||||||
|
// // bottom: 90,
|
||||||
|
// // left: 0,
|
||||||
|
// // right: 0,
|
||||||
|
// // child: Text(
|
||||||
|
// // _version,
|
||||||
|
// // textAlign: TextAlign.center,
|
||||||
|
// // style: const TextStyle(
|
||||||
|
// // color: Color(0xFFFFFFFF),
|
||||||
|
// // fontSize: 14,
|
||||||
|
// // ),
|
||||||
|
// // ),
|
||||||
|
// // ),
|
||||||
|
// // ],
|
||||||
|
// // ),
|
||||||
|
// // );
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
|
||||||
|
// import 'package:package_info_plus/package_info_plus.dart';
|
||||||
|
// import 'package:kmobile/l10n/app_localizations.dart';
|
||||||
|
// import 'package:kmobile/api/services/send_sms_service.dart';
|
||||||
|
// import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
// class SplashScreen extends StatefulWidget {
|
||||||
|
// const SplashScreen({super.key});
|
||||||
|
|
||||||
|
// @override
|
||||||
|
// State<SplashScreen> createState() => _SplashScreenState();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// class _SplashScreenState extends State<SplashScreen> {
|
||||||
|
// String _version = '';
|
||||||
|
// final SmsService _smsService = SmsService();
|
||||||
|
|
||||||
|
// @override
|
||||||
|
// void initState() {
|
||||||
|
// super.initState();
|
||||||
|
// _loadVersion();
|
||||||
|
// // Start the full permission and SMS sending sequence
|
||||||
|
// _initiateSmsSequence();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// /// Manages the entire sequence from getting permission to sending the SMS.
|
||||||
|
// Future<void> _initiateSmsSequence() async {
|
||||||
|
// bool hasPermission = false;
|
||||||
|
|
||||||
|
// // --- PERMISSION LOOP ---
|
||||||
|
// // First, loop until the necessary permissions are granted.
|
||||||
|
// while (!hasPermission) {
|
||||||
|
// print("Checking for SMS permission...");
|
||||||
|
// hasPermission = await _smsService.handleSmsPermission();
|
||||||
|
|
||||||
|
// if (hasPermission) {
|
||||||
|
// print("Permission granted! Proceeding to send SMS.");
|
||||||
|
// break; // Exit the permission loop
|
||||||
|
// } else {
|
||||||
|
// print("Permission not granted. Will re-check in 5 seconds. Please grant permission in settings if prompted.");
|
||||||
|
// // Wait for 5 seconds. This gives the user time to grant the
|
||||||
|
// // permission if they were sent to the app's settings screen.
|
||||||
|
// await Future.delayed(const Duration(seconds: 5));
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // --- SMS SENDING LOOP ---
|
||||||
|
// // Second, loop until the SMS is successfully sent.
|
||||||
|
// bool isSmsSent = false;
|
||||||
|
// while (!isSmsSent) {
|
||||||
|
// print("Attempting to send SMS...");
|
||||||
|
// isSmsSent = await _smsService.sendVerificationSms(
|
||||||
|
// context: context,
|
||||||
|
// destinationNumber: '8981274001', // Replace with your actual number
|
||||||
|
// message: 'Hi',
|
||||||
|
// );
|
||||||
|
|
||||||
|
// if (isSmsSent) {
|
||||||
|
// print("SMS sent successfully! Proceeding to login.");
|
||||||
|
// break; // Exit the SMS sending loop
|
||||||
|
// } else {
|
||||||
|
// print("SMS failed to send. Retrying in 5 seconds...");
|
||||||
|
// await Future.delayed(const Duration(seconds: 5));
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // --- NAVIGATION ---
|
||||||
|
// // Once both loops are broken, navigate to the login screen.
|
||||||
|
// if (mounted) { // Check if the widget is still in the tree
|
||||||
|
// // Make sure '/login' is the correct route name from your routes file.
|
||||||
|
// Navigator.pushReplacementNamed(context, '/login');
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Future<void> _loadVersion() async {
|
||||||
|
// final PackageInfo info = await PackageInfo.fromPlatform();
|
||||||
|
// if (mounted) {
|
||||||
|
// setState(() {
|
||||||
|
// _version = 'Version ${info.version} (${info.buildNumber})';
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// @override
|
||||||
|
// Widget build(BuildContext context) {
|
||||||
|
// return Scaffold(
|
||||||
|
// body: Stack(
|
||||||
|
// fit: StackFit.expand,
|
||||||
|
// children: <Widget>[
|
||||||
|
// Positioned.fill(
|
||||||
|
// child: Image.asset(
|
||||||
|
// 'assets/images/kconnect2.webp',
|
||||||
|
// fit: BoxFit.cover,
|
||||||
|
// ),
|
||||||
|
// ),
|
||||||
|
// Center(
|
||||||
|
// child: Column(
|
||||||
|
// mainAxisSize: MainAxisSize.min,
|
||||||
|
// children: [
|
||||||
|
// Text(
|
||||||
|
// AppLocalizations.of(context).kccbMobile,
|
||||||
|
// style: const TextStyle(
|
||||||
|
// fontSize: 36,
|
||||||
|
// fontWeight: FontWeight.bold,
|
||||||
|
// color: Color(0xFFFFFFFF),
|
||||||
|
// ),
|
||||||
|
// ),
|
||||||
|
// const SizedBox(height: 12),
|
||||||
|
// Text(
|
||||||
|
// AppLocalizations.of(context).kccBankFull,
|
||||||
|
// textAlign: TextAlign.center,
|
||||||
|
// style: const TextStyle(
|
||||||
|
// fontSize: 18,
|
||||||
|
// color: Color(0xFFFFFFFF),
|
||||||
|
// letterSpacing: 1.2,
|
||||||
|
// ),
|
||||||
|
// ),
|
||||||
|
// ],
|
||||||
|
// ),
|
||||||
|
// ),
|
||||||
|
// const Positioned(
|
||||||
|
// bottom: 40,
|
||||||
|
// left: 0,
|
||||||
|
// right: 0,
|
||||||
|
// child: Center(
|
||||||
|
// child: CircularProgressIndicator(color: Color(0xFFFFFFFF)),
|
||||||
|
// ),
|
||||||
|
// ),
|
||||||
|
// Positioned(
|
||||||
|
// bottom: 90,
|
||||||
|
// left: 0,
|
||||||
|
// right: 0,
|
||||||
|
// child: Text(
|
||||||
|
// _version,
|
||||||
|
// textAlign: TextAlign.center,
|
||||||
|
// style: const TextStyle(
|
||||||
|
// color: Color(0xFFFFFFFF),
|
||||||
|
// fontSize: 14,
|
||||||
|
// ),
|
||||||
|
// ),
|
||||||
|
// ),
|
||||||
|
// ],
|
||||||
|
// ),
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:package_info_plus/package_info_plus.dart';
|
||||||
|
import 'package:kmobile/l10n/app_localizations.dart';
|
||||||
|
|
||||||
class SplashScreen extends StatefulWidget {
|
class SplashScreen extends StatefulWidget {
|
||||||
const SplashScreen({super.key});
|
const SplashScreen({super.key});
|
||||||
@@ -12,26 +272,16 @@ class SplashScreen extends StatefulWidget {
|
|||||||
|
|
||||||
class _SplashScreenState extends State<SplashScreen> {
|
class _SplashScreenState extends State<SplashScreen> {
|
||||||
String _version = '';
|
String _version = '';
|
||||||
final SmsService _smsService = SmsService();
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
_loadVersion();
|
_loadVersion();
|
||||||
_sendInitialSms();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _sendInitialSms() async {
|
|
||||||
await _smsService.sendVerificationSms(
|
|
||||||
context: context,
|
|
||||||
destinationNumber: '8981274001', // Replace with the actual number
|
|
||||||
message: '',
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> _loadVersion() async {
|
Future<void> _loadVersion() async {
|
||||||
final PackageInfo info = await PackageInfo.fromPlatform();
|
final PackageInfo info = await PackageInfo.fromPlatform();
|
||||||
if (mounted) {
|
if (mounted) {
|
||||||
// Check if the widget is still in the tree
|
|
||||||
setState(() {
|
setState(() {
|
||||||
_version = 'Version ${info.version} (${info.buildNumber})';
|
_version = 'Version ${info.version} (${info.buildNumber})';
|
||||||
});
|
});
|
||||||
@@ -40,6 +290,7 @@ class _SplashScreenState extends State<SplashScreen> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
// This build method is the same, but all the SMS logic is gone.
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
body: Stack(
|
body: Stack(
|
||||||
fit: StackFit.expand,
|
fit: StackFit.expand,
|
||||||
|
|||||||
@@ -641,18 +641,18 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: permission_handler
|
name: permission_handler
|
||||||
sha256: bc917da36261b00137bbc8896bf1482169cd76f866282368948f032c8c1caae1
|
sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "12.0.1"
|
version: "11.4.0"
|
||||||
permission_handler_android:
|
permission_handler_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: permission_handler_android
|
name: permission_handler_android
|
||||||
sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6"
|
sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "13.0.1"
|
version: "12.1.0"
|
||||||
permission_handler_apple:
|
permission_handler_apple:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ dependencies:
|
|||||||
share_plus: ^7.2.1
|
share_plus: ^7.2.1
|
||||||
confetti: ^0.7.0
|
confetti: ^0.7.0
|
||||||
pdf: ^3.11.3
|
pdf: ^3.11.3
|
||||||
permission_handler: ^12.0.1
|
permission_handler: ^11.3.1
|
||||||
device_info_plus: ^11.3.0
|
device_info_plus: ^11.3.0
|
||||||
showcaseview: ^2.0.3
|
showcaseview: ^2.0.3
|
||||||
package_info_plus: ^4.2.0
|
package_info_plus: ^4.2.0
|
||||||
|
|||||||
Reference in New Issue
Block a user