diff --git a/.gitignore b/.gitignore index 51c39e0..019463c 100644 --- a/.gitignore +++ b/.gitignore @@ -45,6 +45,7 @@ lib/generated_plugin_registrant.dart /env.sh /lib/gen.versions.dart /lib/.gen.versions.dart +/lib/oss_licenses.dart /ios/Flutter/.last_build_id /local.properties /.gradle/ diff --git a/gen-artifacts.sh b/gen-artifacts.sh index c915adc..bb8acfa 100755 --- a/gen-artifacts.sh +++ b/gen-artifacts.sh @@ -50,3 +50,6 @@ cd .. # Try and avoid issues with building by moving into place after we are complete #TODO: this might be a parallel build of deps issue in kotlin, might need to solve there mv lib/.gen.versions.dart lib/gen.versions.dart + +# Generate licenses library +flutter pub run flutter_oss_licenses:generate.dart diff --git a/lib/components/SimplePage.dart b/lib/components/SimplePage.dart index a6205fe..df4b6e4 100644 --- a/lib/components/SimplePage.dart +++ b/lib/components/SimplePage.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; -import 'package:mobile_nebula/services/utils.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; enum SimpleScrollable { diff --git a/lib/components/SiteTitle.dart b/lib/components/SiteTitle.dart index 55b3ed6..58a50ea 100644 --- a/lib/components/SiteTitle.dart +++ b/lib/components/SiteTitle.dart @@ -1,5 +1,3 @@ -import 'dart:io'; - import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; diff --git a/lib/screens/AboutScreen.dart b/lib/screens/AboutScreen.dart index 74055aa..44b96cc 100644 --- a/lib/screens/AboutScreen.dart +++ b/lib/screens/AboutScreen.dart @@ -5,6 +5,7 @@ import 'package:mobile_nebula/components/config/ConfigItem.dart'; import 'package:mobile_nebula/components/config/ConfigPageItem.dart'; import 'package:mobile_nebula/components/config/ConfigSection.dart'; import 'package:mobile_nebula/gen.versions.dart'; +import 'package:mobile_nebula/screens/LicensesScreen.dart'; import 'package:mobile_nebula/services/utils.dart'; import 'package:package_info_plus/package_info_plus.dart'; @@ -68,7 +69,12 @@ class _AboutScreenState extends State { label: Text('Privacy policy'), labelWidth: 300, onPressed: () => Utils.launchUrl('https://www.defined.net/privacy/', context)), -// ConfigPageItem(label: Text('Licenses'), labelWidth: 300, onPressed: () => Utils.launchUrl('https://defined.net/mobile/license', context)), + ConfigPageItem( + label: Text('Licenses'), + labelWidth: 300, + onPressed: () => Utils.openPage(context, (context) { + return LicensesScreen(); + })), ]), Padding( padding: EdgeInsets.only(top: 20), diff --git a/lib/screens/LicensesScreen.dart b/lib/screens/LicensesScreen.dart new file mode 100644 index 0000000..0ddcd6b --- /dev/null +++ b/lib/screens/LicensesScreen.dart @@ -0,0 +1,78 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; +import 'package:mobile_nebula/components/SimplePage.dart'; +import 'package:mobile_nebula/services/utils.dart'; +import '../../oss_licenses.dart'; + +String capitalize(String input) { + return input[0].toUpperCase() + input.substring(1); +} + +class LicensesScreen extends StatelessWidget { + const LicensesScreen({super.key}); + + @override + Widget build(BuildContext context) { + return SimplePage( + title: const Text("Licences"), + scrollable: SimpleScrollable.none, + child: ListView.builder( + itemCount: allDependencies.length, + itemBuilder: (_, index) { + var dep = allDependencies[index]; + return Padding( + padding: const EdgeInsets.all(8), + child: PlatformListTile( + onTap: () { + Utils.openPage( + context, + (_) => LicenceDetailPage( + title: capitalize(dep.name), + licence: dep.license!, + ), + ); + }, + title: Text( + capitalize(dep.name), + ), + subtitle: Text(dep.description), + trailing: Icon(context.platformIcons.forward, size: 18)), + ); + }, + ), + ); + } +} + +//detail page for the licence +class LicenceDetailPage extends StatelessWidget { + final String title, licence; + const LicenceDetailPage({super.key, required this.title, required this.licence}); + + @override + Widget build(BuildContext context) { + return SimplePage( + title: Text(title), + scrollable: SimpleScrollable.none, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + padding: const EdgeInsets.all(5), + decoration: BoxDecoration(borderRadius: BorderRadius.circular(8)), + child: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: Column( + children: [ + Text( + licence, + style: const TextStyle(fontSize: 15), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index 2c6a83b..899a952 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -89,6 +89,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.8" + dart_pubspec_licenses: + dependency: transitive + description: + name: dart_pubspec_licenses + sha256: "23ddb78ff9204d08e3109ced67cd3c6c6a066f581b0edf5ee092fc3e1127f4ea" + url: "https://pub.dev" + source: hosted + version: "3.0.4" fake_async: dependency: transitive description: @@ -134,6 +142,14 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_oss_licenses: + dependency: "direct dev" + description: + name: flutter_oss_licenses + sha256: e4bbaeb00bc768e8430ee0c95ad304d2f256fb15194d30b912cea269871c8885 + url: "https://pub.dev" + source: hosted + version: "3.0.4" flutter_platform_widgets: dependency: "direct main" description: @@ -216,6 +232,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.19.0" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + url: "https://pub.dev" + source: hosted + version: "4.9.0" leak_tracker: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 385b841..ee65b60 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -41,6 +41,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter + flutter_oss_licenses: ^3.0.4 # For information on the generic Dart part of this file, see the