[google_maps_flutter] fix crash and remove listeners (#2704)

diff --git a/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md
index bdc8a73..9754552 100644
--- a/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md
+++ b/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.5.26+4
+
+* Android: Fix map view crash when "exit app" while using `FragmentActivity`.
+* Android: Remove listeners from `GoogleMap` when disposing.
+
 ## 0.5.26+3
 
 * iOS: observe the bounds update for the `GMSMapView` to reset the camera setting.
diff --git a/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java b/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java
index 4232b39..6f59aa6 100644
--- a/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java
+++ b/packages/google_maps_flutter/google_maps_flutter/android/src/main/java/io/flutter/plugins/googlemaps/GoogleMapController.java
@@ -23,6 +23,7 @@
 import android.util.Log;
 import android.view.View;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.lifecycle.DefaultLifecycleObserver;
 import androidx.lifecycle.Lifecycle;
 import androidx.lifecycle.LifecycleOwner;
@@ -59,20 +60,10 @@
     implements Application.ActivityLifecycleCallbacks,
         DefaultLifecycleObserver,
         ActivityPluginBinding.OnSaveInstanceStateListener,
-        GoogleMap.OnCameraIdleListener,
-        GoogleMap.OnCameraMoveListener,
-        GoogleMap.OnCameraMoveStartedListener,
-        GoogleMap.OnInfoWindowClickListener,
-        GoogleMap.OnMarkerClickListener,
-        GoogleMap.OnPolygonClickListener,
-        GoogleMap.OnPolylineClickListener,
-        GoogleMap.OnCircleClickListener,
         GoogleMapOptionsSink,
         MethodChannel.MethodCallHandler,
         OnMapReadyCallback,
-        GoogleMap.OnMapClickListener,
-        GoogleMap.OnMapLongClickListener,
-        GoogleMap.OnMarkerDragListener,
+        GoogleMapListener,
         PlatformView {
 
   private static final String TAG = "GoogleMapController";
@@ -204,16 +195,7 @@
       mapReadyResult.success(null);
       mapReadyResult = null;
     }
-    googleMap.setOnCameraMoveStartedListener(this);
-    googleMap.setOnCameraMoveListener(this);
-    googleMap.setOnCameraIdleListener(this);
-    googleMap.setOnMarkerClickListener(this);
-    googleMap.setOnMarkerDragListener(this);
-    googleMap.setOnPolygonClickListener(this);
-    googleMap.setOnPolylineClickListener(this);
-    googleMap.setOnCircleClickListener(this);
-    googleMap.setOnMapClickListener(this);
-    googleMap.setOnMapLongClickListener(this);
+    setGoogleMapListener(this);
     updateMyLocationSettings();
     markersController.setGoogleMap(googleMap);
     polygonsController.setGoogleMap(googleMap);
@@ -544,10 +526,23 @@
     }
     disposed = true;
     methodChannel.setMethodCallHandler(null);
-    mapView.onDestroy();
+    setGoogleMapListener(null);
     getApplication().unregisterActivityLifecycleCallbacks(this);
   }
 
+  private void setGoogleMapListener(@Nullable GoogleMapListener listener) {
+    googleMap.setOnCameraMoveStartedListener(listener);
+    googleMap.setOnCameraMoveListener(listener);
+    googleMap.setOnCameraIdleListener(listener);
+    googleMap.setOnMarkerClickListener(listener);
+    googleMap.setOnMarkerDragListener(listener);
+    googleMap.setOnPolygonClickListener(listener);
+    googleMap.setOnPolylineClickListener(listener);
+    googleMap.setOnCircleClickListener(listener);
+    googleMap.setOnMapClickListener(listener);
+    googleMap.setOnMapLongClickListener(listener);
+  }
+
   // @Override
   // The minimum supported version of Flutter doesn't have this method on the PlatformView interface, but the maximum
   // does. This will override it when available even with the annotation commented out.
@@ -899,3 +894,16 @@
     this.buildingsEnabled = buildingsEnabled;
   }
 }
+
+interface GoogleMapListener
+    extends GoogleMap.OnCameraIdleListener,
+        GoogleMap.OnCameraMoveListener,
+        GoogleMap.OnCameraMoveStartedListener,
+        GoogleMap.OnInfoWindowClickListener,
+        GoogleMap.OnMarkerClickListener,
+        GoogleMap.OnPolygonClickListener,
+        GoogleMap.OnPolylineClickListener,
+        GoogleMap.OnCircleClickListener,
+        GoogleMap.OnMapClickListener,
+        GoogleMap.OnMapLongClickListener,
+        GoogleMap.OnMarkerDragListener {}
diff --git a/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml
index 8c50efc..7831934 100644
--- a/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml
+++ b/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml
@@ -1,7 +1,7 @@
 name: google_maps_flutter
 description: A Flutter plugin for integrating Google Maps in iOS and Android applications.
 homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter/google_maps_flutter
-version: 0.5.26+3
+version: 0.5.26+4
 
 dependencies:
   flutter: