Reenable GMaps on devices with new renderer

This commit is contained in:
Ming Ming 2022-08-30 02:21:36 +08:00
parent ebff61b08e
commit 5925d3f59b
5 changed files with 59 additions and 20 deletions

View file

@ -106,5 +106,6 @@ dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
// fix crash on sdk33, need investigation // fix crash on sdk33, need investigation
implementation "androidx.window:window:1.0.0" 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' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.8'
} }

View file

@ -3,12 +3,10 @@ package com.nkming.nc_photos
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.util.Log
import androidx.annotation.NonNull import androidx.annotation.NonNull
import com.nkming.nc_photos.plugin.NcPhotosPlugin import com.google.android.gms.maps.MapsInitializer
import com.nkming.nc_photos.plugin.UriUtil import com.google.android.gms.maps.OnMapsSdkInitializedCallback
import com.nkming.nc_photos.plugin.logE import com.nkming.nc_photos.plugin.*
import com.nkming.nc_photos.plugin.logI
import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.EventChannel import io.flutter.plugin.common.EventChannel
@ -16,7 +14,8 @@ import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel
import java.net.URLEncoder import java.net.URLEncoder
class MainActivity : FlutterActivity(), MethodChannel.MethodCallHandler { class MainActivity : FlutterActivity(), MethodChannel.MethodCallHandler,
OnMapsSdkInitializedCallback {
companion object { companion object {
private const val METHOD_CHANNEL = "com.nkming.nc_photos/activity" private const val METHOD_CHANNEL = "com.nkming.nc_photos/activity"
@ -30,6 +29,9 @@ class MainActivity : FlutterActivity(), MethodChannel.MethodCallHandler {
logI(TAG, "Initial route: $route") logI(TAG, "Initial route: $route")
_initialRoute = route _initialRoute = route
} }
MapsInitializer.initialize(
applicationContext, MapsInitializer.Renderer.LATEST, this
)
} }
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
@ -75,10 +77,27 @@ class MainActivity : FlutterActivity(), MethodChannel.MethodCallHandler {
_initialRoute = null _initialRoute = null
} }
"isNewGMapsRenderer" -> {
result.success(_isNewGMapsRenderer)
}
else -> result.notImplemented() 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? { private fun getRouteFromImageProcessorResult(intent: Intent): String? {
val resultUri = val resultUri =
intent.getParcelableExtra<Uri>( intent.getParcelableExtra<Uri>(
@ -98,4 +117,5 @@ class MainActivity : FlutterActivity(), MethodChannel.MethodCallHandler {
} }
private var _initialRoute: String? = null private var _initialRoute: String? = null
private var _isNewGMapsRenderer = false
} }

View file

@ -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.dart';
import 'package:nc_photos/entity/tagged_file/data_source.dart'; import 'package:nc_photos/entity/tagged_file/data_source.dart';
import 'package:nc_photos/k.dart' as k; 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/android/android_info.dart';
import 'package:nc_photos/mobile/platform.dart' import 'package:nc_photos/mobile/platform.dart'
if (dart.library.html) 'package:nc_photos/web/platform.dart' as platform; if (dart.library.html) 'package:nc_photos/web/platform.dart' as platform;
@ -49,6 +50,8 @@ enum InitIsolateType {
flutterIsolate, flutterIsolate,
} }
bool isNewGMapsRenderer() => _isNewGMapsRenderer;
Future<void> init(InitIsolateType isolateType) async { Future<void> init(InitIsolateType isolateType) async {
if (_hasInitedInThisIsolate) { if (_hasInitedInThisIsolate) {
_log.warning("[init] Already initialized in this isolate"); _log.warning("[init] Already initialized in this isolate");
@ -71,6 +74,14 @@ Future<void> init(InitIsolateType isolateType) async {
await _initDiContainer(isolateType); await _initDiContainer(isolateType);
_initVisibilityDetector(); _initVisibilityDetector();
if (isolateType == InitIsolateType.main) {
try {
_isNewGMapsRenderer = await Activity.isNewGMapsRenderer();
} catch (e, stackTrace) {
_log.severe("[init] Failed while isNewGMapsRenderer", e, stackTrace);
}
}
_hasInitedInThisIsolate = true; _hasInitedInThisIsolate = true;
} }
@ -232,3 +243,4 @@ Future<sql.SqliteDb> _createDb(InitIsolateType isolateType) async {
final _log = Logger("app_init"); final _log = Logger("app_init");
var _hasInitedInThisIsolate = false; var _hasInitedInThisIsolate = false;
var _isNewGMapsRenderer = false;

View file

@ -1,8 +1,12 @@
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:nc_photos/future_extension.dart';
class Activity { class Activity {
static Future<String?> consumeInitialRoute() => static Future<String?> consumeInitialRoute() =>
_methodChannel.invokeMethod("consumeInitialRoute"); _methodChannel.invokeMethod("consumeInitialRoute");
static Future<bool> isNewGMapsRenderer() =>
_methodChannel.invokeMethod<bool>("isNewGMapsRenderer").notNull();
static const _methodChannel = MethodChannel("com.nkming.nc_photos/activity"); static const _methodChannel = MethodChannel("com.nkming.nc_photos/activity");
} }

View file

@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart'; import 'package:flutter_map/flutter_map.dart';
import 'package:latlong2/latlong.dart'; import 'package:latlong2/latlong.dart';
import 'package:nc_photos/app_init.dart' as app_init;
import 'package:nc_photos/mobile/platform.dart' import 'package:nc_photos/mobile/platform.dart'
if (dart.library.html) 'package:nc_photos/web/platform.dart' as platform; if (dart.library.html) 'package:nc_photos/web/platform.dart' as platform;
import 'package:nc_photos/pref.dart'; import 'package:nc_photos/pref.dart';
@ -35,20 +36,21 @@ class GpsMap extends StatelessWidget {
@override @override
build(BuildContext context) { build(BuildContext context) {
// if (GpsMapProvider.values[Pref().getGpsMapProviderOr(0)] == if (GpsMapProvider.values[Pref().getGpsMapProviderOr(0)] ==
// GpsMapProvider.osm) { GpsMapProvider.osm ||
return _OsmGpsMap( !app_init.isNewGMapsRenderer()) {
center: center, return _OsmGpsMap(
zoom: zoom, center: center,
onTap: onTap, zoom: zoom,
); onTap: onTap,
// } else { );
// return _GoogleGpsMap( } else {
// center: center, return _GoogleGpsMap(
// zoom: zoom, center: center,
// onTap: onTap, zoom: zoom,
// ); onTap: onTap,
// } );
}
} }
/// A pair of latitude and longitude coordinates, stored as degrees /// A pair of latitude and longitude coordinates, stored as degrees