commit 2abcefd2fe8a8415ed6d26b15ee0730bada20e4d Author: stcb <21@stcb.cc> Date: Fri Sep 13 14:14:10 2024 +0300 Initial push: Add POC diff --git a/main.dart b/main.dart new file mode 100644 index 0000000..39af75a --- /dev/null +++ b/main.dart @@ -0,0 +1,356 @@ +import 'package:flutter/material.dart'; + +void main() { + runApp(MyApp()); +} + +class MyApp extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + theme: ThemeData( + brightness: Brightness.dark + ), + home: MyHomePage(), + ); + } +} + +class MyHomePage extends StatefulWidget { + @override + _MyHomePageState createState() => _MyHomePageState(); +} + +class _MyHomePageState extends State with SingleTickerProviderStateMixin { + late TabController _tabController; + + @override + void initState() { + super.initState(); + _tabController = TabController(length: 3, vsync: this, initialIndex: 1); + _tabController.addListener(_handleTabIndex); + } + + @override + void dispose() { + _tabController.removeListener(_handleTabIndex); + _tabController.dispose(); + super.dispose(); + } + + void _handleTabIndex() { + setState(() {}); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + // appBar: AppBar( + // backgroundColor: Colors.black, + // foregroundColor: Colors.black, + // // title: const Text('Barre de navigation inférieure'), + // ), + backgroundColor: Colors.black, + body: TabBarView( + controller: _tabController, + children: [ + FavoritePage(), // Page des favoris + HistoryPage(), // Page de l'historique + ContactPage(), // Page des contacts + ], + ), + bottomNavigationBar: Container( + color: Colors.black, + child: TabBar( + controller: _tabController, + tabs: [ + Tab(icon: Icon(_tabController.index == 0 ? Icons.star : Icons.star_border)), + Tab(icon: Icon(_tabController.index == 1 ? Icons.access_time_filled : Icons.access_time_outlined)), + Tab(icon: Icon(_tabController.index == 2 ? Icons.contacts : Icons.contacts_outlined)), + ], + labelColor: Colors.white, + unselectedLabelColor: Colors.grey, + indicatorSize: TabBarIndicatorSize.label, + indicatorPadding: const EdgeInsets.only(bottom: -0), // Ajustez le padding pour élever la ligne blanche au-dessus des icônes si nécessaire + indicatorColor: Colors.white, // Couleur de la barre horizontale blanche + ), + ), + ); + } +} + +class ContactPage extends StatefulWidget { + @override + _ContactPageState createState() => _ContactPageState(); +} + +class _ContactPageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.black, + appBar: AppBar( + title: const Text('Contacts'), + ), + body: ListView.builder( + itemCount: contacts.length, + itemBuilder: (context, index) { + return DisplayContact(contact: contacts[index]); + }, + ), + ); + } +} + +class FavoritePage extends StatefulWidget { + @override + _FavoritePageState createState() => _FavoritePageState(); +} + +class _FavoritePageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.black, + appBar: AppBar( + title: const Text('Favorites'), + ), + body: ListView.builder( + itemCount: contacts.length, + itemBuilder: (context, index) { + if (contacts[index].isFavorite) { + return DisplayContact(contact: contacts[index]); + } else { + return const SizedBox.shrink(); + } + }, + ), + ); + } +} + +class HistoryPage extends StatefulWidget { + @override + _HistoryPageState createState() => _HistoryPageState(); +} + +class _HistoryPageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.black, + appBar: AppBar( + title: const Text('History'), + ), + body: ListView.builder( + itemCount: histories.length, + itemBuilder: (context, index) { + return DisplayContact(contact: histories[index].contact, history: histories[index]); + }, + ), + ); + } +} + +class DisplayContact extends StatelessWidget { + String getTimeElapsed(DateTime date) { + final now = DateTime.now(); + final difference = now.difference(date); + if (difference.inDays > 0) { + return '${difference.inDays} days ago'; + } else if (difference.inHours > 0) { + return '${difference.inHours} hours ago'; + } else if (difference.inMinutes > 0) { + return '${difference.inMinutes} minutes ago'; + } else { + return 'Just now'; + } + } + + final Contact contact; + final History? history; + + const DisplayContact({super.key, required this.contact, this.history}); + + void _openVisualPage(BuildContext context) { + Navigator.push(context, MaterialPageRoute(builder: (context) => CallingPage(contact: contact))); + } + + @override + Widget build(BuildContext context) { + return ListTile( + leading: DisplayAvatar(contact: contact), + title: Text(contact.name), + subtitle: history != null ? Text(getTimeElapsed(history!.date)) : null, + trailing: InkWell( + onTap: () => _openVisualPage(context), + child: const Icon(Icons.call), + ), + onTap: () { + // Ajoutez ici le code pour appeler le contact + }, + ); + } +} + +class CallingPage extends StatefulWidget { + final Contact contact; + + const CallingPage({super.key, required this.contact}); + + @override + _CallingPageState createState() => _CallingPageState(); +} + +// display the calling page as if the call is already in progress +class _CallingPageState extends State { + @override + Widget build(BuildContext context) { + final contact = widget.contact; + return Scaffold( + backgroundColor: Colors.black, + appBar: AppBar( + title: const Text('Appel en cours'), + backgroundColor: Colors.black, + ), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const CircleAvatar( + radius: 100.0, + backgroundImage: + NetworkImage('https://thispersondoesnotexist.com/'), + backgroundColor: Colors.transparent, + ), + const SizedBox(height: 10.0), + // Add the contact name here + Text(contact.name, style: const TextStyle(fontSize: 40.0, color: Colors.white)), + // const SizedBox(height: 10.0), + const Text('99 : 59 : 59', style: + TextStyle(fontSize: 40.0, color: + Colors.white)), + const SizedBox(height: 50.0), + contact.isLocked + ? const Text('Con. Health - 98% (excellent)', + style: + TextStyle(fontSize: + 16.0,color: + Colors.green)) + : + const Text('No Icing available', + style: + TextStyle(fontSize: + 16.0,color: + Colors.white)), + const SizedBox(height: + 50.0), // Adjust size box height as needed + const Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children:[ + Icon(Icons.mic_off,size: + 30.0,color: + Colors.white), + Icon(Icons.dialpad,size: + 30.0,color: + Colors.white), + Icon(Icons.more_vert,size: + 30.0,color: + Colors.white), + Icon(Icons.volume_up,size: + 30.0,color: + Colors.white), + ], + ), + const SizedBox(height: + 50.0), // Adjust size box height as needed + const Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children:[ + Icon(Icons.pause,size: + 60.0,color: + Colors.white), + Icon(Icons.call_end,size: + 60.0,color: + Colors.red), + ], + ), + ], + ), + ), + ); + } +} + + +class DisplayAvatar extends StatelessWidget { + final Contact contact; + + const DisplayAvatar({super.key, required this.contact}); + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + CircleAvatar( + child: Text(contact.name[0]), + ), + if (contact.isLocked) + const Positioned( + right: 0, + bottom: 0, + child: Icon( + Icons.lock, + color: Colors.white, + size: 20.0, + ), + ), + ], + ); + } +} + +// Create contact lists +class Contact { + final String name; + final String phoneNumber; + final bool isFavorite; + final bool isLocked; + + Contact(this.name, this.phoneNumber, {this.isFavorite = false, this.isLocked = false}); +} + +class History { + final Contact contact; + final DateTime date; + + History(this.contact, this.date); +} + +List contacts = [ + Contact('Axel NAVARRO BOUZEHRIR (arabe)', '0618859419'), + Contact('Fabrice Iguet', '0618958419'), + Contact('La Banque Axial', '0619358514'), + Contact('Maman', '0618955417', isFavorite: true, isLocked: true), + Contact('Micheline Verdet', '0618527419', isLocked: true), + Contact('Philippe Mogue', '0618955889', isFavorite: true), + Contact('Pizza Enrico Pucci', '0618951439', isLocked: true), + Contact('Quentin Aumas', '0610252019'), + Contact('Yohan HATOT', '0618102552', isFavorite: true, isLocked: true), + Contact('Zizou', '0618514479'), +]; + +List histories = [ + History(contacts[0], DateTime.now().subtract(const Duration(hours: 2))), + History(contacts[1], DateTime.now().subtract(const Duration(hours: 8))), + History(contacts[2], DateTime.now().subtract(const Duration(days: 3, hours: 4))), + History(contacts[3], DateTime.now().subtract(const Duration(days: 4, hours: 5))), + History(contacts[4], DateTime.now().subtract(const Duration(days: 5, hours: 6))), + History(contacts[5], DateTime.now().subtract(const Duration(days: 6, hours: 7))), + History(contacts[6], DateTime.now().subtract(const Duration(days: 7, hours: 8))), + History(contacts[7], DateTime.now().subtract(const Duration(days: 8, hours: 9))), + History(contacts[8], DateTime.now().subtract(const Duration(days: 9, hours: 10))), + History(contacts[9], DateTime.now().subtract(const Duration(days: 10, hours: 11))), +];