From 029cc99582966f4afa464302608492071fe665c5 Mon Sep 17 00:00:00 2001 From: Anton Stubenbord Date: Tue, 12 Dec 2023 23:15:11 +0100 Subject: [PATCH 1/6] fix: Increase version code for ABIs to match previous schema --- android/app/build.gradle | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 5edab16..496e5e2 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -103,7 +103,9 @@ android.applicationVariants.all { variant -> def abiName = output.getFilter(OutputFile.ABI) def abiVersionCode = project.ext.abiCodes.get(abiName) if (abiVersionCode != null) { - output.versionCodeOverride = variant.versionCode * 10 + abiVersionCode + output.versionCodeOverride = abiVersionCode * 1000 + variant.versionCode + println(abiName + ": " + output.versionCodeOverride) + // output.versionCodeOverride = variant.versionCode * 10 + abiVersionCode } } } \ No newline at end of file From 92b320faae4e1851875910435d72f24ebfa5edaf Mon Sep 17 00:00:00 2001 From: Anton Stubenbord <79228196+astubenbord@users.noreply.github.com> Date: Sat, 16 Dec 2023 13:37:07 +0100 Subject: [PATCH 2/6] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index f8b4540..a1e0ffe 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,6 @@ ## Important Notes -* ⚠️ This project is under **very active** development. * ⚠️ Breaking changes **are still expected** between updates! Please perform a clean install after updating the app before filing an issue or leaving a 1-Star review in the App-Stores!** From 1459b9ebd022ba9d72c029c11f1e3bb1f832b132 Mon Sep 17 00:00:00 2001 From: Anton Stubenbord <79228196+astubenbord@users.noreply.github.com> Date: Sat, 16 Dec 2023 13:37:48 +0100 Subject: [PATCH 3/6] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a1e0ffe..71c95dc 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ ## Important Notes -* ⚠️ Breaking changes **are still expected** between updates! Please perform a clean install after updating the app before filing an issue or leaving a 1-Star review in the App-Stores!** +* ⚠️ Breaking changes **are still expected** between updates! Please perform a **clean instal** after updating the app before filing an issue or leaving a 1-star review in the App-Store! ## About The Project From 0bec1d594a7542ac083e166473bce3c55694f40e Mon Sep 17 00:00:00 2001 From: Anton Stubenbord Date: Sat, 16 Dec 2023 14:10:09 +0100 Subject: [PATCH 4/6] feat: fix bug where tags were overwritten --- lib/core/repository/label_repository.dart | 24 ++++++- .../cubit/document_edit_cubit.dart | 63 +++++++++++++++++-- .../view/document_edit_page.dart | 8 ++- .../documents/view/pages/document_view.dart | 16 +++-- lib/features/labels/cubit/label_cubit.dart | 21 ++++--- .../tags/view/widgets/tags_form_field.dart | 6 +- 6 files changed, 114 insertions(+), 24 deletions(-) diff --git a/lib/core/repository/label_repository.dart b/lib/core/repository/label_repository.dart index 8456454..c9790b8 100644 --- a/lib/core/repository/label_repository.dart +++ b/lib/core/repository/label_repository.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:paperless_api/paperless_api.dart'; +import 'package:paperless_mobile/features/logging/data/logger.dart'; class LabelRepository extends ChangeNotifier { final PaperlessLabelsApi _api; @@ -57,8 +58,29 @@ class LabelRepository extends ChangeNotifier { } Future> findAllTags([Iterable? ids]) async { + logger.fd( + "Loading ${ids?.isEmpty ?? true ? "all" : "a subset of"} tags" + "${ids?.isEmpty ?? true ? "" : " (${ids!.join(",")})"}...", + className: runtimeType.toString(), + methodName: "findAllTags", + ); final data = await _api.getTags(ids); - tags = {for (var tag in data) tag.id!: tag}; + if (ids?.isNotEmpty ?? false) { + logger.fd( + "Successfully updated subset of tags: ${ids!.join(",")}", + className: runtimeType.toString(), + methodName: "findAllTags", + ); + // Only update the tags that were requested, keep existing ones. + tags = {...tags, for (var tag in data) tag.id!: tag}; + } else { + logger.fd( + "Successfully updated all tags.", + className: runtimeType.toString(), + methodName: "findAllTags", + ); + tags = {for (var tag in data) tag.id!: tag}; + } notifyListeners(); return data; } diff --git a/lib/features/document_edit/cubit/document_edit_cubit.dart b/lib/features/document_edit/cubit/document_edit_cubit.dart index 839bf98..97376ea 100644 --- a/lib/features/document_edit/cubit/document_edit_cubit.dart +++ b/lib/features/document_edit/cubit/document_edit_cubit.dart @@ -5,6 +5,7 @@ import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:paperless_api/paperless_api.dart'; import 'package:paperless_mobile/core/notifier/document_changed_notifier.dart'; import 'package:paperless_mobile/core/repository/label_repository.dart'; +import 'package:paperless_mobile/features/logging/data/logger.dart'; part 'document_edit_state.dart'; part 'document_edit_cubit.freezed.dart'; @@ -25,37 +26,91 @@ class DocumentEditCubit extends Cubit { _notifier.addListener( this, onUpdated: (doc) { - emit(state.copyWith(document: doc)); + emit(state.copyWith( + document: doc, + suggestions: null, + )); + loadFieldSuggestions(); }, ids: [document.id], ); } Future updateDocument(DocumentModel document) async { + logger.fi( + "Updating document ${document.id}...", + className: runtimeType.toString(), + methodName: "updateDocument", + ); final updated = await _docsApi.update(document); + logger.fi( + "Document ${document.id} successfully updated.", + className: runtimeType.toString(), + methodName: "updateDocument", + ); _notifier.notifyUpdated(updated); // Reload changed labels (documentCount property changes with removal/add) if (document.documentType != _initialDocument.documentType) { + logger.fd( + "Document type assigned to document ${document.id} has changed " + "(${_initialDocument.documentType} -> ${document.documentType}). " + "Reloading document type ${document.documentType}...", + className: runtimeType.toString(), + methodName: "updateDocument", + ); _labelRepository.findDocumentType( - (document.documentType ?? _initialDocument.documentType)!); + (document.documentType ?? _initialDocument.documentType)!, + ); } if (document.correspondent != _initialDocument.correspondent) { + logger.fd( + "Correspondent assigned to document ${document.id} has changed " + "(${_initialDocument.correspondent} -> ${document.correspondent}). " + "Reloading correspondent ${document.correspondent}...", + className: runtimeType.toString(), + methodName: "updateDocument", + ); _labelRepository.findCorrespondent( (document.correspondent ?? _initialDocument.correspondent)!); } if (document.storagePath != _initialDocument.storagePath) { + logger.fd( + "Storage path assigned to document ${document.id} has changed " + "(${_initialDocument.storagePath} -> ${document.storagePath}). " + "Reloading storage path ${document.storagePath}...", + className: runtimeType.toString(), + methodName: "updateDocument", + ); _labelRepository.findStoragePath( (document.storagePath ?? _initialDocument.storagePath)!); } if (!const DeepCollectionEquality.unordered() - .equals(document.tags, _initialDocument.tags)) { - _labelRepository.findAllTags(document.tags); + .equals(document.tags.toList(), _initialDocument.tags.toList())) { + final tagsToReload = {...document.tags, ..._initialDocument.tags}; + logger.fd( + "Tags assigned to document ${document.id} have changed " + "(${_initialDocument.tags.join(",")} -> ${document.tags.join(",")}). " + "Reloading tags ${tagsToReload.join(",")}...", + className: runtimeType.toString(), + methodName: "updateDocument", + ); + _labelRepository.findAllTags(tagsToReload); } } Future loadFieldSuggestions() async { + logger.fi( + "Loading suggestions for document ${state.document.id}...", + className: runtimeType.toString(), + methodName: "loadFieldSuggestions", + ); final suggestions = await _docsApi.findSuggestions(state.document); + logger.fi( + "Found ${suggestions.suggestionsCount} suggestions for document ${state.document.id}.", + className: runtimeType.toString(), + methodName: "loadFieldSuggestions", + ); emit(state.copyWith(suggestions: suggestions)); } diff --git a/lib/features/document_edit/view/document_edit_page.dart b/lib/features/document_edit/view/document_edit_page.dart index 8930727..eaa16a9 100644 --- a/lib/features/document_edit/view/document_edit_page.dart +++ b/lib/features/document_edit/view/document_edit_page.dart @@ -183,8 +183,12 @@ class _DocumentEditPageState extends State ); } - Padding _buildEditForm(BuildContext context, DocumentEditState state, - FieldSuggestions? filteredSuggestions, UserModel currentUser) { + Padding _buildEditForm( + BuildContext context, + DocumentEditState state, + FieldSuggestions? filteredSuggestions, + UserModel currentUser, + ) { final labelRepository = context.watch(); return Padding( diff --git a/lib/features/documents/view/pages/document_view.dart b/lib/features/documents/view/pages/document_view.dart index 2432259..ececd57 100644 --- a/lib/features/documents/view/pages/document_view.dart +++ b/lib/features/documents/view/pages/document_view.dart @@ -105,14 +105,18 @@ class _DocumentViewState extends State { body: PdfView( controller: _controller, onDocumentLoaded: (document) { - setState(() { - _totalPages = document.pagesCount; - }); + if (mounted) { + setState(() { + _totalPages = document.pagesCount; + }); + } }, onPageChanged: (page) { - setState(() { - _currentPage = page; - }); + if (mounted) { + setState(() { + _currentPage = page; + }); + } }, ), ); diff --git a/lib/features/labels/cubit/label_cubit.dart b/lib/features/labels/cubit/label_cubit.dart index d9efbe4..e3ce900 100644 --- a/lib/features/labels/cubit/label_cubit.dart +++ b/lib/features/labels/cubit/label_cubit.dart @@ -10,16 +10,16 @@ class LabelCubit extends Cubit { final LabelRepository labelRepository; LabelCubit(this.labelRepository) : super(const LabelState()) { - labelRepository.addListener( - () { - emit(state.copyWith( - correspondents: labelRepository.correspondents, - documentTypes: labelRepository.documentTypes, - storagePaths: labelRepository.storagePaths, - tags: labelRepository.tags, - )); - }, - ); + labelRepository.addListener(_updateStateListener); + } + + void _updateStateListener() { + emit(state.copyWith( + correspondents: labelRepository.correspondents, + documentTypes: labelRepository.documentTypes, + storagePaths: labelRepository.storagePaths, + tags: labelRepository.tags, + )); } Future reload({ @@ -130,6 +130,7 @@ class LabelCubit extends Cubit { @override Future close() { + labelRepository.removeListener(_updateStateListener); return super.close(); } } diff --git a/lib/features/labels/tags/view/widgets/tags_form_field.dart b/lib/features/labels/tags/view/widgets/tags_form_field.dart index ba728e0..6b12b02 100644 --- a/lib/features/labels/tags/view/widgets/tags_form_field.dart +++ b/lib/features/labels/tags/view/widgets/tags_form_field.dart @@ -117,8 +117,12 @@ class TagsFormField extends StatelessWidget { scrollDirection: Axis.horizontal, itemCount: displayedSuggestions.length, itemBuilder: (context, index) { + print(options); final suggestion = - options[displayedSuggestions.elementAt(index)]!; + options[displayedSuggestions.elementAt(index)]; + if (suggestion == null) { + return SizedBox.shrink(); + } return ColoredChipWrapper( child: ActionChip( label: Text(suggestion.name), From 9517b8e47e901058fa01873867c2ad1c0d0880a8 Mon Sep 17 00:00:00 2001 From: Anton Stubenbord Date: Sat, 16 Dec 2023 14:19:33 +0100 Subject: [PATCH 5/6] fix: Make fastlane symlink an actual symlink --- fastlane/metadata | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 120000 fastlane/metadata diff --git a/fastlane/metadata b/fastlane/metadata deleted file mode 100644 index 54f33ba..0000000 --- a/fastlane/metadata +++ /dev/null @@ -1 +0,0 @@ -../../android/fastlane/metadata \ No newline at end of file diff --git a/fastlane/metadata b/fastlane/metadata new file mode 120000 index 0000000..a4cbd11 --- /dev/null +++ b/fastlane/metadata @@ -0,0 +1 @@ +../android/fastlane/metadata \ No newline at end of file From 4868ce1b959c4bb68fc13f7247ebd92934a4b957 Mon Sep 17 00:00:00 2001 From: Anton Stubenbord Date: Sat, 16 Dec 2023 15:04:04 +0100 Subject: [PATCH 6/6] feat: Bump version number, add changelogs --- android/fastlane/metadata/android/de-DE/changelogs/59.txt | 2 ++ android/fastlane/metadata/android/en-US/changelogs/59.txt | 2 ++ lib/features/changelogs/view/changelog_dialog.dart | 1 + pubspec.yaml | 2 +- 4 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 android/fastlane/metadata/android/de-DE/changelogs/59.txt create mode 100644 android/fastlane/metadata/android/en-US/changelogs/59.txt diff --git a/android/fastlane/metadata/android/de-DE/changelogs/59.txt b/android/fastlane/metadata/android/de-DE/changelogs/59.txt new file mode 100644 index 0000000..156f432 --- /dev/null +++ b/android/fastlane/metadata/android/de-DE/changelogs/59.txt @@ -0,0 +1,2 @@ +* Beheben eines Fehlers, durch welchen Tags nach Bearbeitung eines Dokumentes nicht mehr gefunden wurden +* Aktualisieren der F-Droid Konfiguration \ No newline at end of file diff --git a/android/fastlane/metadata/android/en-US/changelogs/59.txt b/android/fastlane/metadata/android/en-US/changelogs/59.txt new file mode 100644 index 0000000..9f3d6ee --- /dev/null +++ b/android/fastlane/metadata/android/en-US/changelogs/59.txt @@ -0,0 +1,2 @@ +* Fixed a bug where tags cannot be found after editing a document +* Update F-Droid configuration \ No newline at end of file diff --git a/lib/features/changelogs/view/changelog_dialog.dart b/lib/features/changelogs/view/changelog_dialog.dart index 9e1da1f..05025f3 100644 --- a/lib/features/changelogs/view/changelog_dialog.dart +++ b/lib/features/changelogs/view/changelog_dialog.dart @@ -63,6 +63,7 @@ class ChangelogDialog extends StatelessWidget { } const _versionNumbers = { + "59": "3.1.5", "58": "3.1.4", "57": "3.1.3", "56": "3.1.2", diff --git a/pubspec.yaml b/pubspec.yaml index 89d3616..5cce3e5 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.1.4+58 +version: 3.1.5+59 environment: sdk: ">=3.1.0 <4.0.0"