use 12/24 hour format system settings
This commit is contained in:
parent
07934bbf9e
commit
b94abc8be4
7 changed files with 137 additions and 116 deletions
|
@ -8,6 +8,7 @@ import android.database.Cursor
|
||||||
import android.database.MatrixCursor
|
import android.database.MatrixCursor
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
|
import android.text.format.DateFormat
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import deckers.thibault.aves.model.FieldMap
|
import deckers.thibault.aves.model.FieldMap
|
||||||
import deckers.thibault.aves.utils.ContextUtils.resourceUri
|
import deckers.thibault.aves.utils.ContextUtils.resourceUri
|
||||||
|
@ -83,6 +84,7 @@ class SearchSuggestionsProvider : MethodChannel.MethodCallHandler, ContentProvid
|
||||||
backgroundChannel.invokeMethod("getSuggestions", hashMapOf(
|
backgroundChannel.invokeMethod("getSuggestions", hashMapOf(
|
||||||
"query" to query,
|
"query" to query,
|
||||||
"locale" to Locale.getDefault().toString(),
|
"locale" to Locale.getDefault().toString(),
|
||||||
|
"use24hour" to DateFormat.is24HourFormat(context),
|
||||||
), object : MethodChannel.Result {
|
), object : MethodChannel.Result {
|
||||||
override fun success(result: Any?) {
|
override fun success(result: Any?) {
|
||||||
@Suppress("unchecked_cast")
|
@Suppress("unchecked_cast")
|
||||||
|
|
|
@ -47,6 +47,9 @@ Future<List<Map<String, String?>>> _getSuggestions(dynamic args) async {
|
||||||
if (args is Map) {
|
if (args is Map) {
|
||||||
final query = args['query'];
|
final query = args['query'];
|
||||||
final locale = args['locale'];
|
final locale = args['locale'];
|
||||||
|
final use24hour = args['use24hour'];
|
||||||
|
debugPrint('getSuggestions query=$query, locale=$locale use24hour=$use24hour');
|
||||||
|
|
||||||
if (query is String && locale is String) {
|
if (query is String && locale is String) {
|
||||||
final entries = await metadataDb.searchEntries(query, limit: 9);
|
final entries = await metadataDb.searchEntries(query, limit: 9);
|
||||||
suggestions.addAll(entries.map((entry) {
|
suggestions.addAll(entries.map((entry) {
|
||||||
|
@ -55,7 +58,7 @@ Future<List<Map<String, String?>>> _getSuggestions(dynamic args) async {
|
||||||
'data': entry.uri,
|
'data': entry.uri,
|
||||||
'mimeType': entry.mimeType,
|
'mimeType': entry.mimeType,
|
||||||
'title': entry.bestTitle,
|
'title': entry.bestTitle,
|
||||||
'subtitle': date != null ? formatDateTime(date, locale) : null,
|
'subtitle': date != null ? formatDateTime(date, locale, use24hour) : null,
|
||||||
'iconUri': entry.uri,
|
'iconUri': entry.uri,
|
||||||
};
|
};
|
||||||
}));
|
}));
|
||||||
|
|
|
@ -2,9 +2,9 @@ import 'package:intl/intl.dart';
|
||||||
|
|
||||||
String formatDay(DateTime date, String locale) => DateFormat.yMMMd(locale).format(date);
|
String formatDay(DateTime date, String locale) => DateFormat.yMMMd(locale).format(date);
|
||||||
|
|
||||||
String formatTime(DateTime date, String locale) => DateFormat.Hm(locale).format(date);
|
String formatTime(DateTime date, String locale, bool use24hour) => (use24hour ? DateFormat.Hm(locale) : DateFormat.jm(locale)).format(date);
|
||||||
|
|
||||||
String formatDateTime(DateTime date, String locale) => '${formatDay(date, locale)} • ${formatTime(date, locale)}';
|
String formatDateTime(DateTime date, String locale, bool use24hour) => '${formatDay(date, locale)} • ${formatTime(date, locale, use24hour)}';
|
||||||
|
|
||||||
String formatFriendlyDuration(Duration d) {
|
String formatFriendlyDuration(Duration d) {
|
||||||
final seconds = (d.inSeconds.remainder(Duration.secondsPerMinute)).toString().padLeft(2, '0');
|
final seconds = (d.inSeconds.remainder(Duration.secondsPerMinute)).toString().padLeft(2, '0');
|
||||||
|
|
|
@ -5,6 +5,7 @@ import 'package:aves/theme/durations.dart';
|
||||||
import 'package:aves/theme/format.dart';
|
import 'package:aves/theme/format.dart';
|
||||||
import 'package:aves/theme/icons.dart';
|
import 'package:aves/theme/icons.dart';
|
||||||
import 'package:aves/widgets/common/extensions/build_context.dart';
|
import 'package:aves/widgets/common/extensions/build_context.dart';
|
||||||
|
import 'package:aves/widgets/common/providers/media_query_data_provider.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
@ -44,7 +45,13 @@ class _EditEntryDateDialogState extends State<EditEntryDateDialog> {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
return MediaQueryDataProvider(
|
||||||
|
child: Builder(
|
||||||
|
builder: (context) {
|
||||||
final l10n = context.l10n;
|
final l10n = context.l10n;
|
||||||
|
final locale = l10n.localeName;
|
||||||
|
final use24hour = context.select<MediaQueryData, bool>((v) => v.alwaysUse24HourFormat);
|
||||||
|
|
||||||
void _updateAction(DateEditAction? action) {
|
void _updateAction(DateEditAction? action) {
|
||||||
if (action == null) return;
|
if (action == null) return;
|
||||||
setState(() => _action = action);
|
setState(() => _action = action);
|
||||||
|
@ -65,7 +72,7 @@ class _EditEntryDateDialogState extends State<EditEntryDateDialog> {
|
||||||
groupValue: _action,
|
groupValue: _action,
|
||||||
onChanged: _updateAction,
|
onChanged: _updateAction,
|
||||||
title: _tileText(l10n.editEntryDateDialogSet),
|
title: _tileText(l10n.editEntryDateDialogSet),
|
||||||
subtitle: Text(formatDateTime(_dateTime, l10n.localeName)),
|
subtitle: Text(formatDateTime(_dateTime, locale, use24hour)),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Padding(
|
Padding(
|
||||||
|
@ -165,6 +172,9 @@ class _EditEntryDateDialogState extends State<EditEntryDateDialog> {
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
String _formatShiftDuration() {
|
String _formatShiftDuration() {
|
||||||
|
|
|
@ -168,8 +168,10 @@ class _DateRow extends StatelessWidget {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final locale = context.l10n.localeName;
|
final locale = context.l10n.localeName;
|
||||||
|
final use24hour = context.select<MediaQueryData, bool>((v) => v.alwaysUse24HourFormat);
|
||||||
|
|
||||||
final date = entry?.bestDate;
|
final date = entry?.bestDate;
|
||||||
final dateText = date != null ? formatDateTime(date, locale) : Constants.overlayUnknown;
|
final dateText = date != null ? formatDateTime(date, locale, use24hour) : Constants.overlayUnknown;
|
||||||
return Row(
|
return Row(
|
||||||
children: [
|
children: [
|
||||||
const SizedBox(width: MapInfoRow.iconPadding),
|
const SizedBox(width: MapInfoRow.iconPadding),
|
||||||
|
|
|
@ -17,6 +17,7 @@ import 'package:aves/widgets/viewer/info/common.dart';
|
||||||
import 'package:collection/collection.dart';
|
import 'package:collection/collection.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
class BasicSection extends StatelessWidget {
|
class BasicSection extends StatelessWidget {
|
||||||
final AvesEntry entry;
|
final AvesEntry entry;
|
||||||
|
@ -41,6 +42,7 @@ class BasicSection extends StatelessWidget {
|
||||||
final l10n = context.l10n;
|
final l10n = context.l10n;
|
||||||
final infoUnknown = l10n.viewerInfoUnknown;
|
final infoUnknown = l10n.viewerInfoUnknown;
|
||||||
final locale = l10n.localeName;
|
final locale = l10n.localeName;
|
||||||
|
final use24hour = context.select<MediaQueryData, bool>((v) => v.alwaysUse24HourFormat);
|
||||||
|
|
||||||
return AnimatedBuilder(
|
return AnimatedBuilder(
|
||||||
animation: entry.metadataChangeNotifier,
|
animation: entry.metadataChangeNotifier,
|
||||||
|
@ -49,7 +51,7 @@ class BasicSection extends StatelessWidget {
|
||||||
// inserting ZWSP (\u200B) between characters does help, but it messes with width and height computation (another Flutter issue)
|
// inserting ZWSP (\u200B) between characters does help, but it messes with width and height computation (another Flutter issue)
|
||||||
final title = entry.bestTitle ?? infoUnknown;
|
final title = entry.bestTitle ?? infoUnknown;
|
||||||
final date = entry.bestDate;
|
final date = entry.bestDate;
|
||||||
final dateText = date != null ? formatDateTime(date, locale) : infoUnknown;
|
final dateText = date != null ? formatDateTime(date, locale, use24hour) : infoUnknown;
|
||||||
final showResolution = !entry.isSvg && entry.isSized;
|
final showResolution = !entry.isSvg && entry.isSized;
|
||||||
final sizeText = entry.sizeBytes != null ? formatFilesize(entry.sizeBytes!) : infoUnknown;
|
final sizeText = entry.sizeBytes != null ? formatFilesize(entry.sizeBytes!) : infoUnknown;
|
||||||
final path = entry.path;
|
final path = entry.path;
|
||||||
|
|
|
@ -395,8 +395,10 @@ class _DateRow extends StatelessWidget {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final locale = context.l10n.localeName;
|
final locale = context.l10n.localeName;
|
||||||
|
final use24hour = context.select<MediaQueryData, bool>((v) => v.alwaysUse24HourFormat);
|
||||||
|
|
||||||
final date = entry.bestDate;
|
final date = entry.bestDate;
|
||||||
final dateText = date != null ? formatDateTime(date, locale) : Constants.overlayUnknown;
|
final dateText = date != null ? formatDateTime(date, locale, use24hour) : Constants.overlayUnknown;
|
||||||
final resolutionText = entry.isSvg
|
final resolutionText = entry.isSvg
|
||||||
? entry.aspectRatioText
|
? entry.aspectRatioText
|
||||||
: entry.isSized
|
: entry.isSized
|
||||||
|
|
Loading…
Reference in a new issue