From 5925d3f59b0cf5c54966dec448e06d8141fbff16 Mon Sep 17 00:00:00 2001 From: Ming Ming Date: Tue, 30 Aug 2022 02:21:36 +0800 Subject: [PATCH] Reenable GMaps on devices with new renderer --- app/android/app/build.gradle | 1 + .../com/nkming/nc_photos/MainActivity.kt | 32 +++++++++++++++---- app/lib/app_init.dart | 12 +++++++ app/lib/mobile/android/activity.dart | 4 +++ app/lib/widget/gps_map.dart | 30 +++++++++-------- 5 files changed, 59 insertions(+), 20 deletions(-) diff --git a/app/android/app/build.gradle b/app/android/app/build.gradle index 4abef6e7..c91d2b8b 100644 --- a/app/android/app/build.gradle +++ b/app/android/app/build.gradle @@ -106,5 +106,6 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" // fix crash on sdk33, need investigation implementation "androidx.window:window:1.0.0" + implementation 'com.google.android.gms:play-services-maps:18.0.2' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.8' } diff --git a/app/android/app/src/main/kotlin/com/nkming/nc_photos/MainActivity.kt b/app/android/app/src/main/kotlin/com/nkming/nc_photos/MainActivity.kt index c8a122b6..0debdf38 100644 --- a/app/android/app/src/main/kotlin/com/nkming/nc_photos/MainActivity.kt +++ b/app/android/app/src/main/kotlin/com/nkming/nc_photos/MainActivity.kt @@ -3,12 +3,10 @@ package com.nkming.nc_photos import android.content.Intent import android.net.Uri import android.os.Bundle -import android.util.Log import androidx.annotation.NonNull -import com.nkming.nc_photos.plugin.NcPhotosPlugin -import com.nkming.nc_photos.plugin.UriUtil -import com.nkming.nc_photos.plugin.logE -import com.nkming.nc_photos.plugin.logI +import com.google.android.gms.maps.MapsInitializer +import com.google.android.gms.maps.OnMapsSdkInitializedCallback +import com.nkming.nc_photos.plugin.* import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.EventChannel @@ -16,7 +14,8 @@ import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import java.net.URLEncoder -class MainActivity : FlutterActivity(), MethodChannel.MethodCallHandler { +class MainActivity : FlutterActivity(), MethodChannel.MethodCallHandler, + OnMapsSdkInitializedCallback { companion object { private const val METHOD_CHANNEL = "com.nkming.nc_photos/activity" @@ -30,6 +29,9 @@ class MainActivity : FlutterActivity(), MethodChannel.MethodCallHandler { logI(TAG, "Initial route: $route") _initialRoute = route } + MapsInitializer.initialize( + applicationContext, MapsInitializer.Renderer.LATEST, this + ) } override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { @@ -75,10 +77,27 @@ class MainActivity : FlutterActivity(), MethodChannel.MethodCallHandler { _initialRoute = null } + "isNewGMapsRenderer" -> { + result.success(_isNewGMapsRenderer) + } + else -> result.notImplemented() } } + override fun onMapsSdkInitialized(renderer: MapsInitializer.Renderer) { + _isNewGMapsRenderer = when (renderer) { + MapsInitializer.Renderer.LATEST -> { + logD(TAG, "Using new map renderer") + true + } + MapsInitializer.Renderer.LEGACY -> { + logD(TAG, "Using legacy map renderer") + false + } + } + } + private fun getRouteFromImageProcessorResult(intent: Intent): String? { val resultUri = intent.getParcelableExtra( @@ -98,4 +117,5 @@ class MainActivity : FlutterActivity(), MethodChannel.MethodCallHandler { } private var _initialRoute: String? = null + private var _isNewGMapsRenderer = false } diff --git a/app/lib/app_init.dart b/app/lib/app_init.dart index 3adf7d78..d0310f9c 100644 --- a/app/lib/app_init.dart +++ b/app/lib/app_init.dart @@ -31,6 +31,7 @@ import 'package:nc_photos/entity/tag/data_source.dart'; import 'package:nc_photos/entity/tagged_file.dart'; import 'package:nc_photos/entity/tagged_file/data_source.dart'; import 'package:nc_photos/k.dart' as k; +import 'package:nc_photos/mobile/android/activity.dart'; import 'package:nc_photos/mobile/android/android_info.dart'; import 'package:nc_photos/mobile/platform.dart' if (dart.library.html) 'package:nc_photos/web/platform.dart' as platform; @@ -49,6 +50,8 @@ enum InitIsolateType { flutterIsolate, } +bool isNewGMapsRenderer() => _isNewGMapsRenderer; + Future init(InitIsolateType isolateType) async { if (_hasInitedInThisIsolate) { _log.warning("[init] Already initialized in this isolate"); @@ -71,6 +74,14 @@ Future init(InitIsolateType isolateType) async { await _initDiContainer(isolateType); _initVisibilityDetector(); + if (isolateType == InitIsolateType.main) { + try { + _isNewGMapsRenderer = await Activity.isNewGMapsRenderer(); + } catch (e, stackTrace) { + _log.severe("[init] Failed while isNewGMapsRenderer", e, stackTrace); + } + } + _hasInitedInThisIsolate = true; } @@ -232,3 +243,4 @@ Future _createDb(InitIsolateType isolateType) async { final _log = Logger("app_init"); var _hasInitedInThisIsolate = false; +var _isNewGMapsRenderer = false; diff --git a/app/lib/mobile/android/activity.dart b/app/lib/mobile/android/activity.dart index 16388ab3..d873dbc4 100644 --- a/app/lib/mobile/android/activity.dart +++ b/app/lib/mobile/android/activity.dart @@ -1,8 +1,12 @@ import 'package:flutter/services.dart'; +import 'package:nc_photos/future_extension.dart'; class Activity { static Future consumeInitialRoute() => _methodChannel.invokeMethod("consumeInitialRoute"); + static Future isNewGMapsRenderer() => + _methodChannel.invokeMethod("isNewGMapsRenderer").notNull(); + static const _methodChannel = MethodChannel("com.nkming.nc_photos/activity"); } diff --git a/app/lib/widget/gps_map.dart b/app/lib/widget/gps_map.dart index 8cb6e518..60d21758 100644 --- a/app/lib/widget/gps_map.dart +++ b/app/lib/widget/gps_map.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:latlong2/latlong.dart'; +import 'package:nc_photos/app_init.dart' as app_init; import 'package:nc_photos/mobile/platform.dart' if (dart.library.html) 'package:nc_photos/web/platform.dart' as platform; import 'package:nc_photos/pref.dart'; @@ -35,20 +36,21 @@ class GpsMap extends StatelessWidget { @override build(BuildContext context) { - // if (GpsMapProvider.values[Pref().getGpsMapProviderOr(0)] == - // GpsMapProvider.osm) { - return _OsmGpsMap( - center: center, - zoom: zoom, - onTap: onTap, - ); - // } else { - // return _GoogleGpsMap( - // center: center, - // zoom: zoom, - // onTap: onTap, - // ); - // } + if (GpsMapProvider.values[Pref().getGpsMapProviderOr(0)] == + GpsMapProvider.osm || + !app_init.isNewGMapsRenderer()) { + return _OsmGpsMap( + center: center, + zoom: zoom, + onTap: onTap, + ); + } else { + return _GoogleGpsMap( + center: center, + zoom: zoom, + onTap: onTap, + ); + } } /// A pair of latitude and longitude coordinates, stored as degrees