upgraded flutter to stable v2.2.0, minSdk 19 -> 20, null safety streams_channel
This commit is contained in:
parent
47b9c1f893
commit
fa0782262d
27 changed files with 186 additions and 137 deletions
4
.github/workflows/check.yml
vendored
4
.github/workflows/check.yml
vendored
|
@ -14,8 +14,8 @@ jobs:
|
|||
steps:
|
||||
- uses: subosito/flutter-action@v1
|
||||
with:
|
||||
channel: beta
|
||||
flutter-version: '2.2.0-10.2.pre'
|
||||
channel: stable
|
||||
flutter-version: '2.2.0'
|
||||
|
||||
- name: Clone the repository.
|
||||
uses: actions/checkout@v2
|
||||
|
|
8
.github/workflows/release.yml
vendored
8
.github/workflows/release.yml
vendored
|
@ -16,8 +16,8 @@ jobs:
|
|||
|
||||
- uses: subosito/flutter-action@v1
|
||||
with:
|
||||
channel: beta
|
||||
flutter-version: '2.2.0-10.2.pre'
|
||||
channel: stable
|
||||
flutter-version: '2.2.0'
|
||||
|
||||
# Workaround for this Android Gradle Plugin issue (supposedly fixed in AGP 4.1):
|
||||
# https://issuetracker.google.com/issues/144111441
|
||||
|
@ -50,8 +50,8 @@ jobs:
|
|||
echo "${{ secrets.KEY_JKS }}" > release.keystore.asc
|
||||
gpg -d --passphrase "${{ secrets.KEY_JKS_PASSPHRASE }}" --batch release.keystore.asc > $AVES_STORE_FILE
|
||||
rm release.keystore.asc
|
||||
flutter build apk --bundle-sksl-path shaders_2.2.0-10.2.pre.sksl.json
|
||||
flutter build appbundle --bundle-sksl-path shaders_2.2.0-10.2.pre.sksl.json
|
||||
flutter build apk --bundle-sksl-path shaders_2.2.0.sksl.json
|
||||
flutter build appbundle --bundle-sksl-path shaders_2.2.0.sksl.json
|
||||
rm $AVES_STORE_FILE
|
||||
env:
|
||||
AVES_STORE_FILE: ${{ github.workspace }}/key.jks
|
||||
|
|
6
.gitignore
vendored
6
.gitignore
vendored
|
@ -40,5 +40,7 @@ app.*.symbols
|
|||
# Obfuscation related
|
||||
app.*.map.json
|
||||
|
||||
# Exceptions to above rules.
|
||||
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
|
||||
# Android Studio will place build artifacts here
|
||||
/android/app/debug
|
||||
/android/app/profile
|
||||
/android/app/release
|
||||
|
|
|
@ -3,7 +3,10 @@ All notable changes to this project will be documented in this file.
|
|||
|
||||
## [Unreleased]
|
||||
### Changed
|
||||
- Upgraded Flutter to beta v2.2.0-10.2.pre
|
||||
- Upgraded Flutter to stable v2.2.0
|
||||
|
||||
### Removed
|
||||
- no support for Android KitKat (API 19), unsupported by Google Maps package
|
||||
|
||||
## [v1.4.1] - 2021-04-29
|
||||
### Added
|
||||
|
|
|
@ -21,7 +21,7 @@ Aves is a gallery and metadata explorer app. It is built for Android, with Flutt
|
|||
- search and filter by country, place, XMP tag, type (animated, raster, vector…)
|
||||
- favorites
|
||||
- statistics
|
||||
- support Android API 19 ~ 30 (KitKat ~ R)
|
||||
- support Android API 20 ~ 30 (Lollipop ~ R)
|
||||
- Android integration (app shortcuts, handle view/pick intents)
|
||||
|
||||
## Known Issues
|
||||
|
|
|
@ -53,8 +53,8 @@ android {
|
|||
|
||||
defaultConfig {
|
||||
applicationId "deckers.thibault.aves"
|
||||
minSdkVersion 19
|
||||
targetSdkVersion 30 // same as compileSdkVersion
|
||||
minSdkVersion 20
|
||||
targetSdkVersion 30
|
||||
versionCode flutterVersionCode.toInteger()
|
||||
versionName flutterVersionName
|
||||
manifestPlaceholders = [googleApiKey: keystoreProperties['googleApiKey']]
|
||||
|
@ -100,14 +100,14 @@ flutter {
|
|||
|
||||
repositories {
|
||||
maven { url 'https://jitpack.io' }
|
||||
maven { url "https://s3.amazonaws.com/repo.commonsware.com" }
|
||||
maven { url 'https://s3.amazonaws.com/repo.commonsware.com' }
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'
|
||||
implementation 'androidx.core:core-ktx:1.5.0-rc02' // v1.5.0-alpha02+ for ShortcutManagerCompat.setDynamicShortcuts
|
||||
implementation 'androidx.core:core-ktx:1.5.0'
|
||||
implementation 'androidx.exifinterface:exifinterface:1.3.2'
|
||||
implementation "androidx.multidex:multidex:2.0.1"
|
||||
implementation 'androidx.multidex:multidex:2.0.1'
|
||||
implementation 'com.commonsware.cwac:document:0.4.1'
|
||||
implementation 'com.drewnoakes:metadata-extractor:2.16.0'
|
||||
implementation 'com.github.deckerst:Android-TiffBitmapFactory:876e53870a' // forked, built by JitPack
|
||||
|
|
|
@ -6,11 +6,10 @@ buildscript {
|
|||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:4.2.0'
|
||||
classpath 'com.android.tools.build:gradle:4.2.1'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
// google-services:4.3.6 is broken, cf https://github.com/google/play-services-plugins/issues/176
|
||||
classpath 'com.google.gms:google-services:4.3.5'
|
||||
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.6.0'
|
||||
classpath 'com.google.gms:google-services:4.3.8'
|
||||
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.6.1'
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -29,8 +28,6 @@ allprojects {
|
|||
rootProject.buildDir = '../build'
|
||||
subprojects {
|
||||
project.buildDir = "${rootProject.buildDir}/${project.name}"
|
||||
}
|
||||
subprojects {
|
||||
project.evaluationDependsOn(':app')
|
||||
}
|
||||
|
||||
|
|
|
@ -1,23 +1,23 @@
|
|||
import 'package:aves/model/settings/settings.dart';
|
||||
import 'package:aves/theme/durations.dart';
|
||||
import 'package:connectivity/connectivity.dart';
|
||||
import 'package:connectivity_plus/connectivity_plus.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:github/github.dart';
|
||||
import 'package:google_api_availability/google_api_availability.dart';
|
||||
import 'package:package_info/package_info.dart';
|
||||
import 'package:package_info_plus/package_info_plus.dart';
|
||||
import 'package:version/version.dart';
|
||||
|
||||
abstract class AvesAvailability {
|
||||
void onResume();
|
||||
|
||||
Future<bool > get isConnected;
|
||||
Future<bool> get isConnected;
|
||||
|
||||
Future<bool > get hasPlayServices;
|
||||
Future<bool> get hasPlayServices;
|
||||
|
||||
Future<bool> get canLocatePlaces;
|
||||
|
||||
Future<bool > get isNewVersionAvailable;
|
||||
Future<bool> get isNewVersionAvailable;
|
||||
}
|
||||
|
||||
class LiveAvesAvailability implements AvesAvailability {
|
||||
|
@ -31,7 +31,7 @@ class LiveAvesAvailability implements AvesAvailability {
|
|||
void onResume() => _isConnected = null;
|
||||
|
||||
@override
|
||||
Future<bool > get isConnected async {
|
||||
Future<bool> get isConnected async {
|
||||
if (_isConnected != null) return SynchronousFuture(_isConnected!);
|
||||
final result = await (Connectivity().checkConnectivity());
|
||||
_updateConnectivityFromResult(result);
|
||||
|
@ -47,7 +47,7 @@ class LiveAvesAvailability implements AvesAvailability {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<bool > get hasPlayServices async {
|
||||
Future<bool> get hasPlayServices async {
|
||||
if (_hasPlayServices != null) return SynchronousFuture(_hasPlayServices!);
|
||||
final result = await GoogleApiAvailability.instance.checkGooglePlayServicesAvailability();
|
||||
_hasPlayServices = result == GooglePlayServicesAvailability.success;
|
||||
|
@ -60,7 +60,7 @@ class LiveAvesAvailability implements AvesAvailability {
|
|||
Future<bool> get canLocatePlaces => Future.wait<bool>([isConnected, hasPlayServices]).then((results) => results.every((result) => result));
|
||||
|
||||
@override
|
||||
Future<bool > get isNewVersionAvailable async {
|
||||
Future<bool> get isNewVersionAvailable async {
|
||||
if (_isNewVersionAvailable != null) return SynchronousFuture(_isNewVersionAvailable!);
|
||||
|
||||
final now = DateTime.now();
|
||||
|
|
|
@ -52,7 +52,7 @@ class AlbumFilter extends CollectionFilter {
|
|||
}
|
||||
|
||||
@override
|
||||
Future<Color > color(BuildContext context) {
|
||||
Future<Color> color(BuildContext context) {
|
||||
// do not use async/await and rely on `SynchronousFuture`
|
||||
// to prevent rebuilding of the `FutureBuilder` listening on this future
|
||||
if (androidFileUtils.getAlbumType(album) == AlbumType.app) {
|
||||
|
|
|
@ -18,7 +18,7 @@ import 'enums.dart';
|
|||
|
||||
class CollectionLens with ChangeNotifier, CollectionActivityMixin {
|
||||
final CollectionSource source;
|
||||
final Set<CollectionFilter > filters;
|
||||
final Set<CollectionFilter> filters;
|
||||
EntryGroupFactor groupFactor;
|
||||
EntrySortFactor sortFactor;
|
||||
final AChangeNotifier filterChangeNotifier = AChangeNotifier(), sortGroupChangeNotifier = AChangeNotifier();
|
||||
|
@ -28,7 +28,7 @@ class CollectionLens with ChangeNotifier, CollectionActivityMixin {
|
|||
|
||||
List<AvesEntry> _filteredSortedEntries = [];
|
||||
|
||||
Map<SectionKey, List<AvesEntry> > sections = Map.unmodifiable({});
|
||||
Map<SectionKey, List<AvesEntry>> sections = Map.unmodifiable({});
|
||||
|
||||
CollectionLens({
|
||||
required this.source,
|
||||
|
@ -37,7 +37,7 @@ class CollectionLens with ChangeNotifier, CollectionActivityMixin {
|
|||
EntrySortFactor? sortFactor,
|
||||
this.id,
|
||||
this.listenToSource = true,
|
||||
}) : filters = (filters ?? {}).where((f) => f != null).cast<CollectionFilter >().toSet(),
|
||||
}) : filters = (filters ?? {}).where((f) => f != null).cast<CollectionFilter>().toSet(),
|
||||
groupFactor = groupFactor ?? settings.collectionGroupFactor,
|
||||
sortFactor = sortFactor ?? settings.collectionSortFactor {
|
||||
id ??= hashCode;
|
||||
|
@ -69,9 +69,9 @@ class CollectionLens with ChangeNotifier, CollectionActivityMixin {
|
|||
int get entryCount => _filteredSortedEntries.length;
|
||||
|
||||
// sorted as displayed to the user, i.e. sorted then grouped, not an absolute order on all entries
|
||||
List<AvesEntry >? _sortedEntries;
|
||||
List<AvesEntry>? _sortedEntries;
|
||||
|
||||
List<AvesEntry > get sortedEntries {
|
||||
List<AvesEntry> get sortedEntries {
|
||||
_sortedEntries ??= List.of(sections.entries.expand((kv) => kv.value));
|
||||
return _sortedEntries!;
|
||||
}
|
||||
|
|
|
@ -203,8 +203,8 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM
|
|||
}
|
||||
});
|
||||
await metadataDb.saveEntries(movedEntries);
|
||||
await metadataDb.saveMetadata(movedEntries.map((entry) => entry.catalogMetadata).where((v) => v != null).cast<CatalogMetadata >().toSet());
|
||||
await metadataDb.saveAddresses(movedEntries.map((entry) => entry.addressDetails).where((v) => v != null).cast<AddressDetails >().toSet());
|
||||
await metadataDb.saveMetadata(movedEntries.map((entry) => entry.catalogMetadata).where((v) => v != null).cast<CatalogMetadata>().toSet());
|
||||
await metadataDb.saveAddresses(movedEntries.map((entry) => entry.addressDetails).where((v) => v != null).cast<AddressDetails>().toSet());
|
||||
} else {
|
||||
await Future.forEach<MoveOpEvent>(movedOps, (movedOp) async {
|
||||
final newFields = movedOp.newFields;
|
||||
|
|
|
@ -45,7 +45,7 @@ mixin LocationMixin on SourceBase {
|
|||
|
||||
// final stopwatch = Stopwatch()..start();
|
||||
final countryCodeMap = await countryTopology.countryCodeMap(todo.map((entry) => entry.latLng!).toSet());
|
||||
final newAddresses = <AddressDetails >[];
|
||||
final newAddresses = <AddressDetails>[];
|
||||
todo.forEach((entry) {
|
||||
final position = entry.latLng;
|
||||
final countryCode = countryCodeMap.entries.firstWhereOrNull((kv) => kv.value.contains(position))?.key;
|
||||
|
@ -98,7 +98,7 @@ mixin LocationMixin on SourceBase {
|
|||
final progressTotal = todo.length;
|
||||
setProgress(done: progressDone, total: progressTotal);
|
||||
|
||||
final newAddresses = <AddressDetails >[];
|
||||
final newAddresses = <AddressDetails>[];
|
||||
await Future.forEach<AvesEntry>(todo, (entry) async {
|
||||
final latLng = approximateLatLng(entry);
|
||||
if (knownLocations.containsKey(latLng)) {
|
||||
|
@ -132,7 +132,7 @@ mixin LocationMixin on SourceBase {
|
|||
}
|
||||
|
||||
void updateLocations() {
|
||||
final locations = visibleEntries.where((entry) => entry.hasAddress).map((entry) => entry.addressDetails).cast<AddressDetails >().toList();
|
||||
final locations = visibleEntries.where((entry) => entry.hasAddress).map((entry) => entry.addressDetails).cast<AddressDetails>().toList();
|
||||
final updatedPlaces = locations.map((address) => address.place).where((s) => s != null && s.isNotEmpty).toSet().toList()..sort(compareAsciiUpperCase as int Function(String?, String?)?);
|
||||
if (!listEquals(updatedPlaces, sortedPlaces)) {
|
||||
sortedPlaces = List.unmodifiable(updatedPlaces);
|
||||
|
@ -163,7 +163,7 @@ mixin LocationMixin on SourceBase {
|
|||
_filterEntryCountMap.clear();
|
||||
_filterRecentEntryMap.clear();
|
||||
} else {
|
||||
countryCodes = entries.where((entry) => entry.hasAddress).map((entry) => entry.addressDetails!.countryCode).where((v) => v != null).cast<String >().toSet();
|
||||
countryCodes = entries.where((entry) => entry.hasAddress).map((entry) => entry.addressDetails!.countryCode).where((v) => v != null).cast<String>().toSet();
|
||||
countryCodes.forEach(_filterEntryCountMap.remove);
|
||||
}
|
||||
eventBus.fire(CountrySummaryInvalidatedEvent(countryCodes));
|
||||
|
|
|
@ -10,7 +10,6 @@ import 'package:aves/services/service_policy.dart';
|
|||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
|
||||
// ignore: import_of_legacy_library_into_null_safe
|
||||
import 'package:streams_channel/streams_channel.dart';
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@ class Constants {
|
|||
sourceUrl: 'https://android.googlesource.com/platform/frameworks/support/+/androidx-main/exifinterface/exifinterface',
|
||||
),
|
||||
Dependency(
|
||||
name: 'Android-TiffBitmapFactory',
|
||||
name: 'Android-TiffBitmapFactory (Aves fork)',
|
||||
license: 'MIT',
|
||||
licenseUrl: 'https://github.com/deckerst/Android-TiffBitmapFactory/blob/master/license.txt',
|
||||
sourceUrl: 'https://github.com/deckerst/Android-TiffBitmapFactory',
|
||||
|
@ -67,10 +67,10 @@ class Constants {
|
|||
|
||||
static const List<Dependency> flutterPlugins = [
|
||||
Dependency(
|
||||
name: 'Connectivity',
|
||||
name: 'Connectivity Plus',
|
||||
license: 'BSD 3-Clause',
|
||||
licenseUrl: 'https://github.com/flutter/plugins/blob/master/packages/connectivity/connectivity/LICENSE',
|
||||
sourceUrl: 'https://github.com/flutter/plugins/blob/master/packages/connectivity/connectivity',
|
||||
licenseUrl: 'https://github.com/fluttercommunity/plus_plugins/blob/main/packages/connectivity_plus/LICENSE',
|
||||
sourceUrl: 'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/connectivity_plus',
|
||||
),
|
||||
Dependency(
|
||||
name: 'FlutterFire (Core, Analytics, Crashlytics)',
|
||||
|
@ -79,7 +79,7 @@ class Constants {
|
|||
sourceUrl: 'https://github.com/FirebaseExtended/flutterfire',
|
||||
),
|
||||
Dependency(
|
||||
name: 'fijkplayer',
|
||||
name: 'fijkplayer (Aves fork)',
|
||||
license: 'MIT',
|
||||
licenseUrl: 'https://github.com/deckerst/fijkplayer/blob/master/LICENSE',
|
||||
sourceUrl: 'https://github.com/deckerst/fijkplayer',
|
||||
|
@ -97,10 +97,10 @@ class Constants {
|
|||
sourceUrl: 'https://github.com/flutter/plugins/blob/master/packages/google_maps_flutter/google_maps_flutter',
|
||||
),
|
||||
Dependency(
|
||||
name: 'Package Info',
|
||||
name: 'Package Info Plus',
|
||||
license: 'BSD 3-Clause',
|
||||
licenseUrl: 'https://github.com/flutter/plugins/blob/master/packages/package_info/LICENSE',
|
||||
sourceUrl: 'https://github.com/flutter/plugins/tree/master/packages/package_info',
|
||||
licenseUrl: 'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/package_info_plus/LICENSE',
|
||||
sourceUrl: 'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/package_info_plus',
|
||||
),
|
||||
Dependency(
|
||||
name: 'Permission Handler',
|
||||
|
@ -127,10 +127,10 @@ class Constants {
|
|||
sourceUrl: 'https://github.com/tekartik/sqflite',
|
||||
),
|
||||
Dependency(
|
||||
name: 'Streams Channel',
|
||||
name: 'Streams Channel (Aves fork)',
|
||||
license: 'Apache 2.0',
|
||||
licenseUrl: 'https://github.com/loup-v/streams_channel/blob/master/LICENSE',
|
||||
sourceUrl: 'https://github.com/loup-v/streams_channel',
|
||||
licenseUrl: 'https://github.com/deckerst/aves_streams_channel/blob/master/LICENSE',
|
||||
sourceUrl: 'https://github.com/deckerst/aves_streams_channel',
|
||||
),
|
||||
Dependency(
|
||||
name: 'URL Launcher',
|
||||
|
@ -229,7 +229,7 @@ class Constants {
|
|||
sourceUrl: 'https://github.com/benPesso/flutter_decorated_icon',
|
||||
),
|
||||
Dependency(
|
||||
name: 'Expansion Tile Card',
|
||||
name: 'Expansion Tile Card (Aves fork)',
|
||||
license: 'BSD 3-Clause',
|
||||
licenseUrl: 'https://github.com/deckerst/expansion_tile_card/blob/master/LICENSE',
|
||||
sourceUrl: 'https://github.com/deckerst/expansion_tile_card',
|
||||
|
|
|
@ -5,7 +5,7 @@ import 'package:aves/widgets/common/basic/link_chip.dart';
|
|||
import 'package:aves/widgets/common/extensions/build_context.dart';
|
||||
import 'package:aves/widgets/common/identity/aves_logo.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:package_info/package_info.dart';
|
||||
import 'package:package_info_plus/package_info_plus.dart';
|
||||
|
||||
class AppReference extends StatefulWidget {
|
||||
@override
|
||||
|
|
|
@ -8,7 +8,7 @@ import 'package:flutter/material.dart';
|
|||
|
||||
mixin PermissionAwareMixin {
|
||||
Future<bool> checkStoragePermission(BuildContext context, Set<AvesEntry> entries) {
|
||||
return checkStoragePermissionForAlbums(context, entries.where((e) => e.path != null).map((e) => e.directory).cast<String >().toSet());
|
||||
return checkStoragePermissionForAlbums(context, entries.where((e) => e.path != null).map((e) => e.directory).cast<String>().toSet());
|
||||
}
|
||||
|
||||
Future<bool> checkStoragePermissionForAlbums(BuildContext context, Set<String> albumPaths) async {
|
||||
|
|
|
@ -15,7 +15,7 @@ import 'package:flutter/widgets.dart';
|
|||
mixin SizeAwareMixin {
|
||||
Future<bool> checkFreeSpaceForMove(
|
||||
BuildContext context,
|
||||
Set<AvesEntry > selection,
|
||||
Set<AvesEntry> selection,
|
||||
String destinationAlbum,
|
||||
MoveType moveType,
|
||||
) async {
|
||||
|
|
|
@ -6,7 +6,7 @@ import 'package:provider/provider.dart';
|
|||
|
||||
class DraggableThumbLabel<T> extends StatelessWidget {
|
||||
final double offsetY;
|
||||
final List<String > Function(BuildContext context, T item) lineBuilder;
|
||||
final List<String> Function(BuildContext context, T item) lineBuilder;
|
||||
|
||||
const DraggableThumbLabel({
|
||||
required this.offsetY,
|
||||
|
|
|
@ -145,7 +145,7 @@ abstract class SectionedListLayoutProvider<T> extends StatelessWidget {
|
|||
|
||||
bool get showHeaders;
|
||||
|
||||
Map<SectionKey, List<T> > get sections;
|
||||
Map<SectionKey, List<T>> get sections;
|
||||
|
||||
double getHeaderExtent(BuildContext context, SectionKey sectionKey);
|
||||
|
||||
|
@ -163,7 +163,7 @@ abstract class SectionedListLayoutProvider<T> extends StatelessWidget {
|
|||
}
|
||||
|
||||
class SectionedListLayout<T> {
|
||||
final Map<SectionKey, List<T> > sections;
|
||||
final Map<SectionKey, List<T>> sections;
|
||||
final bool showHeaders;
|
||||
final int columnCount;
|
||||
final double tileExtent, spacing;
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
import 'package:collection/collection.dart';
|
||||
import 'dart:ui' as ui;
|
||||
|
||||
import 'package:aves/theme/durations.dart';
|
||||
import 'package:aves/widgets/common/providers/media_query_data_provider.dart';
|
||||
import 'package:aves/widgets/common/tile_extent_controller.dart';
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/rendering.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
|
|
@ -63,7 +63,7 @@ class XmpNamespace {
|
|||
return extractData(prop) ? null : prop;
|
||||
})
|
||||
.where((v) => v != null)
|
||||
.cast<XmpProp >()
|
||||
.cast<XmpProp>()
|
||||
.toList()
|
||||
..sort((a, b) => compareAsciiUpperCaseNatural(a.displayKey, b.displayKey));
|
||||
|
||||
|
|
|
@ -12,7 +12,8 @@ abstract class XmpGoogleNamespace extends XmpNamespace {
|
|||
|
||||
@override
|
||||
Map<String, InfoLinkHandler> linkifyValues(List<XmpProp> props) {
|
||||
return Map.fromEntries(dataProps.map((t) {
|
||||
return Map.fromEntries(dataProps
|
||||
.map((t) {
|
||||
final dataPropPath = t.item1;
|
||||
final mimePropPath = t.item2;
|
||||
final dataProp = props.firstWhereOrNull((prop) => prop.path == dataPropPath);
|
||||
|
@ -28,7 +29,9 @@ abstract class XmpGoogleNamespace extends XmpNamespace {
|
|||
).dispatch(context),
|
||||
))
|
||||
: null;
|
||||
}).where((kv) => kv != null).cast<MapEntry<String, InfoLinkHandler>>());
|
||||
})
|
||||
.where((kv) => kv != null)
|
||||
.cast<MapEntry<String, InfoLinkHandler>>());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
141
pubspec.lock
141
pubspec.lock
|
@ -35,7 +35,7 @@ packages:
|
|||
name: async
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.5.0"
|
||||
version: "2.6.1"
|
||||
barcode:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -99,34 +99,48 @@ packages:
|
|||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.15.0"
|
||||
connectivity:
|
||||
connectivity_plus:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: connectivity
|
||||
name: connectivity_plus
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.3"
|
||||
connectivity_for_web:
|
||||
version: "1.0.1"
|
||||
connectivity_plus_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: connectivity_for_web
|
||||
name: connectivity_plus_linux
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.4.0"
|
||||
connectivity_macos:
|
||||
version: "1.0.1"
|
||||
connectivity_plus_macos:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: connectivity_macos
|
||||
name: connectivity_plus_macos
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.2.0"
|
||||
connectivity_platform_interface:
|
||||
version: "1.0.1"
|
||||
connectivity_plus_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: connectivity_platform_interface
|
||||
name: connectivity_plus_platform_interface
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.1"
|
||||
version: "1.0.1"
|
||||
connectivity_plus_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: connectivity_plus_web
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
connectivity_plus_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: connectivity_plus_windows
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
convert:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -154,7 +168,14 @@ packages:
|
|||
name: crypto
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.0"
|
||||
version: "3.0.1"
|
||||
dbus:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: dbus
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.2.5"
|
||||
decorated_icon:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -197,10 +218,10 @@ packages:
|
|||
description:
|
||||
path: "."
|
||||
ref: aves
|
||||
resolved-ref: "7bb26e681ceef9d7b311f0b0f51eab99c3590474"
|
||||
resolved-ref: ded83f43a1c3a664d5e9cfcab687c3caab2cbdb0
|
||||
url: "git://github.com/deckerst/fijkplayer.git"
|
||||
source: git
|
||||
version: "0.8.7"
|
||||
version: "0.8.8"
|
||||
file:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -221,7 +242,7 @@ packages:
|
|||
name: firebase_analytics
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "8.0.4"
|
||||
version: "8.1.0"
|
||||
firebase_analytics_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -242,7 +263,7 @@ packages:
|
|||
name: firebase_core
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
version: "1.2.0"
|
||||
firebase_core_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -256,21 +277,21 @@ packages:
|
|||
name: firebase_core_web
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.3"
|
||||
version: "1.1.0"
|
||||
firebase_crashlytics:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: firebase_crashlytics
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.3"
|
||||
version: "2.0.4"
|
||||
firebase_crashlytics_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: firebase_crashlytics_platform_interface
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.3"
|
||||
version: "3.0.4"
|
||||
flutter:
|
||||
dependency: "direct main"
|
||||
description: flutter
|
||||
|
@ -295,13 +316,6 @@ packages:
|
|||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.7.0"
|
||||
flutter_image:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_image
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.0"
|
||||
flutter_localizations:
|
||||
dependency: "direct main"
|
||||
description: flutter
|
||||
|
@ -312,10 +326,10 @@ packages:
|
|||
description:
|
||||
path: "."
|
||||
ref: "issues/829-nullsafety"
|
||||
resolved-ref: "09b306afdfc5d748cdaf3307084e70fcb6a21c6d"
|
||||
resolved-ref: d9674b5c4fec7d759462a417c8acc548a3e720e1
|
||||
url: "git://github.com/fleaflet/flutter_map.git"
|
||||
source: git
|
||||
version: "0.12.0"
|
||||
version: "0.13.0"
|
||||
flutter_markdown:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -393,7 +407,7 @@ packages:
|
|||
name: google_maps_flutter
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.4"
|
||||
version: "2.0.5"
|
||||
google_maps_flutter_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -562,13 +576,48 @@ packages:
|
|||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.0"
|
||||
package_info:
|
||||
package_info_plus:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: package_info
|
||||
name: package_info_plus
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.0"
|
||||
version: "1.0.1"
|
||||
package_info_plus_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: package_info_plus_linux
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
package_info_plus_macos:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: package_info_plus_macos
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
package_info_plus_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: package_info_plus_platform_interface
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
package_info_plus_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: package_info_plus_web
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
package_info_plus_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: package_info_plus_windows
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
palette_generator:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -652,14 +701,14 @@ packages:
|
|||
name: permission_handler
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "7.1.0"
|
||||
version: "8.0.0+1"
|
||||
permission_handler_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_platform_interface
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.3.0"
|
||||
version: "3.5.0"
|
||||
petitparser:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -878,9 +927,11 @@ packages:
|
|||
streams_channel:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: streams_channel
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
path: "."
|
||||
ref: HEAD
|
||||
resolved-ref: d644fedd9cb79a45b1b92788880e81b846a69d9b
|
||||
url: "git://github.com/deckerst/aves_streams_channel.git"
|
||||
source: git
|
||||
version: "0.3.0"
|
||||
string_scanner:
|
||||
dependency: transitive
|
||||
|
@ -965,7 +1016,7 @@ packages:
|
|||
name: url_launcher
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "6.0.3"
|
||||
version: "6.0.4"
|
||||
url_launcher_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -986,7 +1037,7 @@ packages:
|
|||
name: url_launcher_platform_interface
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.2"
|
||||
version: "2.0.3"
|
||||
url_launcher_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1021,7 +1072,7 @@ packages:
|
|||
name: vm_service
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "6.1.0+1"
|
||||
version: "6.2.0"
|
||||
watcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1056,7 +1107,7 @@ packages:
|
|||
name: win32
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.5"
|
||||
version: "2.1.1"
|
||||
wkt_parser:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1077,7 +1128,7 @@ packages:
|
|||
name: xml
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "5.1.0"
|
||||
version: "5.1.1"
|
||||
yaml:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1086,5 +1137,5 @@ packages:
|
|||
source: hosted
|
||||
version: "3.1.0"
|
||||
sdks:
|
||||
dart: ">=2.12.0 <3.0.0"
|
||||
dart: ">=2.13.0 <3.0.0"
|
||||
flutter: ">=2.0.0"
|
||||
|
|
16
pubspec.yaml
16
pubspec.yaml
|
@ -7,17 +7,9 @@ publish_to: none
|
|||
environment:
|
||||
sdk: '>=2.12.0 <3.0.0'
|
||||
|
||||
# TODO TLAD switch to Flutter stable when possible, currently on dev/beta because of the following mess:
|
||||
# printing >=5.0.1 depends on pdf ^3.0.1, pdf >=3.0.1 depends on crypto ^3.0.0 and archive ^3.1.0
|
||||
# but `flutter_driver` (shipped with Flutter) dependencies are too old in stable v2.0.1
|
||||
# bump `crypto` and others - 2021/02/05 https://github.com/flutter/flutter/commit/bc1cf4945841ba5874f5262b8146d52750e7c11f
|
||||
# bump `archive` from 3.0.0 to 3.1.2 - 2021/03/04 https://github.com/flutter/flutter/commit/ddcb8d7d6d3fcedc906b2f1bf26b73c018d3dc28
|
||||
|
||||
# not null safe, as of 2021/04/28
|
||||
# not null safe, as of 2021/05/23
|
||||
# `charts_flutter` - https://github.com/google/charts/issues/579
|
||||
# `fijkplayer` - https://github.com/befovy/fijkplayer/issues/381
|
||||
# `flutter_map` - https://github.com/fleaflet/flutter_map/issues/829
|
||||
# `streams_channel` - unmaintained? - no issue/PR
|
||||
|
||||
dependencies:
|
||||
flutter:
|
||||
|
@ -26,7 +18,7 @@ dependencies:
|
|||
sdk: flutter
|
||||
charts_flutter:
|
||||
collection:
|
||||
connectivity:
|
||||
connectivity_plus:
|
||||
country_code:
|
||||
decorated_icon:
|
||||
event_bus:
|
||||
|
@ -56,7 +48,7 @@ dependencies:
|
|||
latlong2:
|
||||
material_design_icons_flutter:
|
||||
overlay_support:
|
||||
package_info:
|
||||
package_info_plus:
|
||||
palette_generator:
|
||||
# TODO TLAD upgrade panorama when this is fixed: https://github.com/zesage/panorama/issues/25 (bug in v0.4.1)
|
||||
panorama: 0.4.0
|
||||
|
@ -69,6 +61,8 @@ dependencies:
|
|||
shared_preferences:
|
||||
sqflite:
|
||||
streams_channel:
|
||||
git:
|
||||
url: git://github.com/deckerst/aves_streams_channel.git
|
||||
tuple:
|
||||
url_launcher:
|
||||
version:
|
||||
|
|
File diff suppressed because one or more lines are too long
1
shaders_2.2.0.sksl.json
Normal file
1
shaders_2.2.0.sksl.json
Normal file
File diff suppressed because one or more lines are too long
Loading…
Reference in a new issue