From 9c98920639d57d9985bb1aefd0d87ba810dd064e Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Fri, 12 Jun 2020 11:04:15 +0900 Subject: [PATCH] debug: improved display for mediastore timestamps --- .../aves/channel/calls/MetadataHandler.java | 38 ++++++++++--------- lib/widgets/fullscreen/debug.dart | 16 +++++++- 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/android/app/src/main/java/deckers/thibault/aves/channel/calls/MetadataHandler.java b/android/app/src/main/java/deckers/thibault/aves/channel/calls/MetadataHandler.java index 4410a36c3..59a52a5d4 100644 --- a/android/app/src/main/java/deckers/thibault/aves/channel/calls/MetadataHandler.java +++ b/android/app/src/main/java/deckers/thibault/aves/channel/calls/MetadataHandler.java @@ -352,23 +352,27 @@ public class MetadataHandler implements MethodChannel.MethodCallHandler { String[] columnNames = cursor.getColumnNames(); for (int i = 0; i < columnCount; i++) { String key = columnNames[i]; - switch (cursor.getType(i)) { - case Cursor.FIELD_TYPE_NULL: - default: - metadataMap.put(key, null); - break; - case Cursor.FIELD_TYPE_INTEGER: - metadataMap.put(key, cursor.getInt(i)); - break; - case Cursor.FIELD_TYPE_FLOAT: - metadataMap.put(key, cursor.getFloat(i)); - break; - case Cursor.FIELD_TYPE_STRING: - metadataMap.put(key, cursor.getString(i)); - break; - case Cursor.FIELD_TYPE_BLOB: - metadataMap.put(key, cursor.getBlob(i)); - break; + try { + switch (cursor.getType(i)) { + case Cursor.FIELD_TYPE_NULL: + default: + metadataMap.put(key, null); + break; + case Cursor.FIELD_TYPE_INTEGER: + metadataMap.put(key, cursor.getLong(i)); + break; + case Cursor.FIELD_TYPE_FLOAT: + metadataMap.put(key, cursor.getFloat(i)); + break; + case Cursor.FIELD_TYPE_STRING: + metadataMap.put(key, cursor.getString(i)); + break; + case Cursor.FIELD_TYPE_BLOB: + metadataMap.put(key, cursor.getBlob(i)); + break; + } + } catch (Exception e) { + Log.w(LOG_TAG, "failed to get value for key=" + key, e); } } cursor.close(); diff --git a/lib/widgets/fullscreen/debug.dart b/lib/widgets/fullscreen/debug.dart index 809939e8f..1b8cf398b 100644 --- a/lib/widgets/fullscreen/debug.dart +++ b/lib/widgets/fullscreen/debug.dart @@ -144,6 +144,10 @@ class _FullscreenDebugPageState extends State { ); } + // MediaStore timestamp keys + static const secondTimestampKeys = ['date_added', 'date_modified', 'date_expires', 'isPlayed']; + static const millisecondTimestampKeys = ['datetaken', 'datetime']; + Widget _buildContentResolverTabView() { return ListView( padding: const EdgeInsets.all(16), @@ -153,7 +157,17 @@ class _FullscreenDebugPageState extends State { builder: (context, AsyncSnapshot snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); - final data = SplayTreeMap.of(snapshot.data.map((k, v) => MapEntry(k.toString(), v?.toString() ?? 'null'))); + final data = SplayTreeMap.of(snapshot.data.map((k, v) { + final key = k.toString(); + var value = v?.toString() ?? 'null'; + if ([...secondTimestampKeys, ...millisecondTimestampKeys].contains(key) && v is num && v != 0) { + if (secondTimestampKeys.contains(key)) { + v *= 1000; + } + value += ' (${DateTime.fromMillisecondsSinceEpoch(v)})'; + } + return MapEntry(key, value); + })); return InfoRowGroup(data); }, ),