Merge pull request #818 from ente-io/fix_potential_null_check_failure

Improve logging and add null checks at missing places
This commit is contained in:
Neeraj Gupta 2023-01-28 09:13:47 +05:30 committed by GitHub
commit 0bbe467750
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 69 additions and 36 deletions

View file

@ -49,6 +49,13 @@ class Collection {
return mMdVersion > 0 && magicMetadata.visibility == visibilityArchive;
}
// hasLink returns true if there's any link attached to the collection
// including expired links
bool get hasLink => publicURLs != null && publicURLs!.isNotEmpty;
// hasSharees returns true if the collection is shared with other ente users
bool get hasSharees => sharees != null && sharees!.isNotEmpty;
bool isHidden() {
if (isDefaultHidden()) {
return true;

View file

@ -374,8 +374,17 @@ class _CreateCollectionSheetState extends State<CreateCollectionSheet> {
);
} else {
for (final file in widget.selectedFiles!.files) {
final File? currentFile =
await (FilesDB.instance.getFile(file.generatedID!));
File? currentFile;
if (file.uploadedFileID != null) {
currentFile = file;
} else if (file.generatedID != null) {
// when file is not uploaded, refresh the state from the db to
// ensure we have latest upload status for given file before
// queueing it up as pending upload
currentFile = await (FilesDB.instance.getFile(file.generatedID!));
} else if (file.generatedID == null) {
_logger.severe("generated id should not be null");
}
if (currentFile == null) {
_logger.severe("Failed to find fileBy genID");
continue;

View file

@ -11,6 +11,7 @@ import 'package:photos/events/collection_updated_event.dart';
import 'package:photos/events/local_photos_updated_event.dart';
import 'package:photos/events/tab_changed_event.dart';
import 'package:photos/events/user_logged_out_event.dart';
import 'package:photos/models/collection.dart';
import 'package:photos/models/collection_items.dart';
import 'package:photos/models/gallery_type.dart';
import 'package:photos/services/collections_service.dart';
@ -69,12 +70,22 @@ class _SharedCollectionGalleryState extends State<SharedCollectionGallery>
final List<CollectionWithThumbnail> outgoing = [];
final List<CollectionWithThumbnail> incoming = [];
for (final file in files) {
final c = CollectionsService.instance
.getCollectionByID(file.collectionID!)!;
if (file.collectionID == null) {
_logger.severe("collection id should not be null");
continue;
}
final Collection? c =
CollectionsService.instance.getCollectionByID(file.collectionID!);
if (c == null) {
_logger
.severe("shared collection is not cached ${file.collectionID}");
CollectionsService.instance
.fetchCollectionByID(file.collectionID!)
.ignore();
continue;
}
if (c.owner!.id == Configuration.instance.getUserID()) {
if (c.sharees!.isNotEmpty ||
c.publicURLs!.isNotEmpty ||
c.isSharedFilesCollection()) {
if (c.hasSharees || c.hasLink || c.isSharedFilesCollection()) {
outgoing.add(
CollectionWithThumbnail(
c,
@ -113,8 +124,12 @@ class _SharedCollectionGalleryState extends State<SharedCollectionGallery>
if (snapshot.hasData) {
return _getSharedCollectionsGallery(snapshot.data!);
} else if (snapshot.hasError) {
_logger.shout(snapshot.error);
return Center(child: Text(snapshot.error.toString()));
_logger.severe(
"critical: failed to load share gallery",
snapshot.error,
snapshot.stackTrace,
);
return const Center(child: Text("Something went wrong."));
} else {
return const EnteLoadingWidget();
}
@ -268,27 +283,29 @@ class OutgoingCollectionItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
final sharees = <String?>[];
for (int index = 0; index < c.collection.sharees!.length; index++) {
final sharee = c.collection.sharees![index]!;
final name =
(sharee.name?.isNotEmpty ?? false) ? sharee.name : sharee.email;
if (index < 2) {
sharees.add(name);
} else {
final remaining = c.collection.sharees!.length - index;
if (remaining == 1) {
// If it's the last sharee
sharees.add(name);
final shareesName = <String>[];
if (c.collection.hasSharees) {
for (int index = 0; index < c.collection.sharees!.length; index++) {
final sharee = c.collection.sharees![index]!;
final String name =
(sharee.name?.isNotEmpty ?? false) ? sharee.name! : sharee.email;
if (index < 2) {
shareesName.add(name);
} else {
sharees.add(
"and " +
remaining.toString() +
" other" +
(remaining > 1 ? "s" : ""),
);
final remaining = c.collection.sharees!.length - index;
if (remaining == 1) {
// If it's the last sharee
shareesName.add(name);
} else {
shareesName.add(
"and " +
remaining.toString() +
" other" +
(remaining > 1 ? "s" : ""),
);
}
break;
}
break;
}
}
return GestureDetector(
@ -325,22 +342,22 @@ class OutgoingCollectionItem extends StatelessWidget {
),
),
const Padding(padding: EdgeInsets.all(2)),
c.collection.publicURLs!.isEmpty
? Container()
: (c.collection.publicURLs!.first!.isExpired
c.collection.hasLink
? (c.collection.publicURLs!.first!.isExpired
? const Icon(
Icons.link,
color: warning500,
)
: const Icon(Icons.link)),
: const Icon(Icons.link))
: Container(),
],
),
sharees.isEmpty
shareesName.isEmpty
? Container()
: Padding(
padding: const EdgeInsets.fromLTRB(0, 4, 0, 0),
child: Text(
"Shared with " + sharees.join(", "),
"Shared with " + shareesName.join(", "),
style: TextStyle(
fontSize: 14,
color: Theme.of(context).primaryColorLight,

View file

@ -46,7 +46,7 @@ class _ShareCollectionPageState extends State<ShareCollectionPage> {
@override
Widget build(BuildContext context) {
_sharees = widget.collection.sharees ?? [];
final bool hasUrl = widget.collection.publicURLs?.isNotEmpty ?? false;
final bool hasUrl = widget.collection.hasLink;
final children = <Widget>[];
children.add(
MenuSectionTitle(

View file

@ -12,7 +12,7 @@ description: ente photos application
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 0.7.8+408
version: 0.7.11+411
environment:
sdk: '>=2.17.0 <3.0.0'