diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 8c14a50..8601c77 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -40,6 +40,20 @@ https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT. In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. --> + + + + + + + + + + + + + + diff --git a/lib/features/enquiry/screens/enquiry_screen.dart b/lib/features/enquiry/screens/enquiry_screen.dart index 0635bf7..a48ada8 100644 --- a/lib/features/enquiry/screens/enquiry_screen.dart +++ b/lib/features/enquiry/screens/enquiry_screen.dart @@ -1,5 +1,3 @@ -// ignore_for_file: use_build_context_synchronously - import 'package:flutter/material.dart'; import 'package:url_launcher/url_launcher.dart'; import '../../../l10n/app_localizations.dart'; @@ -12,31 +10,45 @@ class EnquiryScreen extends StatefulWidget { } class _EnquiryScreen extends State { + // Updated to launch externally and pre-fill the subject Future _launchEmailAddress(String email) async { - final Uri emailUri = Uri(scheme: 'mailto', path: email); + final Uri emailUri = Uri( + scheme: 'mailto', + path: email, + query: 'subject=Enquiry', // Pre-fills the subject line + ); if (await canLaunchUrl(emailUri)) { - await launchUrl(emailUri); + // Use external application mode + await launchUrl(emailUri, mode: LaunchMode.externalApplication); } else { - debugPrint('${AppLocalizations.of(context).emailLaunchError} $email'); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Could not open email app for $email')), + ); } } + // Updated with better error handling Future _launchPhoneNumber(String phone) async { final Uri phoneUri = Uri(scheme: 'tel', path: phone); if (await canLaunchUrl(phoneUri)) { await launchUrl(phoneUri); } else { - debugPrint('${AppLocalizations.of(context).dialerLaunchError} $phone'); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Could not open dialer for $phone')), + ); } } + // Updated to launch externally Future _launchUrl(String url) async { final Uri uri = Uri.parse(url); if (await canLaunchUrl(uri)) { - await launchUrl(uri); + // Use external application mode + await launchUrl(uri, mode: LaunchMode.externalApplication); } else { - // Consider adding a 'urlLaunchError' key to your AppLocalizations - debugPrint('Could not launch $url'); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Could not launch $url')), + ); } } @@ -57,7 +69,7 @@ class _EnquiryScreen extends State { onTap: () => _launchPhoneNumber(phone), child: Text(phone, style: - TextStyle(color: Theme.of(context).scaffoldBackgroundColor)), + TextStyle(color: Theme.of(context).colorScheme.primary)), // Changed color for visibility ), ], ); @@ -79,13 +91,14 @@ class _EnquiryScreen extends State { children: [ const SizedBox(height: 20), GestureDetector( - onTap: () => _launchUrl("https://kccb.in/complaint-form"), + onTap: () => _launchUrl("https://kccbhp.bank.in/complaint-form/"), child: Row(mainAxisSize: MainAxisSize.min, children: [ Text( "Complaint Form", style: TextStyle( fontSize: 17, color: Theme.of(context).colorScheme.primary, + decoration: TextDecoration.underline, // Added underline for link clarity decorationColor: Theme.of(context).colorScheme.primary, ), @@ -150,4 +163,4 @@ class _EnquiryScreen extends State { ), ); } -} +} \ No newline at end of file diff --git a/lib/features/service/screens/faqs_screen.dart b/lib/features/service/screens/faqs_screen.dart index 4e3ac47..57c1389 100644 --- a/lib/features/service/screens/faqs_screen.dart +++ b/lib/features/service/screens/faqs_screen.dart @@ -1,6 +1,14 @@ import 'package:flutter/material.dart'; import 'package:kmobile/l10n/app_localizations.dart'; +// Data model for a single FAQ item +class FaqItem { + final String question; + final String answer; + + FaqItem({required this.question, required this.answer}); +} + class FaqsScreen extends StatefulWidget { const FaqsScreen({super.key}); @@ -9,55 +17,95 @@ class FaqsScreen extends StatefulWidget { } class _FaqsScreenState extends State { - @override - void initState() { - super.initState(); - _getFaqs(); - } - - // A placeholder for your future API call - Future _getFaqs() async { - // TODO: Implement API call to fetch FAQs data - // For now, simulating a network call with a delay - await Future.delayed(const Duration(seconds: 1)); - // In a real implementation, you would process the API response here - } + // List of FAQs + final List _faqs = [ + FaqItem( + question: "How do I log in to the mobile banking app?", + answer: + "You can log in using your customer number and password. Biometric login (fingerprint) and MPIN is also available for supported devices.", + ), + FaqItem( + question: "Is my banking information secure on this app?", + answer: + "Yes. We use industry-standard encryption and multi-factor authentication to ensure your data is safe.", + ), + FaqItem( + question: "How can I check my account balance?", + answer: + "Once logged in, your account balance will be displayed on the home screen. You can also view detailed balances under the “Accounts” section.", + ), + FaqItem( + question: "Can I transfer money to other bank accounts?", + answer: + "Yes. You can use NEFT, RTGS or IMPS to transfer funds to any bank account in India.", + ), + FaqItem( + question: "How do I view my transaction history?", + answer: + "Click on the “Account Statement” icon under the Home Screen to view recent and past transactions.", + ), + ]; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Row( - children: [ - Flexible( - child: Text( - AppLocalizations.of(context).faq, - softWrap: true, - style: const TextStyle( - fontSize: 16.5, - ), - textAlign: TextAlign.left, - ), - ), - ], - ), + title: Text(AppLocalizations.of(context).faq), ), body: Stack( children: [ + // Background logo IgnorePointer( child: Center( child: Opacity( - opacity: 0.1, // Low opacity + opacity: 0.1, child: Image.asset( 'assets/images/logo.png', - width: 200, // Adjust size as needed - height: 200, // Adjust size as needed + width: 200, + height: 200, ), ), ), ), + // FAQ List + ListView.builder( + padding: const EdgeInsets.all(8.0), + itemCount: _faqs.length, + itemBuilder: (context, index) { + final faq = _faqs[index]; + return Card( + margin: + const EdgeInsets.symmetric(vertical: 8.0, horizontal: 4.0), + elevation: 2.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12.0), + ), + child: ExpansionTile( + title: Text( + faq.question, + style: const TextStyle( + fontWeight: FontWeight.w600, + ), + ), + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(16.0, 0, 16.0, 16.0), + child: Text( + faq.answer, + style: TextStyle( + fontSize: 14, + color: Colors.grey[700], + height: 1.5, + ), + ), + ), + ], + ), + ); + }, + ), ], ), ); } -} +} \ No newline at end of file diff --git a/lib/features/service/screens/quick_links_screen.dart b/lib/features/service/screens/quick_links_screen.dart index 85f1fc4..2726d13 100644 --- a/lib/features/service/screens/quick_links_screen.dart +++ b/lib/features/service/screens/quick_links_screen.dart @@ -1,50 +1,144 @@ -import 'package:flutter/material.dart'; -import 'package:kmobile/l10n/app_localizations.dart'; + import 'package:flutter/material.dart'; + import 'package:kmobile/l10n/app_localizations.dart'; + import 'package:url_launcher/url_launcher.dart'; -class QuickLinksScreen extends StatefulWidget { - const QuickLinksScreen({super.key}); + // Data model for a single Quick Link item + class QuickLink { + final String title; + final String url; + final IconData icon; - @override - State createState() => _QuickLinksScreenState(); -} + QuickLink({required this.title, required this.url, required this.icon}); + } -class _QuickLinksScreenState extends State { - @override - void initState() { - super.initState(); - _getQuickLinks(); - } + class QuickLinksScreen extends StatefulWidget { + const QuickLinksScreen({super.key}); - // A placeholder for your future API call - Future _getQuickLinks() async { - // TODO: Implement API call to fetch quick links data - // For now, simulating a network call with a delay - await Future.delayed(const Duration(seconds: 1)); - // In a real implementation, you would process the API response here - } + @override + State createState() => _QuickLinksScreenState(); + } - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(AppLocalizations.of(context).quickLinks), - ), - body: Stack( - children: [ - IgnorePointer( - child: Center( - child: Opacity( - opacity: 0.1, // Low opacity - child: Image.asset( - 'assets/images/logo.png', - width: 200, // Adjust size as needed - height: 200, // Adjust size as needed - ), - ), - ), - ), - ], - ), - ); - } -} + class _QuickLinksScreenState extends State { + // List of Quick Links + final List _quickLinks = [ + QuickLink( + title: "National Bank of Agriculture & Rural Development", + url: "http://www.nabard.org/", + icon: Icons.account_balance), + QuickLink( + title: "Reserve Bank of India", + url: "http://www.rbi.org.in/home.aspx", + icon: Icons.account_balance_wallet), + QuickLink( + title: "Indian Institute of Banking & Finance", + url: "http://www.iibf.org.in/", + icon: Icons.school), + QuickLink( + title: "Indian Bank Association", + url: "http://www.iba.org.in/", + icon: Icons.group_work), + QuickLink( + title: "Ministry of Finance", + url: "http://www.finmin.nic.in/", + icon: Icons.business), + QuickLink( + title: "Securities Exchange Board of India", + url: "http://www.sebi.gov.in/", + icon: Icons.show_chart), + QuickLink( + title: "Insurance Regulatory & Development Authority", + url: "https://www.irdai.gov.in/", + icon: Icons.shield_outlined), + ]; + + // Function to launch a URL + Future _launchURL(String url, BuildContext context) async { + final Uri uri = Uri.parse(url); + if (await canLaunchUrl(uri)) { + await launchUrl(uri, mode: LaunchMode.externalApplication); + } else { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Could not launch $url')), + ); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(AppLocalizations.of(context).quickLinks), + ), + body: Stack( + children: [ + // Background logo + IgnorePointer( + child: Center( + child: Opacity( + opacity: 0.1, + child: Image.asset( + 'assets/images/logo.png', + width: 200, + height: 200, + ), + ), + ), + ), + // Grid of Quick Links + GridView.builder( + padding: const EdgeInsets.all(12.0), + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, // Two columns + crossAxisSpacing: 12.0, + mainAxisSpacing: 12.0, + childAspectRatio: 1.1, // Adjust for better card shape + ), + itemCount: _quickLinks.length, + itemBuilder: (context, index) { + final link = _quickLinks[index]; + return _buildLinkCard(link, context); + }, + ), + ], + ), + ); + } + + Widget _buildLinkCard(QuickLink link, BuildContext context) { + return Card( + elevation: 3.0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(15.0), + ), + child: InkWell( + onTap: () => _launchURL(link.url, context), + borderRadius: BorderRadius.circular(15.0), + child: Padding( + padding: const EdgeInsets.all(12.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Icon( + link.icon, + size: 40.0, + color: Theme.of(context).colorScheme.primary, + ), + const SizedBox(height: 12.0), + Text( + link.title, + textAlign: TextAlign.center, + style: const TextStyle( + fontWeight: FontWeight.w500, + fontSize: 14.0, + ), + maxLines: 3, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ), + ), + ); + } + } \ No newline at end of file