diff --git a/android/app/build.gradle b/android/app/build.gradle index fa6db34f1..077647e2e 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -56,7 +56,7 @@ android { // minSdkVersion constraints: // - Flutter & other plugins: 16 // - google_maps_flutter v2.1.1: 20 - minSdkVersion 16 + minSdkVersion 19 targetSdkVersion 31 versionCode flutterVersionCode.toInteger() versionName flutterVersionName diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt index 88f9fe146..a4dcd071f 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/calls/DeviceHandler.kt @@ -26,7 +26,7 @@ class DeviceHandler(private val context: Context) : MethodCallHandler { "canGrantDirectoryAccess" to (sdkInt >= Build.VERSION_CODES.LOLLIPOP), "canPinShortcut" to ShortcutManagerCompat.isRequestPinShortcutSupported(context), "canPrint" to (sdkInt >= Build.VERSION_CODES.KITKAT), - "canRenderEmojis" to (sdkInt >= Build.VERSION_CODES.LOLLIPOP), + "canRenderFlagEmojis" to (sdkInt >= Build.VERSION_CODES.LOLLIPOP), // as of google_maps_flutter v2.1.1, minSDK is 20 because of default PlatformView usage, // but using hybrid composition would make it usable on API 19 too, // cf https://github.com/flutter/flutter/issues/23728 diff --git a/lib/model/device.dart b/lib/model/device.dart index 821a22699..0e4296866 100644 --- a/lib/model/device.dart +++ b/lib/model/device.dart @@ -5,7 +5,7 @@ final Device device = Device._private(); class Device { late final String _userAgent; - late final bool _canGrantDirectoryAccess, _canPinShortcut, _canPrint, _canRenderEmojis, _canRenderGoogleMaps; + late final bool _canGrantDirectoryAccess, _canPinShortcut, _canPrint, _canRenderFlagEmojis, _canRenderGoogleMaps; late final bool _hasFilePicker, _showPinShortcutFeedback; String get userAgent => _userAgent; @@ -16,7 +16,7 @@ class Device { bool get canPrint => _canPrint; - bool get canRenderEmojis => _canRenderEmojis; + bool get canRenderFlagEmojis => _canRenderFlagEmojis; bool get canRenderGoogleMaps => _canRenderGoogleMaps; @@ -35,7 +35,7 @@ class Device { _canGrantDirectoryAccess = capabilities['canGrantDirectoryAccess'] ?? false; _canPinShortcut = capabilities['canPinShortcut'] ?? false; _canPrint = capabilities['canPrint'] ?? false; - _canRenderEmojis = capabilities['canRenderEmojis'] ?? false; + _canRenderFlagEmojis = capabilities['canRenderFlagEmojis'] ?? false; _canRenderGoogleMaps = capabilities['canRenderGoogleMaps'] ?? false; _hasFilePicker = capabilities['hasFilePicker'] ?? false; _showPinShortcutFeedback = capabilities['showPinShortcutFeedback'] ?? false; diff --git a/lib/model/filters/location.dart b/lib/model/filters/location.dart index 5927501eb..3f593b7cc 100644 --- a/lib/model/filters/location.dart +++ b/lib/model/filters/location.dart @@ -59,7 +59,7 @@ class LocationFilter extends CollectionFilter { @override Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true, bool embossed = false}) { - if (_countryCode != null && device.canRenderEmojis) { + if (_countryCode != null && device.canRenderFlagEmojis) { final flag = countryCodeToFlag(_countryCode); // as of Flutter v1.22.3, emoji shadows are rendered as colorful duplicates, // not filled with the shadow color as expected, so we remove them diff --git a/lib/widgets/common/identity/aves_filter_chip.dart b/lib/widgets/common/identity/aves_filter_chip.dart index a5b4c5e1c..8e2f0fabe 100644 --- a/lib/widgets/common/identity/aves_filter_chip.dart +++ b/lib/widgets/common/identity/aves_filter_chip.dart @@ -18,7 +18,7 @@ import 'package:provider/provider.dart'; typedef FilterCallback = void Function(CollectionFilter filter); typedef OffsetFilterCallback = void Function(BuildContext context, CollectionFilter filter, Offset tapPosition); -enum HeroType { always, onTap } +enum HeroType { always, onTap, never } @immutable class AvesFilterDecoration { diff --git a/lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart b/lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart index 2dca81942..6b9ee9663 100644 --- a/lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart +++ b/lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart @@ -4,6 +4,7 @@ import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; import 'package:aves/widgets/dialogs/aves_dialog.dart'; import 'package:aves/widgets/dialogs/item_pick_dialog.dart'; @@ -96,6 +97,7 @@ class _CoverSelectionDialogState extends State { extent: extent, coverEntry: _isCustom ? _customEntry : _recentEntry, onTap: (filter) => _pickEntry(), + heroType: HeroType.never, ), ), ], diff --git a/lib/widgets/filter_grids/album_pick.dart b/lib/widgets/filter_grids/album_pick.dart index 290714c9d..af79ac67d 100644 --- a/lib/widgets/filter_grids/album_pick.dart +++ b/lib/widgets/filter_grids/album_pick.dart @@ -12,6 +12,7 @@ import 'package:aves/widgets/common/app_bar_subtitle.dart'; import 'package:aves/widgets/common/basic/menu.dart'; import 'package:aves/widgets/common/basic/query_bar.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; import 'package:aves/widgets/common/identity/empty.dart'; import 'package:aves/widgets/common/providers/selection_provider.dart'; import 'package:aves/widgets/dialogs/filter_editors/create_album_dialog.dart'; @@ -79,6 +80,7 @@ class _AlbumPickPageState extends State { text: context.l10n.albumEmpty, ), onTap: (filter) => Navigator.pop(context, (filter as AlbumFilter).album), + heroType: HeroType.never, ), ); }, diff --git a/lib/widgets/filter_grids/common/covered_filter_chip.dart b/lib/widgets/filter_grids/common/covered_filter_chip.dart index dc1375a7a..493305d9f 100644 --- a/lib/widgets/filter_grids/common/covered_filter_chip.dart +++ b/lib/widgets/filter_grids/common/covered_filter_chip.dart @@ -28,6 +28,7 @@ class CoveredFilterChip extends StatelessWidget { final bool pinned; final String? banner; final FilterCallback? onTap; + final HeroType heroType; const CoveredFilterChip({ Key? key, @@ -38,6 +39,7 @@ class CoveredFilterChip extends StatelessWidget { this.pinned = false, this.banner, this.onTap, + this.heroType = HeroType.onTap, }) : thumbnailExtent = thumbnailExtent ?? extent, super(key: key); @@ -138,6 +140,7 @@ class CoveredFilterChip extends StatelessWidget { banner: banner, details: _buildDetails(source, filter), padding: titlePadding, + heroType: heroType, onTap: onTap, onLongPress: null, ); diff --git a/lib/widgets/filter_grids/common/filter_grid_page.dart b/lib/widgets/filter_grids/common/filter_grid_page.dart index 135d9e8ba..4b609534e 100644 --- a/lib/widgets/filter_grids/common/filter_grid_page.dart +++ b/lib/widgets/filter_grids/common/filter_grid_page.dart @@ -51,6 +51,7 @@ class FilterGridPage extends StatelessWidget { final QueryTest? applyQuery; final Widget Function() emptyBuilder; final FilterCallback onTap; + final HeroType heroType; const FilterGridPage({ Key? key, @@ -66,6 +67,7 @@ class FilterGridPage extends StatelessWidget { this.applyQuery, required this.emptyBuilder, required this.onTap, + required this.heroType, }) : super(key: key); static const Color detailColor = Color(0xFFE0E0E0); @@ -104,6 +106,7 @@ class FilterGridPage extends StatelessWidget { applyQuery: applyQuery, emptyBuilder: emptyBuilder, onTap: onTap, + heroType: heroType, ), ), ), @@ -129,6 +132,7 @@ class FilterGrid extends StatefulWidget { final QueryTest? applyQuery; final Widget Function() emptyBuilder; final FilterCallback onTap; + final HeroType heroType; const FilterGrid({ Key? key, @@ -144,6 +148,7 @@ class FilterGrid extends StatefulWidget { required this.applyQuery, required this.emptyBuilder, required this.onTap, + required this.heroType, }) : super(key: key); @override @@ -181,6 +186,7 @@ class _FilterGridState extends State> applyQuery: widget.applyQuery, emptyBuilder: widget.emptyBuilder, onTap: widget.onTap, + heroType: widget.heroType, ), ); } @@ -196,6 +202,7 @@ class _FilterGridContent extends StatelessWidget { final Widget Function() emptyBuilder; final QueryTest? applyQuery; final FilterCallback onTap; + final HeroType heroType; final ValueNotifier _appBarHeightNotifier = ValueNotifier(0); @@ -212,6 +219,7 @@ class _FilterGridContent extends StatelessWidget { required this.applyQuery, required this.emptyBuilder, required this.onTap, + required this.heroType, }) : super(key: key) { _appBarHeightNotifier.value = appBarHeight; } @@ -275,6 +283,7 @@ class _FilterGridContent extends StatelessWidget { pinned: pinnedFilters.contains(filter), banner: newFilters.contains(filter) ? context.l10n.newFilterBanner : null, onTap: onTap, + heroType: heroType, ), ), ); @@ -432,6 +441,7 @@ class _FilterScaler extends StatelessWidget { extent: tileSize.width, thumbnailExtent: context.read().effectiveExtentMax, pinned: pinnedFilters.contains(filter), + heroType: HeroType.never, ); }, highlightItem: (item) => item.filter, diff --git a/lib/widgets/filter_grids/common/filter_nav_page.dart b/lib/widgets/filter_grids/common/filter_nav_page.dart index 7ce66ed98..7a0b97e02 100644 --- a/lib/widgets/filter_grids/common/filter_nav_page.dart +++ b/lib/widgets/filter_grids/common/filter_nav_page.dart @@ -3,6 +3,7 @@ import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/model/source/enums.dart'; import 'package:aves/widgets/collection/collection_page.dart'; +import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; import 'package:aves/widgets/common/providers/selection_provider.dart'; import 'package:aves/widgets/filter_grids/common/action_delegates/chip_set.dart'; import 'package:aves/widgets/filter_grids/common/app_bar.dart'; @@ -57,6 +58,7 @@ class FilterNavigationPage extends StatelessWidget { }, ), onTap: (filter) => _goToCollection(context, filter), + heroType: HeroType.onTap, ), ), );