minor fixes
This commit is contained in:
parent
35958d87fd
commit
a636c444e1
10 changed files with 26 additions and 7 deletions
|
@ -56,7 +56,7 @@ android {
|
||||||
// minSdkVersion constraints:
|
// minSdkVersion constraints:
|
||||||
// - Flutter & other plugins: 16
|
// - Flutter & other plugins: 16
|
||||||
// - google_maps_flutter v2.1.1: 20
|
// - google_maps_flutter v2.1.1: 20
|
||||||
minSdkVersion 16
|
minSdkVersion 19
|
||||||
targetSdkVersion 31
|
targetSdkVersion 31
|
||||||
versionCode flutterVersionCode.toInteger()
|
versionCode flutterVersionCode.toInteger()
|
||||||
versionName flutterVersionName
|
versionName flutterVersionName
|
||||||
|
|
|
@ -26,7 +26,7 @@ class DeviceHandler(private val context: Context) : MethodCallHandler {
|
||||||
"canGrantDirectoryAccess" to (sdkInt >= Build.VERSION_CODES.LOLLIPOP),
|
"canGrantDirectoryAccess" to (sdkInt >= Build.VERSION_CODES.LOLLIPOP),
|
||||||
"canPinShortcut" to ShortcutManagerCompat.isRequestPinShortcutSupported(context),
|
"canPinShortcut" to ShortcutManagerCompat.isRequestPinShortcutSupported(context),
|
||||||
"canPrint" to (sdkInt >= Build.VERSION_CODES.KITKAT),
|
"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,
|
// 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,
|
// but using hybrid composition would make it usable on API 19 too,
|
||||||
// cf https://github.com/flutter/flutter/issues/23728
|
// cf https://github.com/flutter/flutter/issues/23728
|
||||||
|
|
|
@ -5,7 +5,7 @@ final Device device = Device._private();
|
||||||
|
|
||||||
class Device {
|
class Device {
|
||||||
late final String _userAgent;
|
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;
|
late final bool _hasFilePicker, _showPinShortcutFeedback;
|
||||||
|
|
||||||
String get userAgent => _userAgent;
|
String get userAgent => _userAgent;
|
||||||
|
@ -16,7 +16,7 @@ class Device {
|
||||||
|
|
||||||
bool get canPrint => _canPrint;
|
bool get canPrint => _canPrint;
|
||||||
|
|
||||||
bool get canRenderEmojis => _canRenderEmojis;
|
bool get canRenderFlagEmojis => _canRenderFlagEmojis;
|
||||||
|
|
||||||
bool get canRenderGoogleMaps => _canRenderGoogleMaps;
|
bool get canRenderGoogleMaps => _canRenderGoogleMaps;
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ class Device {
|
||||||
_canGrantDirectoryAccess = capabilities['canGrantDirectoryAccess'] ?? false;
|
_canGrantDirectoryAccess = capabilities['canGrantDirectoryAccess'] ?? false;
|
||||||
_canPinShortcut = capabilities['canPinShortcut'] ?? false;
|
_canPinShortcut = capabilities['canPinShortcut'] ?? false;
|
||||||
_canPrint = capabilities['canPrint'] ?? false;
|
_canPrint = capabilities['canPrint'] ?? false;
|
||||||
_canRenderEmojis = capabilities['canRenderEmojis'] ?? false;
|
_canRenderFlagEmojis = capabilities['canRenderFlagEmojis'] ?? false;
|
||||||
_canRenderGoogleMaps = capabilities['canRenderGoogleMaps'] ?? false;
|
_canRenderGoogleMaps = capabilities['canRenderGoogleMaps'] ?? false;
|
||||||
_hasFilePicker = capabilities['hasFilePicker'] ?? false;
|
_hasFilePicker = capabilities['hasFilePicker'] ?? false;
|
||||||
_showPinShortcutFeedback = capabilities['showPinShortcutFeedback'] ?? false;
|
_showPinShortcutFeedback = capabilities['showPinShortcutFeedback'] ?? false;
|
||||||
|
|
|
@ -59,7 +59,7 @@ class LocationFilter extends CollectionFilter {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget iconBuilder(BuildContext context, double size, {bool showGenericIcon = true, bool embossed = false}) {
|
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);
|
final flag = countryCodeToFlag(_countryCode);
|
||||||
// as of Flutter v1.22.3, emoji shadows are rendered as colorful duplicates,
|
// 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
|
// not filled with the shadow color as expected, so we remove them
|
||||||
|
|
|
@ -18,7 +18,7 @@ import 'package:provider/provider.dart';
|
||||||
typedef FilterCallback = void Function(CollectionFilter filter);
|
typedef FilterCallback = void Function(CollectionFilter filter);
|
||||||
typedef OffsetFilterCallback = void Function(BuildContext context, CollectionFilter filter, Offset tapPosition);
|
typedef OffsetFilterCallback = void Function(BuildContext context, CollectionFilter filter, Offset tapPosition);
|
||||||
|
|
||||||
enum HeroType { always, onTap }
|
enum HeroType { always, onTap, never }
|
||||||
|
|
||||||
@immutable
|
@immutable
|
||||||
class AvesFilterDecoration {
|
class AvesFilterDecoration {
|
||||||
|
|
|
@ -4,6 +4,7 @@ import 'package:aves/model/source/collection_lens.dart';
|
||||||
import 'package:aves/model/source/collection_source.dart';
|
import 'package:aves/model/source/collection_source.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/identity/aves_filter_chip.dart';
|
||||||
import 'package:aves/widgets/common/providers/media_query_data_provider.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/aves_dialog.dart';
|
||||||
import 'package:aves/widgets/dialogs/item_pick_dialog.dart';
|
import 'package:aves/widgets/dialogs/item_pick_dialog.dart';
|
||||||
|
@ -96,6 +97,7 @@ class _CoverSelectionDialogState extends State<CoverSelectionDialog> {
|
||||||
extent: extent,
|
extent: extent,
|
||||||
coverEntry: _isCustom ? _customEntry : _recentEntry,
|
coverEntry: _isCustom ? _customEntry : _recentEntry,
|
||||||
onTap: (filter) => _pickEntry(),
|
onTap: (filter) => _pickEntry(),
|
||||||
|
heroType: HeroType.never,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
|
@ -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/menu.dart';
|
||||||
import 'package:aves/widgets/common/basic/query_bar.dart';
|
import 'package:aves/widgets/common/basic/query_bar.dart';
|
||||||
import 'package:aves/widgets/common/extensions/build_context.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/identity/empty.dart';
|
||||||
import 'package:aves/widgets/common/providers/selection_provider.dart';
|
import 'package:aves/widgets/common/providers/selection_provider.dart';
|
||||||
import 'package:aves/widgets/dialogs/filter_editors/create_album_dialog.dart';
|
import 'package:aves/widgets/dialogs/filter_editors/create_album_dialog.dart';
|
||||||
|
@ -79,6 +80,7 @@ class _AlbumPickPageState extends State<AlbumPickPage> {
|
||||||
text: context.l10n.albumEmpty,
|
text: context.l10n.albumEmpty,
|
||||||
),
|
),
|
||||||
onTap: (filter) => Navigator.pop<String>(context, (filter as AlbumFilter).album),
|
onTap: (filter) => Navigator.pop<String>(context, (filter as AlbumFilter).album),
|
||||||
|
heroType: HeroType.never,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
|
@ -28,6 +28,7 @@ class CoveredFilterChip<T extends CollectionFilter> extends StatelessWidget {
|
||||||
final bool pinned;
|
final bool pinned;
|
||||||
final String? banner;
|
final String? banner;
|
||||||
final FilterCallback? onTap;
|
final FilterCallback? onTap;
|
||||||
|
final HeroType heroType;
|
||||||
|
|
||||||
const CoveredFilterChip({
|
const CoveredFilterChip({
|
||||||
Key? key,
|
Key? key,
|
||||||
|
@ -38,6 +39,7 @@ class CoveredFilterChip<T extends CollectionFilter> extends StatelessWidget {
|
||||||
this.pinned = false,
|
this.pinned = false,
|
||||||
this.banner,
|
this.banner,
|
||||||
this.onTap,
|
this.onTap,
|
||||||
|
this.heroType = HeroType.onTap,
|
||||||
}) : thumbnailExtent = thumbnailExtent ?? extent,
|
}) : thumbnailExtent = thumbnailExtent ?? extent,
|
||||||
super(key: key);
|
super(key: key);
|
||||||
|
|
||||||
|
@ -138,6 +140,7 @@ class CoveredFilterChip<T extends CollectionFilter> extends StatelessWidget {
|
||||||
banner: banner,
|
banner: banner,
|
||||||
details: _buildDetails(source, filter),
|
details: _buildDetails(source, filter),
|
||||||
padding: titlePadding,
|
padding: titlePadding,
|
||||||
|
heroType: heroType,
|
||||||
onTap: onTap,
|
onTap: onTap,
|
||||||
onLongPress: null,
|
onLongPress: null,
|
||||||
);
|
);
|
||||||
|
|
|
@ -51,6 +51,7 @@ class FilterGridPage<T extends CollectionFilter> extends StatelessWidget {
|
||||||
final QueryTest<T>? applyQuery;
|
final QueryTest<T>? applyQuery;
|
||||||
final Widget Function() emptyBuilder;
|
final Widget Function() emptyBuilder;
|
||||||
final FilterCallback onTap;
|
final FilterCallback onTap;
|
||||||
|
final HeroType heroType;
|
||||||
|
|
||||||
const FilterGridPage({
|
const FilterGridPage({
|
||||||
Key? key,
|
Key? key,
|
||||||
|
@ -66,6 +67,7 @@ class FilterGridPage<T extends CollectionFilter> extends StatelessWidget {
|
||||||
this.applyQuery,
|
this.applyQuery,
|
||||||
required this.emptyBuilder,
|
required this.emptyBuilder,
|
||||||
required this.onTap,
|
required this.onTap,
|
||||||
|
required this.heroType,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
static const Color detailColor = Color(0xFFE0E0E0);
|
static const Color detailColor = Color(0xFFE0E0E0);
|
||||||
|
@ -104,6 +106,7 @@ class FilterGridPage<T extends CollectionFilter> extends StatelessWidget {
|
||||||
applyQuery: applyQuery,
|
applyQuery: applyQuery,
|
||||||
emptyBuilder: emptyBuilder,
|
emptyBuilder: emptyBuilder,
|
||||||
onTap: onTap,
|
onTap: onTap,
|
||||||
|
heroType: heroType,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -129,6 +132,7 @@ class FilterGrid<T extends CollectionFilter> extends StatefulWidget {
|
||||||
final QueryTest<T>? applyQuery;
|
final QueryTest<T>? applyQuery;
|
||||||
final Widget Function() emptyBuilder;
|
final Widget Function() emptyBuilder;
|
||||||
final FilterCallback onTap;
|
final FilterCallback onTap;
|
||||||
|
final HeroType heroType;
|
||||||
|
|
||||||
const FilterGrid({
|
const FilterGrid({
|
||||||
Key? key,
|
Key? key,
|
||||||
|
@ -144,6 +148,7 @@ class FilterGrid<T extends CollectionFilter> extends StatefulWidget {
|
||||||
required this.applyQuery,
|
required this.applyQuery,
|
||||||
required this.emptyBuilder,
|
required this.emptyBuilder,
|
||||||
required this.onTap,
|
required this.onTap,
|
||||||
|
required this.heroType,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -181,6 +186,7 @@ class _FilterGridState<T extends CollectionFilter> extends State<FilterGrid<T>>
|
||||||
applyQuery: widget.applyQuery,
|
applyQuery: widget.applyQuery,
|
||||||
emptyBuilder: widget.emptyBuilder,
|
emptyBuilder: widget.emptyBuilder,
|
||||||
onTap: widget.onTap,
|
onTap: widget.onTap,
|
||||||
|
heroType: widget.heroType,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -196,6 +202,7 @@ class _FilterGridContent<T extends CollectionFilter> extends StatelessWidget {
|
||||||
final Widget Function() emptyBuilder;
|
final Widget Function() emptyBuilder;
|
||||||
final QueryTest<T>? applyQuery;
|
final QueryTest<T>? applyQuery;
|
||||||
final FilterCallback onTap;
|
final FilterCallback onTap;
|
||||||
|
final HeroType heroType;
|
||||||
|
|
||||||
final ValueNotifier<double> _appBarHeightNotifier = ValueNotifier(0);
|
final ValueNotifier<double> _appBarHeightNotifier = ValueNotifier(0);
|
||||||
|
|
||||||
|
@ -212,6 +219,7 @@ class _FilterGridContent<T extends CollectionFilter> extends StatelessWidget {
|
||||||
required this.applyQuery,
|
required this.applyQuery,
|
||||||
required this.emptyBuilder,
|
required this.emptyBuilder,
|
||||||
required this.onTap,
|
required this.onTap,
|
||||||
|
required this.heroType,
|
||||||
}) : super(key: key) {
|
}) : super(key: key) {
|
||||||
_appBarHeightNotifier.value = appBarHeight;
|
_appBarHeightNotifier.value = appBarHeight;
|
||||||
}
|
}
|
||||||
|
@ -275,6 +283,7 @@ class _FilterGridContent<T extends CollectionFilter> extends StatelessWidget {
|
||||||
pinned: pinnedFilters.contains(filter),
|
pinned: pinnedFilters.contains(filter),
|
||||||
banner: newFilters.contains(filter) ? context.l10n.newFilterBanner : null,
|
banner: newFilters.contains(filter) ? context.l10n.newFilterBanner : null,
|
||||||
onTap: onTap,
|
onTap: onTap,
|
||||||
|
heroType: heroType,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -432,6 +441,7 @@ class _FilterScaler<T extends CollectionFilter> extends StatelessWidget {
|
||||||
extent: tileSize.width,
|
extent: tileSize.width,
|
||||||
thumbnailExtent: context.read<TileExtentController>().effectiveExtentMax,
|
thumbnailExtent: context.read<TileExtentController>().effectiveExtentMax,
|
||||||
pinned: pinnedFilters.contains(filter),
|
pinned: pinnedFilters.contains(filter),
|
||||||
|
heroType: HeroType.never,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
highlightItem: (item) => item.filter,
|
highlightItem: (item) => item.filter,
|
||||||
|
|
|
@ -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/collection_source.dart';
|
||||||
import 'package:aves/model/source/enums.dart';
|
import 'package:aves/model/source/enums.dart';
|
||||||
import 'package:aves/widgets/collection/collection_page.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/common/providers/selection_provider.dart';
|
||||||
import 'package:aves/widgets/filter_grids/common/action_delegates/chip_set.dart';
|
import 'package:aves/widgets/filter_grids/common/action_delegates/chip_set.dart';
|
||||||
import 'package:aves/widgets/filter_grids/common/app_bar.dart';
|
import 'package:aves/widgets/filter_grids/common/app_bar.dart';
|
||||||
|
@ -57,6 +58,7 @@ class FilterNavigationPage<T extends CollectionFilter> extends StatelessWidget {
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
onTap: (filter) => _goToCollection(context, filter),
|
onTap: (filter) => _goToCollection(context, filter),
|
||||||
|
heroType: HeroType.onTap,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in a new issue