diff --git a/android/app/build.gradle b/android/app/build.gradle index 921862fa5..9b048de01 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -32,12 +32,12 @@ android { ndkVersion = flutter.ndkVersion compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } kotlinOptions { - jvmTarget = JavaVersion.VERSION_1_8 + jvmTarget = JavaVersion.VERSION_17 } defaultConfig { diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 7bb2df6ba..5e6b54271 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip diff --git a/android/settings.gradle b/android/settings.gradle index b9e43bd37..a00f9ea70 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -18,7 +18,7 @@ pluginManagement { plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "8.1.0" apply false + id "com.android.application" version "8.3.1" apply false id "org.jetbrains.kotlin.android" version "1.8.22" apply false } diff --git a/assets/icons/gyroscope_logo.png b/assets/icons/gyroscope_logo.png new file mode 100644 index 000000000..62039b19e Binary files /dev/null and b/assets/icons/gyroscope_logo.png differ diff --git a/assets/icons/ic_nav_header_logo.png b/assets/icons/ic_nav_header_logo.png new file mode 100644 index 000000000..7f01f14f2 Binary files /dev/null and b/assets/icons/ic_nav_header_logo.png differ diff --git a/assets/icons/robotic_arm.png b/assets/icons/robotic_arm.png new file mode 100644 index 000000000..040f1001a Binary files /dev/null and b/assets/icons/robotic_arm.png differ diff --git a/assets/icons/thermometer_logo.png b/assets/icons/thermometer_logo.png new file mode 100644 index 000000000..6651a9029 Binary files /dev/null and b/assets/icons/thermometer_logo.png differ diff --git a/assets/icons/tile_icon_accelerometer.png b/assets/icons/tile_icon_accelerometer.png new file mode 100644 index 000000000..aeca8a017 Binary files /dev/null and b/assets/icons/tile_icon_accelerometer.png differ diff --git a/assets/icons/tile_icon_barometer.png b/assets/icons/tile_icon_barometer.png new file mode 100644 index 000000000..76a1ea413 Binary files /dev/null and b/assets/icons/tile_icon_barometer.png differ diff --git a/assets/icons/tile_icon_compass.png b/assets/icons/tile_icon_compass.png new file mode 100644 index 000000000..c34a081f7 Binary files /dev/null and b/assets/icons/tile_icon_compass.png differ diff --git a/assets/icons/tile_icon_gas.png b/assets/icons/tile_icon_gas.png new file mode 100644 index 000000000..35865fa75 Binary files /dev/null and b/assets/icons/tile_icon_gas.png differ diff --git a/assets/icons/tile_icon_horizontal_bars.png b/assets/icons/tile_icon_horizontal_bars.png new file mode 100644 index 000000000..ea55eb47c Binary files /dev/null and b/assets/icons/tile_icon_horizontal_bars.png differ diff --git a/assets/icons/tile_icon_logic_analyzer.png b/assets/icons/tile_icon_logic_analyzer.png new file mode 100644 index 000000000..4292922e8 Binary files /dev/null and b/assets/icons/tile_icon_logic_analyzer.png differ diff --git a/assets/icons/tile_icon_lux_meter.png b/assets/icons/tile_icon_lux_meter.png new file mode 100644 index 000000000..3be6a05c1 Binary files /dev/null and b/assets/icons/tile_icon_lux_meter.png differ diff --git a/assets/icons/tile_icon_multimeter.png b/assets/icons/tile_icon_multimeter.png new file mode 100644 index 000000000..e71df45a4 Binary files /dev/null and b/assets/icons/tile_icon_multimeter.png differ diff --git a/assets/icons/tile_icon_oscilloscope.png b/assets/icons/tile_icon_oscilloscope.png new file mode 100644 index 000000000..45f3ea0c0 Binary files /dev/null and b/assets/icons/tile_icon_oscilloscope.png differ diff --git a/assets/icons/tile_icon_power_source.png b/assets/icons/tile_icon_power_source.png new file mode 100644 index 000000000..1278fc2ba Binary files /dev/null and b/assets/icons/tile_icon_power_source.png differ diff --git a/assets/icons/tile_icon_sensors.png b/assets/icons/tile_icon_sensors.png new file mode 100644 index 000000000..bdf58f980 Binary files /dev/null and b/assets/icons/tile_icon_sensors.png differ diff --git a/assets/icons/tile_icon_vertical_bars.png b/assets/icons/tile_icon_vertical_bars.png new file mode 100644 index 000000000..dc26f0e23 Binary files /dev/null and b/assets/icons/tile_icon_vertical_bars.png differ diff --git a/assets/icons/tile_icon_wave_generator.png b/assets/icons/tile_icon_wave_generator.png new file mode 100644 index 000000000..03017aa63 Binary files /dev/null and b/assets/icons/tile_icon_wave_generator.png differ diff --git a/lib/constants.dart b/lib/constants.dart new file mode 100644 index 000000000..3792a9d5a --- /dev/null +++ b/lib/constants.dart @@ -0,0 +1,59 @@ +import 'dart:core'; + +List instrumentHeadings = [ + 'OSCILLOSCOPE', + 'MULTIMETER', + 'LOGIC ANALYZER', + 'SENSORS', + 'WAVE GENERATOR', + 'POWER SOURCE', + 'LUX METER', + 'ACCELEROMETER', + 'BAROMETER', + 'COMPASS', + 'GYROSCOPE', + 'THERMOMETER', + 'ROBOTIC ARM', + 'GAS SENSOR', + 'DUST SENSOR', + 'SOUND METER' +]; + +List instrumentDesc = [ + 'Allows observation of varying signal voltages', + 'Measure voltage, current, resistance and capacitance', + 'Captures and displays signals from digital systems', + 'Allows logging of data returned by sensor connected', + 'Generates arbitrary analog and digital waveforms', + 'Generates programmable voltage and currents', + 'Measures the ambient light intensity', + 'Measures the Linear acceleration in XYZ directions', + 'Measures the atmospheric pressure', + 'Three axes magnetometer pointing to magnetic north', + 'Measures rate of rotation about XYZ axis', + 'To measure the ambient temperature', + 'Controls servos of a robotic arm', + 'Air quality sensor for detecting a wide range of gases, including NH3, NOx, alcohol, benzene, smoke and CO2', + 'Dust sensor is used to measure air quality in terms of particles per square meter', + 'To measure the loudness in the environment in decibel(dB)' +]; + +List instrumentIcons = [ + 'assets/icons/tile_icon_oscilloscope.png', + 'assets/icons/tile_icon_multimeter.png', + 'assets/icons/tile_icon_logic_analyzer.png', + 'assets/icons/tile_icon_sensors.png', + 'assets/icons/tile_icon_wave_generator.png', + 'assets/icons/tile_icon_power_source.png', + 'assets/icons/tile_icon_lux_meter.png', + 'assets/icons/tile_icon_accelerometer.png', + 'assets/icons/tile_icon_barometer.png', + 'assets/icons/tile_icon_compass.png', + 'assets/icons/gyroscope_logo.png', + 'assets/icons/thermometer_logo.png', + 'assets/icons/robotic_arm.png', + 'assets/icons/tile_icon_gas.png', + 'assets/icons/tile_icon_gas.png', + 'assets/icons/tile_icon_gas.png', +]; + diff --git a/lib/main.dart b/lib/main.dart index 8e9408912..02ed886e6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,125 +1,36 @@ import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:pslab/view/connect_device_screen.dart'; +import 'package:pslab/view/faq_screen.dart'; +import 'package:pslab/view/instruments_screen.dart'; void main() { + WidgetsFlutterBinding.ensureInitialized(); runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); - // This widget is the root of your application. @override Widget build(BuildContext context) { - return MaterialApp( - title: 'Flutter Demo', - theme: ThemeData( - // This is the theme of your application. - // - // TRY THIS: Try running your application with "flutter run". You'll see - // the application has a purple toolbar. Then, without quitting the app, - // try changing the seedColor in the colorScheme below to Colors.green - // and then invoke "hot reload" (save your changes or press the "hot - // reload" button in a Flutter-supported IDE, or press "r" if you used - // the command line to start the app). - // - // Notice that the counter didn't reset back to zero; the application - // state is not lost during the reload. To reset the state, use hot - // restart instead. - // - // This works for code too, not just values: Most code changes can be - // tested with just a hot reload. - colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), - useMaterial3: true, - ), - home: const MyHomePage(title: 'Flutter Demo Home Page'), - ); - } -} - -class MyHomePage extends StatefulWidget { - const MyHomePage({super.key, required this.title}); - - // This widget is the home page of your application. It is stateful, meaning - // that it has a State object (defined below) that contains fields that affect - // how it looks. - - // This class is the configuration for the state. It holds the values (in this - // case the title) provided by the parent (in this case the App widget) and - // used by the build method of the State. Fields in a Widget subclass are - // always marked "final". - - final String title; - - @override - State createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - int _counter = 0; - - void _incrementCounter() { - setState(() { - // This call to setState tells the Flutter framework that something has - // changed in this State, which causes it to rerun the build method below - // so that the display can reflect the updated values. If we changed - // _counter without calling setState(), then the build method would not be - // called again, and so nothing would appear to happen. - _counter++; - }); - } - - @override - Widget build(BuildContext context) { - // This method is rerun every time setState is called, for instance as done - // by the _incrementCounter method above. - // - // The Flutter framework has been optimized to make rerunning build methods - // fast, so that you can just rebuild anything that needs updating rather - // than having to individually change instances of widgets. - return Scaffold( - appBar: AppBar( - // TRY THIS: Try changing the color here to a specific color (to - // Colors.amber, perhaps?) and trigger a hot reload to see the AppBar - // change color while the other colors stay the same. - backgroundColor: Theme.of(context).colorScheme.inversePrimary, - // Here we take the value from the MyHomePage object that was created by - // the App.build method, and use it to set our appbar title. - title: Text(widget.title), - ), - body: Center( - // Center is a layout widget. It takes a single child and positions it - // in the middle of the parent. - child: Column( - // Column is also a layout widget. It takes a list of children and - // arranges them vertically. By default, it sizes itself to fit its - // children horizontally, and tries to be as tall as its parent. - // - // Column has various properties to control how it sizes itself and - // how it positions its children. Here we use mainAxisAlignment to - // center the children vertically; the main axis here is the vertical - // axis because Columns are vertical (the cross axis would be - // horizontal). - // - // TRY THIS: Invoke "debug painting" (choose the "Toggle Debug Paint" - // action in the IDE, or press "p" in the console), to see the - // wireframe for each widget. - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text( - 'You have pushed the button this many times:', - ), - Text( - '$_counter', - style: Theme.of(context).textTheme.headlineMedium, - ), - ], - ), - ), - floatingActionButton: FloatingActionButton( - onPressed: _incrementCounter, - tooltip: 'Increment', - child: const Icon(Icons.add), - ), // This trailing comma makes auto-formatting nicer for build methods. + return ScreenUtilInit( + designSize: const Size(360, 690), + builder: (context, child) { + return MaterialApp( + debugShowCheckedModeBanner: false, + theme: ThemeData( + colorSchemeSeed: Colors.white, + useMaterial3: true, + ), + initialRoute: '/', + routes: { + '/': (context) => const InstrumentsScreen(), + '/connectDevice': (context) => const ConnectDeviceScreen(), + '/faq': (context) => const FAQScreen(), + }, + ); + }, ); } } diff --git a/lib/view/connect_device_screen.dart b/lib/view/connect_device_screen.dart new file mode 100644 index 000000000..fe49de85d --- /dev/null +++ b/lib/view/connect_device_screen.dart @@ -0,0 +1,16 @@ +import 'package:flutter/cupertino.dart'; + +class ConnectDeviceScreen extends StatefulWidget { + const ConnectDeviceScreen({super.key}); + + @override + State createState() => _HomeScreenState(); +} + +class _HomeScreenState extends State { + @override + Widget build(BuildContext context) { + // TODO: implement build + throw UnimplementedError(); + } +} \ No newline at end of file diff --git a/lib/view/faq_screen.dart b/lib/view/faq_screen.dart new file mode 100644 index 000000000..5c1f1a503 --- /dev/null +++ b/lib/view/faq_screen.dart @@ -0,0 +1,11 @@ +import 'package:flutter/cupertino.dart'; + +class FAQScreen extends StatelessWidget { + const FAQScreen({super.key}); + + @override + Widget build(BuildContext context) { + // TODO: implement build + throw UnimplementedError(); + } +} \ No newline at end of file diff --git a/lib/view/instruments_screen.dart b/lib/view/instruments_screen.dart new file mode 100644 index 000000000..935812e8e --- /dev/null +++ b/lib/view/instruments_screen.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; +import 'package:pslab/constants.dart'; +import 'package:pslab/view/widgets/applications_list_item.dart'; +import 'package:pslab/view/widgets/common_scaffold_widget.dart'; + +class InstrumentsScreen extends StatefulWidget { + const InstrumentsScreen({super.key}); + + @override + State createState() => _InstrumentsScreenState(); +} + +class _InstrumentsScreenState extends State { + @override + Widget build(BuildContext context) { + return DefaultTabController( + length: 3, + child: CommonScaffold( + index: 0, + title: 'Instruments', + body: SafeArea( + child: ListView.builder( + itemCount: instrumentHeadings.length, + itemBuilder: (context, index) { + return ApplicationsListItem( + heading: instrumentHeadings[index], + description: instrumentDesc[index], + instrumentIcon: instrumentIcons[index], + ); + }, + ), + ), + ), + ); + } +} diff --git a/lib/view/widgets/applications_list_item.dart b/lib/view/widgets/applications_list_item.dart new file mode 100644 index 000000000..3f7ffc0dd --- /dev/null +++ b/lib/view/widgets/applications_list_item.dart @@ -0,0 +1,113 @@ +import 'package:flutter/material.dart'; + +class ApplicationsListItem extends StatelessWidget { + final String heading; + final String description; + final String instrumentIcon; + final String verticalBarsIcon = 'assets/icons/tile_icon_vertical_bars.png'; + final String horizontalBarsIcon = + 'assets/icons/tile_icon_horizontal_bars.png'; + + const ApplicationsListItem( + {super.key, + required this.heading, + required this.description, + required this.instrumentIcon}); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + /**/ + }, + child: Card( + margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 8), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + elevation: 2, + child: Container( + height: 225, + decoration: BoxDecoration( + color: const Color(0xFFD32F2F), + borderRadius: BorderRadius.circular(5)), + child: Stack( + children: [ + Positioned( + top: 0, + bottom: 10, + right: 10, + child: Column( + children: [ + Expanded( + child: Image.asset( + verticalBarsIcon, + width: 100, + fit: BoxFit.fill, + ), + ), + const SizedBox( + height: 100, + width: 100, + ) + ], + ), + ), + Positioned( + right: 10, + bottom: 10, + left: 0, + child: Row( + children: [ + Expanded( + child: Image.asset( + horizontalBarsIcon, + height: 100, + fit: BoxFit.fill, + ), + ), + SizedBox( + height: 100, + width: 100, + child: Image.asset( + instrumentIcon, + fit: BoxFit.fill, + ), + ) + ], + ), + ), + Positioned( + top: 20, + left: 20, + right: 100, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + heading, + style: const TextStyle( + fontSize: 22, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + textAlign: TextAlign.start, + ), + Text( + description, + style: const TextStyle( + fontSize: 16, + color: Colors.white, + ), + textAlign: TextAlign.start, + ), + ], + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/view/widgets/common_scaffold_widget.dart b/lib/view/widgets/common_scaffold_widget.dart new file mode 100644 index 000000000..cac58eb97 --- /dev/null +++ b/lib/view/widgets/common_scaffold_widget.dart @@ -0,0 +1,81 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'navigation_drawer.dart'; + +class CommonScaffold extends StatefulWidget { + final String title; + final Widget body; + final Key? scaffoldKey; + final int index; + final List? actions; + + const CommonScaffold( + {super.key, + required this.body, + required this.title, + this.scaffoldKey, + this.actions, + required this.index}); + + @override + State createState() => _CommonScaffoldState(); +} + +class _CommonScaffoldState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + resizeToAvoidBottomInset: true, + appBar: AppBar( + systemOverlayStyle: + const SystemUiOverlayStyle(statusBarColor: Color(0xFFD32F2F)), + leading: Builder(builder: (context) { + return IconButton( + onPressed: () { + Scaffold.of(context).openDrawer(); + }, + icon: const Icon( + Icons.menu, + color: Colors.white, + ), + ); + }), + backgroundColor: const Color(0xFFD32F2F), + title: Text( + key: widget.scaffoldKey, + widget.title, + style: const TextStyle( + color: Colors.white, + fontSize: 19, + ), + ), + actions: [ + IconButton( + icon: const Icon( + Icons.usb_off, + color: Colors.white, + ), + onPressed: () { + /**/ + }, + ), + IconButton( + icon: const Icon( + Icons.more_vert, + color: Colors.white, + ), + onPressed: () { + /**/ + }, + ), + ], + ), + body: widget.body, + drawer: NavDrawer( + selectedIndex: widget.index, + ), + ); + } +} diff --git a/lib/view/widgets/navigation_drawer.dart b/lib/view/widgets/navigation_drawer.dart new file mode 100644 index 000000000..6921edccb --- /dev/null +++ b/lib/view/widgets/navigation_drawer.dart @@ -0,0 +1,313 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:google_fonts/google_fonts.dart'; + +class NavDrawer extends StatefulWidget { + final int selectedIndex; + const NavDrawer({super.key, required this.selectedIndex}); + + @override + State createState() => _NavDrawerState(); +} + +class _NavDrawerState extends State { + final String navHeaderLogo = 'assets/icons/ic_nav_header_logo.png'; + + @override + Widget build(BuildContext context) { + return Drawer( + width: 280.w, + backgroundColor: const Color(0xFFFAFAFA), + child: ListView( + children: [ + DrawerHeader( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 80, + width: 80, + child: Image.asset( + navHeaderLogo, + fit: BoxFit.contain, + ), + ), + Padding( + padding: const EdgeInsets.only(top: 16), + child: Text( + 'Not Connected', + style: GoogleFonts.roboto( + fontSize: 14, + ) + ), + ), + ], + ), + ), + ListTile( + focusColor: Colors.grey[350], + dense: true, + leading: Icon( + Icons.apps, + color: widget.selectedIndex == 0 ? Colors.red : Colors.grey, + ), + title: Text( + 'Instruments', + style: TextStyle( + color: widget.selectedIndex == 0 ? Colors.red : Colors.black, + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ), + onTap: () { + // Check if the HomeScreen is already in the navigation stack + if (Navigator.canPop(context) && + ModalRoute.of(context)?.settings.name == '/') { + // If it's already in the stack, pop to it + Navigator.popUntil(context, ModalRoute.withName('/')); + } else { + // Otherwise, navigate to HomeScreen + Navigator.pushNamedAndRemoveUntil( + context, + '/', + (route) => route.isFirst, + ); + } + }, + ), + ListTile( + focusColor: Colors.grey[350], + dense: true, + leading: Icon( + Icons.wifi_tethering, + color: widget.selectedIndex == 1 ? Colors.red : Colors.grey, + ), + title: Text( + 'Logged Data', + style: TextStyle( + color: widget.selectedIndex == 1 ? Colors.red : Colors.black, + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ), + onTap: () { + /**/ + }, + ), + const Divider(), + ListTile( + focusColor: Colors.grey[350], + dense: true, + leading: Icon( + Icons.developer_board, + color: widget.selectedIndex == 2 ? Colors.red : Colors.grey, + ), + title: Text( + 'Connect Device', + style: TextStyle( + color: widget.selectedIndex == 2 ? Colors.red : Colors.black, + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ), + onTap: () { + /**/ + }, + ), + ListTile( + focusColor: Colors.grey[350], + dense: true, + leading: Icon( + Icons.create_new_folder, + color: widget.selectedIndex == 3 ? Colors.red : Colors.grey, + ), + title: Text( + 'Generate Config File', + style: TextStyle( + color: widget.selectedIndex == 3 ? Colors.red : Colors.black, + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ), + onTap: () { + /**/ + }, + ), + ListTile( + focusColor: Colors.grey[350], + dense: true, + leading: Icon( + Icons.settings, + color: widget.selectedIndex == 4 ? Colors.red : Colors.grey, + ), + title: Text( + 'Settings', + style: TextStyle( + color: widget.selectedIndex == 4 ? Colors.red : Colors.black, + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ), + onTap: () { + /**/ + }, + ), + const Divider(), + ListTile( + focusColor: Colors.grey[350], + dense: true, + leading: Icon( + Icons.info, + color: widget.selectedIndex == 5 ? Colors.red : Colors.grey, + ), + title: Text( + 'About Us', + style: TextStyle( + color: widget.selectedIndex == 5 ? Colors.red : Colors.black, + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ), + onTap: () { + /**/ + }, + ), + ListTile( + focusColor: Colors.grey[350], + dense: true, + leading: Icon( + Icons.menu_book, + color: widget.selectedIndex == 6 ? Colors.red : Colors.grey, + ), + title: Text( + 'Documentation', + style: TextStyle( + color: widget.selectedIndex == 6 ? Colors.red : Colors.black, + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ), + onTap: () { + /**/ + }, + ), + ListTile( + focusColor: Colors.grey[350], + dense: true, + leading: Icon( + Icons.star, + color: widget.selectedIndex == 7 ? Colors.red : Colors.grey, + ), + title: Text( + 'Rate App', + style: TextStyle( + color: widget.selectedIndex == 7 ? Colors.red : Colors.black, + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ), + onTap: () { + /**/ + }, + ), + ListTile( + focusColor: Colors.grey[350], + dense: true, + leading: Icon( + Icons.shopping_cart, + color: widget.selectedIndex == 8 ? Colors.red : Colors.grey, + ), + title: Text( + 'Buy PSLab', + style: TextStyle( + color: widget.selectedIndex == 8 ? Colors.red : Colors.black, + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ), + onTap: () { + /**/ + }, + ), + ListTile( + focusColor: Colors.grey[350], + dense: true, + leading: Icon( + Icons.feedback, + color: widget.selectedIndex == 9 ? Colors.red : Colors.grey, + ), + title: Text( + 'FAQ', + style: TextStyle( + color: widget.selectedIndex == 9 ? Colors.red : Colors.black, + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ), + onTap: () { + /**/ + }, + ), + ListTile( + focusColor: Colors.grey[350], + dense: true, + leading: Icon( + Icons.share, + color: widget.selectedIndex == 10 ? Colors.red : Colors.grey, + ), + title: Text( + 'Share App', + style: TextStyle( + color: widget.selectedIndex == 10 ? Colors.red : Colors.black, + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ), + onTap: () { + /**/ + }, + ), + ListTile( + focusColor: Colors.grey[350], + dense: true, + leading: Icon( + Icons.article, + color: widget.selectedIndex == 11 ? Colors.red : Colors.grey, + ), + title: Text( + 'Privacy Policy', + style: TextStyle( + color: widget.selectedIndex == 11 ? Colors.red : Colors.black, + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ), + onTap: () { + /**/ + }, + ), + ListTile( + focusColor: Colors.grey[350], + dense: true, + leading: Icon( + Icons.attribution, + color: widget.selectedIndex == 12 ? Colors.red : Colors.grey, + ), + title: Text( + 'Open Source Licenses', + style: TextStyle( + color: widget.selectedIndex == 12 ? Colors.red : Colors.black, + fontWeight: FontWeight.bold, + fontSize: 14, + ), + ), + onTap: () { + /**/ + }, + ), + ], + ), + ); + } +} diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index cccf817a5..e777c67df 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,6 +5,8 @@ import FlutterMacOS import Foundation +import path_provider_foundation func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index cbb6965e9..114527ff4 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,14 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + args: + dependency: transitive + description: + name: args + sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 + url: "https://pub.dev" + source: hosted + version: "2.6.0" async: dependency: transitive description: @@ -41,6 +49,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.18.0" + crypto: + dependency: transitive + description: + name: crypto + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev" + source: hosted + version: "3.0.6" cupertino_icons: dependency: "direct main" description: @@ -57,6 +73,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" + url: "https://pub.dev" + source: hosted + version: "2.1.3" flutter: dependency: "direct main" description: flutter @@ -70,11 +94,51 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.0" + flutter_screenutil: + dependency: "direct main" + description: + name: flutter_screenutil + sha256: "8239210dd68bee6b0577aa4a090890342d04a136ce1c81f98ee513fc0ce891de" + url: "https://pub.dev" + source: hosted + version: "5.9.3" + flutter_svg: + dependency: "direct main" + description: + name: flutter_svg + sha256: "54900a1a1243f3c4a5506d853a2b5c2dbc38d5f27e52a52618a8054401431123" + url: "https://pub.dev" + source: hosted + version: "2.0.16" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" + google_fonts: + dependency: "direct main" + description: + name: google_fonts + sha256: b1ac0fe2832c9cc95e5e88b57d627c5e68c223b9657f4b96e1487aa9098c7b82 + url: "https://pub.dev" + source: hosted + version: "6.2.1" + http: + dependency: transitive + description: + name: http + sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 + url: "https://pub.dev" + source: hosted + version: "1.2.2" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" leak_tracker: dependency: transitive description: @@ -139,6 +203,86 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.0" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2" + url: "https://pub.dev" + source: hosted + version: "2.2.15" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 + url: "https://pub.dev" + source: hosted + version: "6.0.2" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" sky_engine: dependency: transitive description: flutter @@ -192,6 +336,38 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.2" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: "27d5fefe86fb9aace4a9f8375b56b3c292b64d8c04510df230f849850d912cb7" + url: "https://pub.dev" + source: hosted + version: "1.1.15" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: "2430b973a4ca3c4dbc9999b62b8c719a160100dcbae5c819bae0cacce32c9cdb" + url: "https://pub.dev" + source: hosted + version: "1.1.12" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad" + url: "https://pub.dev" + source: hosted + version: "1.1.16" vector_math: dependency: transitive description: @@ -208,6 +384,30 @@ packages: url: "https://pub.dev" source: hosted version: "14.2.5" + web: + dependency: transitive + description: + name: web + sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb + url: "https://pub.dev" + source: hosted + version: "1.1.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + xml: + dependency: transitive + description: + name: xml + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" + source: hosted + version: "6.5.0" sdks: dart: ">=3.5.4 <4.0.0" - flutter: ">=3.18.0-18.0.pre.54" + flutter: ">=3.24.0" diff --git a/pubspec.yaml b/pubspec.yaml index 835dcadc0..3ca2e8a4c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -35,6 +35,9 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.8 + flutter_screenutil: ^5.9.3 + flutter_svg: ^2.0.16 + google_fonts: 6.2.1 dev_dependencies: flutter_test: @@ -59,6 +62,9 @@ flutter: uses-material-design: true # To add assets to your application, add an assets section, like this: + assets: + - assets/icons/ + - assets/vectors/ # assets: # - images/a_dot_burr.jpeg # - images/a_dot_ham.jpeg