diff --git a/.github/workflows/create-github-release.yml b/.github/workflows/create-github-release.yml index 6f10163..127baaa 100644 --- a/.github/workflows/create-github-release.yml +++ b/.github/workflows/create-github-release.yml @@ -45,6 +45,7 @@ jobs: - name: Get packages and run codegen run: | bash install_dependencies.sh + bash update_changelogs.sh working-directory: scripts - name: Setup Fastlane diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 6dd1ae6..311f992 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -58,6 +58,7 @@ jobs: - name: Get packages and run codegen run: | bash install_dependencies.sh + bash update_changelogs.sh working-directory: scripts - name: Setup Fastlane diff --git a/.github/workflows/release-deploy-play-store.yml b/.github/workflows/release-deploy-play-store.yml index 3de2f2f..2e127be 100644 --- a/.github/workflows/release-deploy-play-store.yml +++ b/.github/workflows/release-deploy-play-store.yml @@ -52,6 +52,7 @@ jobs: - name: Get packages and run codegen run: | bash install_dependencies.sh + bash update_changelogs.sh working-directory: scripts - name: Setup Fastlane diff --git a/.gitignore b/.gitignore index e3f4e8f..baa78f0 100644 --- a/.gitignore +++ b/.gitignore @@ -74,3 +74,5 @@ docker/ crowdin_credentials.yml +# Changelogs +assets/changelogs/*.md \ No newline at end of file diff --git a/android/fastlane/metadata/android/de-DE/changelogs/28.txt b/android/fastlane/metadata/android/de-DE/changelogs/28.txt index 3ba0589..47dc978 100644 --- a/android/fastlane/metadata/android/de-DE/changelogs/28.txt +++ b/android/fastlane/metadata/android/de-DE/changelogs/28.txt @@ -1,4 +1,4 @@ -Diese Version ist eine Betaversion und enthält neue Features und Umstrukturierungen. Deshalb wird empfohlen, die App neu zu installieren! +### Diese Version ist eine Betaversion und enthält neue Features und Umstrukturierungen. Deshalb wird empfohlen, die App neu zu installieren! * Neues Feature: Massenbearbeitung von Dokumenten. * Neues Feature: Unterstützung für mehrere Accounts und mehrere Instanzen mit schnellem Wechsel zwischen diesen (Achtung: Die in paperless-ngx 1.14.0 neu hinzugefügten Berechtigungen sind hier noch nicht enthalten!) * Bugfixes \ No newline at end of file diff --git a/android/fastlane/metadata/android/de-DE/changelogs/33.txt b/android/fastlane/metadata/android/de-DE/changelogs/33.txt index 0ecf050..0ac22ac 100644 --- a/android/fastlane/metadata/android/de-DE/changelogs/33.txt +++ b/android/fastlane/metadata/android/de-DE/changelogs/33.txt @@ -1,4 +1,4 @@ -Dies ist eine Beta Version und noch work in progress! Diese Version wurde mit paperless-ngx 1.13.0 sowie 1.14.2 getestet. +### Dies ist eine Beta Version und noch work in progress! Diese Version wurde mit paperless-ngx 1.13.0 sowie 1.14.2 getestet. * Beheben einiger Fehler, die durch API-Update zustande kamen * Berechtigungs-Checks bei wichtigen Funktionen (noch nicht vollständig) * Neue Einstellungen für den Standard Dateityp beim Downloaden/Teilen \ No newline at end of file diff --git a/android/fastlane/metadata/android/de-DE/changelogs/47.txt b/android/fastlane/metadata/android/de-DE/changelogs/47.txt index a395e9e..34980cb 100644 --- a/android/fastlane/metadata/android/de-DE/changelogs/47.txt +++ b/android/fastlane/metadata/android/de-DE/changelogs/47.txt @@ -1,5 +1,4 @@ -DISCLAIMER: Major Update mit potentiellen breaking changes - eine Neuinstallation wird dringend empfohlen! - +### DISCLAIMER: Major Update mit potentiellen breaking changes - eine Neuinstallation wird dringend empfohlen! * Neue Startseite hinzugefügt * Viele Fehlerbehebungen * Verbesserte Unterstützung für mehrere Accounts/Benutzer diff --git a/android/fastlane/metadata/android/de-DE/changelogs/49.txt b/android/fastlane/metadata/android/de-DE/changelogs/49.txt index 0bb872c..20d2ad1 100644 --- a/android/fastlane/metadata/android/de-DE/changelogs/49.txt +++ b/android/fastlane/metadata/android/de-DE/changelogs/49.txt @@ -1 +1 @@ -Beheben eines Fehlers, durch welchen die App bei Paperless Versionen vor 1.14.0 nicht mehr startete \ No newline at end of file +### Beheben eines Fehlers, durch welchen die App bei Paperless Versionen vor 1.14.0 nicht mehr startete \ No newline at end of file diff --git a/android/fastlane/metadata/android/de-DE/changelogs/53.txt b/android/fastlane/metadata/android/de-DE/changelogs/53.txt new file mode 100644 index 0000000..58b9d72 --- /dev/null +++ b/android/fastlane/metadata/android/de-DE/changelogs/53.txt @@ -0,0 +1,2 @@ +* Neu: Anzeigen von Changelogs beim ersten Appstart mit neuer Version +* Kleinere Fixes \ No newline at end of file diff --git a/android/fastlane/metadata/android/en-US/changelogs/28.txt b/android/fastlane/metadata/android/en-US/changelogs/28.txt index 1153193..8c9dc80 100644 --- a/android/fastlane/metadata/android/en-US/changelogs/28.txt +++ b/android/fastlane/metadata/android/en-US/changelogs/28.txt @@ -1,4 +1,4 @@ -This version is a beta and contains new features and some restructurings. Therefore it is highly recommended to perform a fresh installation of the app. +### This version is a beta and contains new features and some restructurings. Therefore it is highly recommended to perform a fresh installation of the app. * New feature: Document bulk edits * New feature: Support for multiple accounts and multiple instances with quick switching between them (Note: This does not yet include the new multi-user features introduced in paperless-ngx 1.14.0!) * Bugfixes \ No newline at end of file diff --git a/android/fastlane/metadata/android/en-US/changelogs/33.txt b/android/fastlane/metadata/android/en-US/changelogs/33.txt index e0b2e47..b112f6b 100644 --- a/android/fastlane/metadata/android/en-US/changelogs/33.txt +++ b/android/fastlane/metadata/android/en-US/changelogs/33.txt @@ -1,4 +1,4 @@ -This is a beta version and still work in progress! This version was tested with paperless-ngx 1.3.0 as well as 1.14.2. +### This is a beta version and still work in progress! This version was tested with paperless-ngx 1.3.0 as well as 1.14.2. * Fixes some bugs which were caused by breaking changes to the Paperless API. * Permission checks for major features (upload, edit, view documents etc., not complete yet) * Add setting to set default download/share file type \ No newline at end of file diff --git a/android/fastlane/metadata/android/en-US/changelogs/47.txt b/android/fastlane/metadata/android/en-US/changelogs/47.txt index d23f937..47e765f 100644 --- a/android/fastlane/metadata/android/en-US/changelogs/47.txt +++ b/android/fastlane/metadata/android/en-US/changelogs/47.txt @@ -1,5 +1,4 @@ -DISCLAIMER: Major update with possibly breaking changes - a fresh install is highly recommended! - +### DISCLAIMER: Major update with possibly breaking changes - a fresh install is highly recommended! * Added new home page * Tons of bugfixes * Improved support for multiple accounts/users diff --git a/android/fastlane/metadata/android/en-US/changelogs/49.txt b/android/fastlane/metadata/android/en-US/changelogs/49.txt index f49e2b4..754f3c7 100644 --- a/android/fastlane/metadata/android/en-US/changelogs/49.txt +++ b/android/fastlane/metadata/android/en-US/changelogs/49.txt @@ -1 +1 @@ -Fix bug where app would not login with paperless versions before 1.14.0 \ No newline at end of file +* Fix bug where app would not login with paperless versions before 1.14.0 \ No newline at end of file diff --git a/android/fastlane/metadata/android/en-US/changelogs/53.txt b/android/fastlane/metadata/android/en-US/changelogs/53.txt new file mode 100644 index 0000000..44d38f2 --- /dev/null +++ b/android/fastlane/metadata/android/en-US/changelogs/53.txt @@ -0,0 +1,2 @@ +* New: Show changelogs the first time the app is opened +* Some minor fixes \ No newline at end of file diff --git a/lib/core/widgets/paperless_logo.dart b/lib/core/widgets/paperless_logo.dart index 38e3b0e..e3bfb56 100644 --- a/lib/core/widgets/paperless_logo.dart +++ b/lib/core/widgets/paperless_logo.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:paperless_mobile/generated/assets.gen.dart'; class PaperlessLogo extends StatelessWidget { static const _paperlessGreen = Color(0xFF18541F); @@ -25,15 +26,16 @@ class PaperlessLogo extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - constraints: BoxConstraints( - maxHeight: height ?? Theme.of(context).iconTheme.size ?? 32, - maxWidth: width ?? Theme.of(context).iconTheme.size ?? 32, - ), - padding: const EdgeInsets.only(right: 8), - child: SvgPicture.asset( - "assets/logos/paperless_logo_white.svg", - color: _color, - ), - ); + constraints: BoxConstraints( + maxHeight: height ?? Theme.of(context).iconTheme.size ?? 32, + maxWidth: width ?? Theme.of(context).iconTheme.size ?? 32, + ), + padding: const EdgeInsets.only(right: 8), + child: Assets.logos.paperlessLogoWhiteSvg.svg( + colorFilter: ColorFilter.mode( + _color, + BlendMode.srcIn, + ), + )); } } diff --git a/lib/features/app_drawer/view/app_drawer.dart b/lib/features/app_drawer/view/app_drawer.dart index 9b1d1dc..ad7bed7 100644 --- a/lib/features/app_drawer/view/app_drawer.dart +++ b/lib/features/app_drawer/view/app_drawer.dart @@ -5,17 +5,20 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:paperless_mobile/constants.dart'; import 'package:paperless_mobile/core/database/tables/local_user_account.dart'; +import 'package:paperless_mobile/core/global/asset_images.dart'; import 'package:paperless_mobile/core/widgets/hint_card.dart'; import 'package:paperless_mobile/core/widgets/paperless_logo.dart'; import 'package:paperless_mobile/extensions/flutter_extensions.dart'; import 'package:paperless_mobile/features/documents/cubit/documents_cubit.dart'; import 'package:paperless_mobile/features/saved_view/cubit/saved_view_cubit.dart'; import 'package:paperless_mobile/features/sharing/cubit/receive_share_cubit.dart'; +import 'package:paperless_mobile/generated/assets.gen.dart'; import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; import 'package:paperless_mobile/routes/typed/branches/documents_route.dart'; import 'package:paperless_mobile/routes/typed/branches/saved_views_route.dart'; import 'package:paperless_mobile/routes/typed/branches/upload_queue_route.dart'; import 'package:paperless_mobile/routes/typed/shells/authenticated_route.dart'; +import 'package:paperless_mobile/routes/typed/top_level/changelog_route.dart'; import 'package:paperless_mobile/routes/typed/top_level/settings_route.dart'; import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher_string.dart'; @@ -95,7 +98,7 @@ class AppDrawer extends StatelessWidget { ), actionsAlignment: MainAxisAlignment.spaceBetween, actions: [ - Text("~ Anton"), + const Text("~ Anton"), TextButton( onPressed: Navigator.of(context).pop, child: Text(S.of(context)!.gotIt), @@ -105,6 +108,14 @@ class AppDrawer extends StatelessWidget { ); }, ), + ListTile( + dense: true, + leading: const Icon(Icons.history), + title: Text(S.of(context)!.changelog), + onTap: () { + ChangelogRoute().push(context); + }, + ), ListTile( dense: true, leading: const Icon(Icons.bug_report_outlined), @@ -127,9 +138,11 @@ class AppDrawer extends StatelessWidget { ), ListTile( dense: true, - leading: SvgPicture.asset( - "assets/images/github-mark.svg", - color: Theme.of(context).colorScheme.onBackground, + leading: Assets.images.githubMark.svg( + colorFilter: ColorFilter.mode( + Theme.of(context).colorScheme.onBackground, + BlendMode.srcIn, + ), height: 24, width: 24, ), @@ -215,7 +228,7 @@ class AppDrawer extends StatelessWidget { const CreateSavedViewRoute(showInSidebar: true) .push(context); }, - icon: Icon(Icons.add), + icon: const Icon(Icons.add), label: Text(S.of(context)!.newView), ), ], @@ -227,7 +240,7 @@ class AppDrawer extends StatelessWidget { final view = sidebarViews[index]; return ListTile( title: Text(view.name), - trailing: Icon(Icons.arrow_forward), + trailing: const Icon(Icons.arrow_forward), onTap: () { Scaffold.of(context).closeDrawer(); context diff --git a/lib/features/changelogs/view/changelog_dialog.dart b/lib/features/changelogs/view/changelog_dialog.dart new file mode 100644 index 0000000..8aa6fec --- /dev/null +++ b/lib/features/changelogs/view/changelog_dialog.dart @@ -0,0 +1,118 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_markdown/flutter_markdown.dart'; +import 'package:go_router/go_router.dart'; +import 'package:paperless_mobile/extensions/flutter_extensions.dart'; +import 'package:paperless_mobile/generated/l10n/app_localizations.dart'; +import 'package:paperless_mobile/theme.dart'; + +class ChangelogDialog extends StatelessWidget { + const ChangelogDialog({super.key}); + + @override + Widget build(BuildContext context) { + return AlertDialog( + contentPadding: EdgeInsets.zero, + actionsPadding: const EdgeInsets.all(4), + title: Text(S.of(context)!.changelog), + content: FutureBuilder( + future: _loadChangelog(context), + builder: (context, snapshot) { + if (!snapshot.hasData) { + return const Center( + child: CircularProgressIndicator(), + ).padded(24); + } + return SizedBox( + width: 1000, + child: Markdown( + data: snapshot.data!, + ), + ); + }, + ), + actions: [ + TextButton( + child: Text(S.of(context)!.close), + onPressed: () { + context.pop(); + }, + ), + ], + ); + } + + Future _loadChangelog(BuildContext context) async { + final languageCode = Localizations.localeOf(context).languageCode; + final locale = switch (languageCode) { + 'de' => 'de-DE', + _ => 'en-US', + }; + 'en-US'; + String changelog = await rootBundle.loadString( + 'assets/changelogs/changelogs_$locale.md', + ); + for (var versionNumber in _versionNumbers.keys) { + changelog = changelog.replaceFirst( + RegExp('# $versionNumber'), + '# v${_versionNumbers[versionNumber]!}', + ); + } + return changelog; + } +} + +const _versionNumbers = { + "53": "3.0.6", + "52": "3.0.5", + "51": "3.0.4", + "50": "3.0.3", + "49": "3.0.2", + "48": "3.0.1", + "47": "3.0.0", + "46": "2.3.11", + "45": "2.3.10", + "44": "2.3.9", + "43": "2.3.8", + "42": "2.3.7", + "41": "2.3.6", + "40": "2.3.5", + "39": "2.3.4", + "38": "2.3.3", + "37": "2.3.2", + "36": "2.3.1", + "35": "2.3.0", + "34": "2.2.6", + "33": "2.2.5", + "32": "2.2.4", + "31": "2.2.3", + "30": "2.2.2", + "29": "2.2.1", + "28": "2.2.0", + "27": "2.1.0", + "26": "2.0.9", + "25": "2.0.8", + "24": "2.0.7", + "23": "2.0.6", + "22": "2.0.5", + "21": "2.0.4", + "20": "2.0.3", + "19": "2.0.2", + "18": "2.0.1", + "17": "2.0.0", + "16": "1.5.3", + "15": "1.5.2", + "14": "1.5.1", + "13": "1.5.0", + "12": "1.4.1", + "11": "1.4.0", + "10": "1.3.1", + "9": "1.3.0", + "8": "1.2.2", + "7": "1.2.1", + "6": "1.2.0", + "5": "1.1.0", + "3": "1.0.5", + "4": "1.0.6", + "2": "1.0.4", +}; diff --git a/lib/features/landing/view/landing_page.dart b/lib/features/landing/view/landing_page.dart index 0b494a8..78c7deb 100644 --- a/lib/features/landing/view/landing_page.dart +++ b/lib/features/landing/view/landing_page.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:paperless_api/paperless_api.dart'; +import 'package:paperless_mobile/constants.dart'; import 'package:paperless_mobile/core/database/tables/local_user_account.dart'; import 'package:paperless_mobile/extensions/flutter_extensions.dart'; import 'package:paperless_mobile/features/app_drawer/view/app_drawer.dart'; @@ -14,6 +15,14 @@ import 'package:paperless_mobile/routes/typed/branches/documents_route.dart'; import 'package:paperless_mobile/routes/typed/branches/inbox_route.dart'; import 'package:paperless_mobile/routes/typed/branches/saved_views_route.dart'; import 'package:paperless_mobile/routes/typed/shells/authenticated_route.dart'; +import 'package:paperless_mobile/routes/typed/top_level/changelog_route.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class Changelog { + final int buildNumber; + final String? changelog; + Changelog(this.buildNumber, this.changelog); +} class LandingPage extends StatefulWidget { const LandingPage({super.key}); @@ -25,6 +34,34 @@ class LandingPage extends StatefulWidget { class _LandingPageState extends State { final _searchBarHandle = SliverOverlapAbsorberHandle(); + Future get _shouldShowChangelog async { + try { + final sp = await SharedPreferences.getInstance(); + final currentBuild = packageInfo.buildNumber; + final _existingVersions = + sp.getStringList('changelogSeenForBuilds') ?? []; + if (_existingVersions.contains(currentBuild)) { + return false; + } else { + _existingVersions.add(currentBuild); + await sp.setStringList('changelogSeenForBuilds', _existingVersions); + return true; + } + } catch (e) { + return false; + } + } + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { + if (await _shouldShowChangelog) { + ChangelogRoute().push(context); + } + }); + } + @override Widget build(BuildContext context) { final currentUser = context.watch().paperlessUser; @@ -187,18 +224,19 @@ class _LandingPageState extends State { titleTextStyle: Theme.of(context).textTheme.labelLarge, title: Text(S.of(context)!.totalCharacters), trailing: Text( - stats.totalChars.toString(), + (stats.totalChars ?? 0).toString(), style: Theme.of(context).textTheme.labelLarge, ), ), ), - AspectRatio( - aspectRatio: 1.3, - child: SizedBox( - width: 300, - child: MimeTypesPieChart(statistics: stats), + if (stats.fileTypeCounts.isNotEmpty) + AspectRatio( + aspectRatio: 1.3, + child: SizedBox( + width: 300, + child: MimeTypesPieChart(statistics: stats), + ), ), - ), ], ).padded(16); }, diff --git a/lib/l10n/intl_ca.arb b/lib/l10n/intl_ca.arb index bb1bd55..2a2c013 100644 --- a/lib/l10n/intl_ca.arb +++ b/lib/l10n/intl_ca.arb @@ -1000,5 +1000,6 @@ "discardChangesWarning": "Tens canvis sense desar. Si continues es perdran. Vols descartar els canvis?", "@discardChangesWarning": { "description": "Warning message shown when the user tries to close a route without saving the changes." - } + }, + "changelog": "Changelog" } \ No newline at end of file diff --git a/lib/l10n/intl_cs.arb b/lib/l10n/intl_cs.arb index 86c3bdb..3267615 100644 --- a/lib/l10n/intl_cs.arb +++ b/lib/l10n/intl_cs.arb @@ -1000,5 +1000,6 @@ "discardChangesWarning": "You have unsaved changes. By continuing, all changes will be lost. Do you want to discard these changes?", "@discardChangesWarning": { "description": "Warning message shown when the user tries to close a route without saving the changes." - } + }, + "changelog": "Changelog" } \ No newline at end of file diff --git a/lib/l10n/intl_de.arb b/lib/l10n/intl_de.arb index 05b20be..6438a81 100644 --- a/lib/l10n/intl_de.arb +++ b/lib/l10n/intl_de.arb @@ -1000,5 +1000,6 @@ "discardChangesWarning": "Du hast ungespeicherte Änderungen. Diese gehen verloren, falls du fortfährst. Möchtest du die Änderungen verwerfen?", "@discardChangesWarning": { "description": "Warning message shown when the user tries to close a route without saving the changes." - } + }, + "changelog": "Changelog" } \ No newline at end of file diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index e00aaf8..37a00a8 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -1000,5 +1000,6 @@ "discardChangesWarning": "You have unsaved changes. By continuing, all changes will be lost. Do you want to discard these changes?", "@discardChangesWarning": { "description": "Warning message shown when the user tries to close a route without saving the changes." - } + }, + "changelog": "Changelog" } \ No newline at end of file diff --git a/lib/l10n/intl_es.arb b/lib/l10n/intl_es.arb index f118d0a..daa10e5 100644 --- a/lib/l10n/intl_es.arb +++ b/lib/l10n/intl_es.arb @@ -1000,5 +1000,6 @@ "discardChangesWarning": "You have unsaved changes. By continuing, all changes will be lost. Do you want to discard these changes?", "@discardChangesWarning": { "description": "Warning message shown when the user tries to close a route without saving the changes." - } + }, + "changelog": "Changelog" } \ No newline at end of file diff --git a/lib/l10n/intl_fr.arb b/lib/l10n/intl_fr.arb index 3916fc9..8d81cb7 100644 --- a/lib/l10n/intl_fr.arb +++ b/lib/l10n/intl_fr.arb @@ -1000,5 +1000,6 @@ "discardChangesWarning": "You have unsaved changes. By continuing, all changes will be lost. Do you want to discard these changes?", "@discardChangesWarning": { "description": "Warning message shown when the user tries to close a route without saving the changes." - } + }, + "changelog": "Changelog" } \ No newline at end of file diff --git a/lib/l10n/intl_pl.arb b/lib/l10n/intl_pl.arb index 7e9205e..4a6fa14 100644 --- a/lib/l10n/intl_pl.arb +++ b/lib/l10n/intl_pl.arb @@ -1000,5 +1000,6 @@ "discardChangesWarning": "You have unsaved changes. By continuing, all changes will be lost. Do you want to discard these changes?", "@discardChangesWarning": { "description": "Warning message shown when the user tries to close a route without saving the changes." - } + }, + "changelog": "Changelog" } \ No newline at end of file diff --git a/lib/l10n/intl_ru.arb b/lib/l10n/intl_ru.arb index dbadfe6..42535d2 100644 --- a/lib/l10n/intl_ru.arb +++ b/lib/l10n/intl_ru.arb @@ -1000,5 +1000,6 @@ "discardChangesWarning": "You have unsaved changes. By continuing, all changes will be lost. Do you want to discard these changes?", "@discardChangesWarning": { "description": "Warning message shown when the user tries to close a route without saving the changes." - } + }, + "changelog": "Changelog" } \ No newline at end of file diff --git a/lib/l10n/intl_tr.arb b/lib/l10n/intl_tr.arb index 509aad7..a1c0e30 100644 --- a/lib/l10n/intl_tr.arb +++ b/lib/l10n/intl_tr.arb @@ -1000,5 +1000,6 @@ "discardChangesWarning": "You have unsaved changes. By continuing, all changes will be lost. Do you want to discard these changes?", "@discardChangesWarning": { "description": "Warning message shown when the user tries to close a route without saving the changes." - } + }, + "changelog": "Changelog" } \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 03d67ae..ef06c89 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -6,6 +6,7 @@ import 'package:device_info_plus/device_info_plus.dart'; import 'package:dynamic_color/dynamic_color.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_displaymode/flutter_displaymode.dart'; import 'package:flutter_native_splash/flutter_native_splash.dart'; @@ -39,6 +40,7 @@ import 'package:paperless_mobile/routes/navigation_keys.dart'; import 'package:paperless_mobile/routes/typed/branches/landing_route.dart'; import 'package:paperless_mobile/routes/typed/shells/authenticated_route.dart'; import 'package:paperless_mobile/routes/typed/top_level/add_account_route.dart'; +import 'package:paperless_mobile/routes/typed/top_level/changelog_route.dart'; import 'package:paperless_mobile/routes/typed/top_level/logging_out_route.dart'; import 'package:paperless_mobile/routes/typed/top_level/login_route.dart'; import 'package:paperless_mobile/theme.dart'; @@ -89,6 +91,7 @@ Future performMigrations() async { } } + Future _initHive() async { await Hive.initFlutter(); @@ -316,6 +319,7 @@ class _GoRouterShellState extends State { $loginRoute, $loggingOutRoute, $addAccountRoute, + $changelogRoute, $authenticatedRoute, ], ), diff --git a/lib/routes/typed/top_level/changelog_route.dart b/lib/routes/typed/top_level/changelog_route.dart new file mode 100644 index 0000000..a2acbba --- /dev/null +++ b/lib/routes/typed/top_level/changelog_route.dart @@ -0,0 +1,18 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:paperless_mobile/features/changelogs/view/changelog_dialog.dart'; +import 'package:paperless_mobile/routes/navigation_keys.dart'; +import 'package:paperless_mobile/routes/utils/dialog_page.dart'; + +part 'changelog_route.g.dart'; + +@TypedGoRoute(path: '/changelogs)') +class ChangelogRoute extends GoRouteData { + static final $parentNavigatorKey = rootNavigatorKey; + @override + Page buildPage(BuildContext context, GoRouterState state) { + return DialogPage( + builder: (context) => const ChangelogDialog(), + ); + } +} diff --git a/lib/routes/utils/dialog_page.dart b/lib/routes/utils/dialog_page.dart new file mode 100644 index 0000000..9b7cd67 --- /dev/null +++ b/lib/routes/utils/dialog_page.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; + +class DialogPage extends Page { + final Offset? anchorPoint; + final Color? barrierColor; + final bool barrierDismissible; + final String? barrierLabel; + final bool useSafeArea; + final CapturedThemes? themes; + final WidgetBuilder builder; + + const DialogPage({ + required this.builder, + this.anchorPoint, + this.barrierColor = Colors.black38, + this.barrierDismissible = true, + this.barrierLabel, + this.useSafeArea = true, + this.themes, + super.key, + super.name, + super.arguments, + super.restorationId, + }); + + @override + Route createRoute(BuildContext context) => DialogRoute( + context: context, + settings: this, + builder: (context) => Dialog( + child: builder(context), + ), + anchorPoint: anchorPoint, + barrierColor: barrierColor, + barrierDismissible: barrierDismissible, + barrierLabel: barrierLabel, + useSafeArea: useSafeArea, + themes: themes, + ); +} diff --git a/lib/theme.dart b/lib/theme.dart index 31d03a7..7331415 100644 --- a/lib/theme.dart +++ b/lib/theme.dart @@ -82,12 +82,14 @@ SystemUiOverlayStyle buildOverlayStyle( Brightness.light => SystemUiOverlayStyle.dark.copyWith( systemNavigationBarColor: color, systemNavigationBarDividerColor: color, + statusBarColor: theme.colorScheme.background, // statusBarColor: theme.colorScheme.background, // systemNavigationBarDividerColor: theme.colorScheme.surface, ), Brightness.dark => SystemUiOverlayStyle.light.copyWith( systemNavigationBarColor: color, systemNavigationBarDividerColor: color, + statusBarColor: theme.colorScheme.background, // statusBarColor: theme.colorScheme.background, // systemNavigationBarDividerColor: theme.colorScheme.surface, ), diff --git a/pubspec.lock b/pubspec.lock index 806dd9d..8585aac 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -225,6 +225,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.17.2" + color: + dependency: transitive + description: + name: color + sha256: ddcdf1b3badd7008233f5acffaf20ca9f5dc2cd0172b75f68f24526a5f5725cb + url: "https://pub.dev" + source: hosted + version: "3.0.0" connectivity_plus: dependency: "direct main" description: @@ -289,6 +297,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.2" + dartx: + dependency: transitive + description: + name: dartx + sha256: "8b25435617027257d43e6508b5fe061012880ddfdaa75a71d607c3de2a13d244" + url: "https://pub.dev" + source: hosted + version: "1.2.0" dbus: dependency: transitive description: @@ -492,6 +508,22 @@ packages: url: "https://pub.dev" source: hosted version: "8.0.0" + flutter_gen_core: + dependency: transitive + description: + name: flutter_gen_core + sha256: "8b4ff1d45d125e576e26ea99d15e0419bb3c45b53696e022880866b78bb6b830" + url: "https://pub.dev" + source: hosted + version: "5.3.2" + flutter_gen_runner: + dependency: "direct dev" + description: + name: flutter_gen_runner + sha256: fd197f8c657e79313d53d3934de602ebe604ba722a84c88ae3a43cd90428c67a + url: "https://pub.dev" + source: hosted + version: "5.3.2" flutter_html: dependency: "direct main" description: @@ -585,6 +617,14 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_markdown: + dependency: "direct main" + description: + name: flutter_markdown + sha256: "8afc9a6aa6d8e8063523192ba837149dbf3d377a37c0b0fc579149a1fbd4a619" + url: "https://pub.dev" + source: hosted + version: "0.6.18" flutter_native_splash: dependency: "direct main" description: @@ -661,10 +701,10 @@ packages: dependency: "direct main" description: name: flutter_svg - sha256: "6ff9fa12892ae074092de2fa6a9938fb21dbabfdaa2ff57dc697ff912fc8d4b2" + sha256: "8c5d68a82add3ca76d792f058b186a0599414f279f00ece4830b9b231b570338" url: "https://pub.dev" source: hosted - version: "1.1.6" + version: "2.0.7" flutter_test: dependency: "direct dev" description: flutter @@ -965,6 +1005,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + markdown: + dependency: transitive + description: + name: markdown + sha256: acf35edccc0463a9d7384e437c015a3535772e09714cf60e07eeef3a15870dcd + url: "https://pub.dev" + source: hosted + version: "7.1.1" matcher: dependency: transitive description: @@ -1099,14 +1147,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.8.3" - path_drawing: - dependency: transitive - description: - name: path_drawing - sha256: bbb1934c0cbb03091af082a6389ca2080345291ef07a5fa6d6e078ba8682f977 - url: "https://pub.dev" - source: hosted - version: "1.0.1" path_parsing: dependency: transitive description: @@ -1648,6 +1688,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.5.3" + time: + dependency: transitive + description: + name: time + sha256: "83427e11d9072e038364a5e4da559e85869b227cf699a541be0da74f14140124" + url: "https://pub.dev" + source: hosted + version: "2.1.3" timezone: dependency: transitive description: @@ -1760,6 +1808,30 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.7" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: "670f6e07aca990b4a2bcdc08a784193c4ccdd1932620244c3a86bb72a0eac67f" + url: "https://pub.dev" + source: hosted + version: "1.1.7" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: "7451721781d967db9933b63f5733b1c4533022c0ba373a01bdd79d1a5457f69f" + url: "https://pub.dev" + source: hosted + version: "1.1.7" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: "80a13c613c8bde758b1464a1755a7b3a8f2b6cec61fbf0f5a53c94c30f03ba2e" + url: "https://pub.dev" + source: hosted + version: "1.1.7" vector_math: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index d26efbe..561da11 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 3.0.5+52 +version: 3.0.6+53 environment: sdk: ">=3.0.0 <4.0.0" @@ -41,7 +41,7 @@ dependencies: image: ^4.0.17 photo_view: ^0.14.0 intl: ^0.18.1 - flutter_svg: ^1.0.3 + flutter_svg: ^2.0.7 url_launcher: ^6.1.2 file_picker: ^5.2.4 web_socket_channel: ^2.2.0 @@ -97,6 +97,7 @@ dependencies: transparent_image: ^2.0.1 flutter_animate: ^4.2.0+1 shared_preferences: ^2.2.1 + flutter_markdown: ^0.6.18 # camerawesome: ^2.0.0-dev.1 dependency_overrides: @@ -119,9 +120,20 @@ dev_dependencies: mock_server: path: packages/mock_server go_router_builder: ^2.3.3 + flutter_gen_runner: ^5.3.2 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec # The following section is specific to Flutter. + +flutter_gen: + output: lib/generated/ # Optional (default: lib/gen/) + line_length: 80 # Optional (default: 80) + + # Optional + integrations: + flutter_svg: true + + flutter: generate: true # The following line ensures that the Material Icons font is @@ -138,6 +150,8 @@ flutter: - test/fixtures/tags/ - test/fixtures/preview/ - test/fixtures/document_types/ + - assets/changelogs/ + # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware. # For details regarding adding assets from package dependencies, see diff --git a/scripts/update_changelogs.sh b/scripts/update_changelogs.sh new file mode 100644 index 0000000..2cfc551 --- /dev/null +++ b/scripts/update_changelogs.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +set -Eeuo pipefail + +__script_dir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) +__target_dir=$__script_dir/../assets/changelogs +readonly __script_dir +# Receives locale as first argument +function mergeChangelogs () { + __target_file=$__target_dir/changelogs_$1.md + rm -f $__target_file + touch $__target_file + ls $__script_dir/../android/fastlane/metadata/android/$1/changelogs/[0-9]*.txt | tac | while read f; do + __build_number="${f%.*}" + echo "# $(basename -- $__build_number)" >> $__target_file + cat $f >> $__target_file + printf "\n\n" >> $__target_file + done +} + +mergeChangelogs 'en-US' +mergeChangelogs 'de-DE' +