Add licenses page (#227)

* Add licenses page

* Use PlatformListTile

* Use platform-specific icons

* More style fixes

* Switch back to using SimplePage

* Make title widget const

* Remove unused imports
This commit is contained in:
Caleb Jasik 2025-01-24 13:37:28 -06:00 committed by GitHub
parent 21d8265f42
commit 5afc1ef692
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 114 additions and 4 deletions

1
.gitignore vendored
View file

@ -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/

View file

@ -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

View file

@ -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 {

View file

@ -1,5 +1,3 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';

View file

@ -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<AboutScreen> {
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),

View file

@ -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),
),
],
),
),
),
),
);
}
}

View file

@ -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:

View file

@ -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