From 86b6177d428481b83d607802252bddfd67469531 Mon Sep 17 00:00:00 2001 From: otsmr Date: Fri, 7 Feb 2025 22:28:58 +0100 Subject: [PATCH] start with settings view --- android/app/build.gradle | 15 +- android/app/src/main/res/drawable/logo.png | Bin 0 -> 18028 bytes lib/main.dart | 135 +++++++++++ lib/src/views/chats/chat_list_view.dart | 2 +- lib/src/views/profile_view.dart | 87 -------- .../views/settings/settings_main_view.dart | 211 ++++++++++++++++++ pubspec.lock | 32 +++ pubspec.yaml | 14 +- 8 files changed, 394 insertions(+), 102 deletions(-) create mode 100644 android/app/src/main/res/drawable/logo.png delete mode 100644 lib/src/views/profile_view.dart create mode 100644 lib/src/views/settings/settings_main_view.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 4ac8c8b..0adb1be 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -7,22 +7,25 @@ plugins { android { namespace = "com.example.connect" - compileSdk = flutter.compileSdkVersion + // compileSdk = flutter.compileSdkVersion + compileSdk 34 //ndkVersion = flutter.ndkVersion ndkVersion = "25.1.8937393" compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 + coreLibraryDesugaringEnabled true + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { - jvmTarget = 17 + jvmTarget = "1.8" } defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId = "eu.twonly" + multiDexEnabled true // You can update the following values to match your application needs. // For more information, see: https://flutter.dev/to/review-gradle-config. minSdk = flutter.minSdkVersion @@ -43,3 +46,7 @@ android { flutter { source = "../.." } + +dependencies { + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.2.2' +} \ No newline at end of file diff --git a/android/app/src/main/res/drawable/logo.png b/android/app/src/main/res/drawable/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8b5e60841733d4b82d76f0eba36e15126f6b08cc GIT binary patch literal 18028 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 selectNotificationStream = + StreamController.broadcast(); + +const MethodChannel platform = + MethodChannel('dexterx.dev/flutter_local_notifications_example'); + +const String portName = 'notification_send_port'; + +class ReceivedNotification { + ReceivedNotification({ + required this.id, + required this.title, + required this.body, + required this.payload, + this.data, + }); + + final int id; + final String? title; + final String? body; + final String? payload; + final Map? data; +} + +String? selectedNotificationPayload; + +/// A notification action which triggers a url launch event +const String urlLaunchActionId = 'id_1'; + +/// A notification action which triggers a App navigation event +const String navigationActionId = 'id_3'; + +/// Defines a iOS/MacOS notification category for text input actions. +const String darwinNotificationCategoryText = 'textCategory'; + +/// Defines a iOS/MacOS notification category for plain actions. +const String darwinNotificationCategoryPlain = 'plainCategory'; + +@pragma('vm:entry-point') +void notificationTapBackground(NotificationResponse notificationResponse) { + // ignore: avoid_print + print('notification(${notificationResponse.id}) action tapped: ' + '${notificationResponse.actionId} with' + ' payload: ${notificationResponse.payload}'); + if (notificationResponse.input?.isNotEmpty ?? false) { + // ignore: avoid_print + print( + 'notification action tapped with input: ${notificationResponse.input}'); + } +} + +final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = + FlutterLocalNotificationsPlugin(); + +int id = 0; + +Future setupPushNotification() async { + const AndroidInitializationSettings initializationSettingsAndroid = + AndroidInitializationSettings("logo"); + + final List darwinNotificationCategories = + [ + DarwinNotificationCategory( + darwinNotificationCategoryText, + actions: [ + DarwinNotificationAction.text( + 'text_1', + 'Action 1', + buttonTitle: 'Send', + placeholder: 'Placeholder', + ), + ], + ), + DarwinNotificationCategory( + darwinNotificationCategoryPlain, + actions: [ + DarwinNotificationAction.plain('id_1', 'Action 1'), + DarwinNotificationAction.plain( + 'id_2', + 'Action 2 (destructive)', + options: { + DarwinNotificationActionOption.destructive, + }, + ), + DarwinNotificationAction.plain( + navigationActionId, + 'Action 3 (foreground)', + options: { + DarwinNotificationActionOption.foreground, + }, + ), + DarwinNotificationAction.plain( + 'id_4', + 'Action 4 (auth required)', + options: { + DarwinNotificationActionOption.authenticationRequired, + }, + ), + ], + options: { + DarwinNotificationCategoryOption.hiddenPreviewShowTitle, + }, + ) + ]; + + /// Note: permissions aren't requested here just to demonstrate that can be + /// done later + final DarwinInitializationSettings initializationSettingsDarwin = + DarwinInitializationSettings( + requestAlertPermission: false, + requestBadgePermission: false, + requestSoundPermission: false, + notificationCategories: darwinNotificationCategories, + ); + + final InitializationSettings initializationSettings = InitializationSettings( + android: initializationSettingsAndroid, + iOS: initializationSettingsDarwin, + ); + + await flutterLocalNotificationsPlugin.initialize( + initializationSettings, + onDidReceiveNotificationResponse: selectNotificationStream.add, + onDidReceiveBackgroundNotificationResponse: notificationTapBackground, + ); +} + void main() async { final settingsController = SettingsChangeProvider(); @@ -34,6 +167,8 @@ void main() async { } }); + setupPushNotification(); + await initMediaStorage(); dbProvider = DbProvider(); diff --git a/lib/src/views/chats/chat_list_view.dart b/lib/src/views/chats/chat_list_view.dart index 6ce12d2..1640c1e 100644 --- a/lib/src/views/chats/chat_list_view.dart +++ b/lib/src/views/chats/chat_list_view.dart @@ -16,7 +16,7 @@ import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/views/chats/chat_item_details_view.dart'; import 'package:twonly/src/views/home_view.dart'; import 'package:twonly/src/views/chats/media_viewer_view.dart'; -import 'package:twonly/src/views/profile_view.dart'; +import 'package:twonly/src/views/settings/settings_main_view.dart'; import 'package:twonly/src/views/chats/search_username_view.dart'; import 'package:flutter/material.dart'; diff --git a/lib/src/views/profile_view.dart b/lib/src/views/profile_view.dart deleted file mode 100644 index 5611bdc..0000000 --- a/lib/src/views/profile_view.dart +++ /dev/null @@ -1,87 +0,0 @@ -import 'package:provider/provider.dart'; -import 'package:twonly/src/model/json/user_data.dart'; -import 'package:restart_app/restart_app.dart'; -import 'package:flutter/material.dart'; -import 'package:twonly/src/providers/settings_change_provider.dart'; -import 'package:twonly/src/utils/storage.dart'; - -class ProfileView extends StatefulWidget { - const ProfileView({super.key}); - - // final SettingsController settingsController; - - @override - State createState() => _ProfileViewState(); -} - -class _ProfileViewState extends State { - final Future _userData = getUser(); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: FutureBuilder( - future: _userData, - builder: (context, snap) { - if (snap.hasData) { - return Text("Settings"); - // return Text("Hello ${snap.data!.username}!"); - } else { - return Container(); - } - }, - ), - ), - body: Column( - children: [ - Padding( - padding: const EdgeInsets.all(16), - // Glue the SettingsController to the theme selection DropdownButton. - // - // When a user selects a theme from the dropdown list, the - // SettingsController is updated, which rebuilds the MaterialApp. - child: DropdownButton( - // Read the selected themeMode from the controller - value: context.watch().themeMode, - // Call the updateThemeMode method any time the user selects a theme. - onChanged: (theme) { - context.read().updateThemeMode(theme); - }, - items: const [ - DropdownMenuItem( - value: ThemeMode.system, - child: Text('System Theme'), - ), - DropdownMenuItem( - value: ThemeMode.light, - child: Text('Light Theme'), - ), - DropdownMenuItem( - value: ThemeMode.dark, - child: Text('Dark Theme'), - ) - ], - ), - ), - ElevatedButton( - onPressed: () { - showLicensePage(context: context); - }, - child: Text('Show Licenses'), - ), - FilledButton.icon( - onPressed: () async { - await deleteLocalUserData(); - Restart.restartApp( - notificationTitle: 'Successfully logged out', - notificationBody: 'Click here to open the app again', - ); - }, - label: Text("Logout"), - icon: Icon(Icons.no_accounts), - ), - ], - )); - } -} diff --git a/lib/src/views/settings/settings_main_view.dart b/lib/src/views/settings/settings_main_view.dart new file mode 100644 index 0000000..9577004 --- /dev/null +++ b/lib/src/views/settings/settings_main_view.dart @@ -0,0 +1,211 @@ +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:provider/provider.dart'; +import 'package:twonly/main.dart'; +import 'package:twonly/src/components/initialsavatar.dart'; +import 'package:twonly/src/model/json/user_data.dart'; +import 'package:restart_app/restart_app.dart'; +import 'package:flutter/material.dart'; +import 'package:twonly/src/providers/settings_change_provider.dart'; +import 'package:twonly/src/utils/storage.dart'; + +class ProfileView extends StatefulWidget { + const ProfileView({super.key}); + + @override + State createState() => _ProfileViewState(); +} + +class _ProfileViewState extends State { + UserData? userData; + + @override + void initState() { + super.initState(); + initAsync(); + } + + Future initAsync() async { + userData = await getUser(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("Settings"), + ), + body: (userData == null) + ? null + : ListView( + children: [ + Padding( + padding: const EdgeInsets.all(30), + child: Row( + children: [ + InitialsAvatar( + displayName: userData!.username, + fontSize: 30, + ), + SizedBox(width: 20), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + userData!.displayName, + style: TextStyle(fontSize: 20), + textAlign: TextAlign.left, + ), + Text( + userData!.username, + style: TextStyle( + fontSize: 14, + ), + textAlign: TextAlign.left, + ), + ], + ), + ), + Align( + alignment: Alignment.centerRight, + child: IconButton( + onPressed: () {}, + icon: FaIcon(FontAwesomeIcons.qrcode), + ), + ) + ], + ), + ), + SettingsListTile( + icon: FontAwesomeIcons.user, + text: "Konto", + onTap: () {}, + ), + SettingsListTile( + icon: FontAwesomeIcons.shieldHeart, + text: "Subscription", + onTap: () {}, + ), + const Divider(), + SettingsListTile( + icon: FontAwesomeIcons.sun, + text: "Darstellung", + onTap: () {}, + ), + SettingsListTile( + icon: FontAwesomeIcons.lock, + text: "Datenschutz", + onTap: () {}, + ), + SettingsListTile( + icon: FontAwesomeIcons.bell, + text: "Benachrichtigungen", + onTap: () async { + const AndroidNotificationDetails + androidNotificationDetails = AndroidNotificationDetails( + '0', + 'Messages', + channelDescription: 'Messages from other users.', + importance: Importance.max, + priority: Priority.high, + ticker: 'ticker', + ); + const NotificationDetails notificationDetails = + NotificationDetails( + android: androidNotificationDetails); + await flutterLocalNotificationsPlugin.show(0, 'New message', + 'You got a new message from XX', notificationDetails, + payload: 'item x'); + }, + ), + const Divider(), + SettingsListTile( + icon: FontAwesomeIcons.circleQuestion, + text: "Help", + onTap: () {}, + ), + // Padding( + // padding: const EdgeInsets.all(16), + // // Glue the SettingsController to the theme selection DropdownButton. + // // + // // When a user selects a theme from the dropdown list, the + // // SettingsController is updated, which rebuilds the MaterialApp. + // child: DropdownButton( + // // Read the selected themeMode from the controller + // value: context.watch().themeMode, + // // Call the updateThemeMode method any time the user selects a theme. + // onChanged: (theme) { + // context + // .read() + // .updateThemeMode(theme); + // }, + // items: const [ + // DropdownMenuItem( + // value: ThemeMode.system, + // child: Text('System Theme'), + // ), + // DropdownMenuItem( + // value: ThemeMode.light, + // child: Text('Light Theme'), + // ), + // DropdownMenuItem( + // value: ThemeMode.dark, + // child: Text('Dark Theme'), + // ) + // ], + // ), + // ), + // ElevatedButton( + // onPressed: () { + // showLicensePage(context: context); + // }, + // child: Text('Show Licenses'), + // ), + // FilledButton.icon( + // onPressed: () async { + // await deleteLocalUserData(); + // Restart.restartApp( + // notificationTitle: 'Successfully logged out', + // notificationBody: 'Click here to open the app again', + // ); + // }, + // label: Text("Logout"), + // icon: Icon(Icons.no_accounts), + // ), + ], + ), + ); + } +} + +class SettingsListTile extends StatelessWidget { + final IconData icon; + final String text; + final VoidCallback onTap; + + const SettingsListTile({ + super.key, + required this.icon, + required this.text, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + return ListTile( + leading: Padding( + padding: const EdgeInsets.only( + right: 10, + left: 19, + ), + child: FaIcon( + icon, + size: 20, + ), + ), + title: Text(text), + onTap: onTap, + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index 25c0208..cd125d8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -427,6 +427,30 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.0" + flutter_local_notifications: + dependency: "direct main" + description: + name: flutter_local_notifications + sha256: ef41ae901e7529e52934feba19ed82827b11baa67336829564aeab3129460610 + url: "https://pub.dev" + source: hosted + version: "18.0.1" + flutter_local_notifications_linux: + dependency: transitive + description: + name: flutter_local_notifications_linux + sha256: "8f685642876742c941b29c32030f6f4f6dacd0e4eaecb3efbb187d6a3812ca01" + url: "https://pub.dev" + source: hosted + version: "5.0.0" + flutter_local_notifications_platform_interface: + dependency: transitive + description: + name: flutter_local_notifications_platform_interface + sha256: "6c5b83c86bf819cdb177a9247a3722067dd8cc6313827ce7c77a4b238a26fd52" + url: "https://pub.dev" + source: hosted + version: "8.0.0" flutter_localizations: dependency: "direct main" description: flutter @@ -1167,6 +1191,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.3" + timezone: + dependency: transitive + description: + name: timezone + sha256: ffc9d5f4d1193534ef051f9254063fa53d588609418c84299956c3db9383587d + url: "https://pub.dev" + source: hosted + version: "0.10.0" timing: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 7b6b9fb..10b32d7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -20,6 +20,7 @@ dependencies: flutter: sdk: flutter flutter_image_compress: ^2.4.0 + flutter_local_notifications: ^18.0.1 flutter_localizations: sdk: flutter flutter_secure_storage: ^9.2.2 @@ -74,13 +75,6 @@ flutter: assets: # Add assets from the images directory to the application. - - assets/images/ - - assets/animations/present.lottie.json - - assets/animations/selfie2.json - - assets/animations/messages.json - - assets/animations/local.json - - assets/animations/test.json - - assets/animations/product.json - - assets/animations/twonlies.json - - assets/animations/rocket.json - - assets/animations/e2e.json + # - assets/images/ + # - assets/images/logo.jpg + - assets/