From 079036aa1c5b6b1a432a6e615fe3fe6c9b31f61d Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Wed, 29 Apr 2020 22:49:08 -0700 Subject: [PATCH 01/50] - Add: (Android/iOS/Browser) `mapOptions.preferences.gestureBounds` - Add: (Android/iOS/Browser) ElevationService --- README.md | 190 ++++-------------- package.json | 2 +- plugin.xml | 19 +- .../google/maps/AsyncGetJsonWithURL.java | 113 +++++++++++ .../google/maps/AsyncHttpGetInterface.java | 7 + .../google/maps/PluginElevationService.java | 112 +++++++++++ .../google/maps/PluginLocationService.java | 5 +- src/android/plugin/google/maps/PluginMap.java | 27 +-- .../plugin/google/maps/PluginUtil.java | 50 +++++ src/browser/PluginElevationService.js | 125 ++++++++++++ src/browser/PluginGeocoder.js | 5 +- src/browser/PluginMap.js | 83 +++----- src/ios/GoogleMaps/CordovaGoogleMaps.m | 4 + src/ios/GoogleMaps/PluginElevationService.h | 18 ++ src/ios/GoogleMaps/PluginElevationService.m | 115 +++++++++++ src/ios/GoogleMaps/PluginMap.m | 31 +-- src/ios/GoogleMaps/PluginUtil.h | 4 + src/ios/GoogleMaps/PluginUtil.m | 66 ++++++ www/ElevationService.js | 123 ++++++++++++ www/Map.js | 49 ++++- www/plugin-loader-for-android_ios.js | 1 + www/plugin-loader-for-browser.js | 1 + www/spherical.js | 35 +++- 23 files changed, 946 insertions(+), 239 deletions(-) create mode 100644 src/android/plugin/google/maps/AsyncGetJsonWithURL.java create mode 100644 src/android/plugin/google/maps/AsyncHttpGetInterface.java create mode 100644 src/android/plugin/google/maps/PluginElevationService.java create mode 100644 src/browser/PluginElevationService.js create mode 100644 src/ios/GoogleMaps/PluginElevationService.h create mode 100644 src/ios/GoogleMaps/PluginElevationService.m create mode 100644 www/ElevationService.js diff --git a/README.md b/README.md index 268f3fff3..fdda8161b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Cordova GoogleMaps plugin for Android, iOS and Browser v2.7.0 +# Cordova GoogleMaps plugin for Android, iOS and Browser v2.8.0 | Download | Build test (multiple_maps branch)| |----------|---------------------------| @@ -37,81 +37,11 @@ ## Quick install - - *Stable version(npm)* - ``` - $> cordova plugin add cordova-plugin-googlemaps - ``` - - - *Development version(beta version)* - ``` - $> cordova plugin add https://github.com/mapsplugin/cordova-plugin-googlemaps#multiple_maps - ``` - -## PhoneGap Build settings - - ```xml - - - - - - ``` - -## Install optional variables - - - ![](https://raw.githubusercontent.com/mapsplugin/cordova-plugin-googlemaps/master/images/icon-android.png) **PLAY_SERVICES_VERSION = (15.0.1)**
- The Google Play Services SDK version. - _You need to specify the same version number with all other plugins._ - Check out the latest version [here](https://developers.google.com/android/guides/releases). - - - ![](https://raw.githubusercontent.com/mapsplugin/cordova-plugin-googlemaps/master/images/icon-android.png) **ANDROID_SUPPORT_V4_VERSION = (27.1.1)**
- This plugin requires the Android support library v4. - _The minimum version is 24.1.0._ - Check out the latest version [here](https://developer.android.com/topic/libraries/support-library/revisions.html). - - - ![](https://raw.githubusercontent.com/mapsplugin/cordova-plugin-googlemaps/master/images/icon-ios.png) **LOCATION_WHEN_IN_USE_DESCRIPTION**
- This message is displayed when your application requests **LOCATION PERMISSION for only necessary times**. - - - ![](https://raw.githubusercontent.com/mapsplugin/cordova-plugin-googlemaps/master/images/icon-ios.png) **LOCATION_ALWAYS_USAGE_DESCRIPTION**
- This message is displayed when your application requests **LOCATION PERMISSION for always**. - ---------------------------------------------------------------------------------------------------------- - -## Browser platform - - We support browser platform now! - You can develop your application with browser, then run it! - At the end of development, you can upload the html files to your server, or run it on Android or iOS devices. - - ``` - $> cordova run browser - ``` - - If you use [ionic framework](https://ionicframework.com/), it supports `live-reload`. - - ``` - $> ionic cordova run browser -l - ``` - - If you want to use `live-reload`, but you don't want to use other framework or without framework, - [cordova-plugin-browsersync](https://www.npmjs.com/package/cordova-plugin-browsersync) is useful. - ``` - $> cordova plugin add cordova-plugin-browsersync - - $> cordova run (browser/android/ios) -- --live-reload + $> cordova plugin add cordova-plugin-googlemaps ``` - -### API key (Android and iOS platforms) - - As of v2.6.0, you need to specify your API keys in `config.xml` file instead of `--variable`. - This allows you to change your API keys for anytime without reinstallation. - - Please pay attention the variable names are changed. +Then set your Google Maps API keys into your `config.xml` (Android / iOS). ```xml @@ -120,11 +50,7 @@ ``` -### API key (Browser platform) - - In the browser platform, the maps plugin uses [Google Maps JavaScript API v3](https://developers.google.com/maps/documentation/javascript/) - - You need to set **two API keys for Google Maps JavaScript API v3**. +For browser platform, ```js // If your app runs this program on browser, @@ -136,7 +62,7 @@ // plugin.google.maps.environment.setEnv({ 'API_KEY_FOR_BROWSER_RELEASE': '(YOUR_API_KEY_IS_HERE)', - 'API_KEY_FOR_BROWSER_DEBUG': '' + 'API_KEY_FOR_BROWSER_DEBUG': '' // optional }); // Create a Google Maps native view under the map_canvas div. @@ -144,54 +70,40 @@ ``` -### Why **two API keys**? - - `JavaScript` code is `text code`. Even if you do obfuscation, it's still readable finally. - In order to protect your API key, you need to set `Key restriction` for these keys. - - ![](https://raw.githubusercontent.com/mapsplugin/cordova-plugin-googlemaps/master/images/api_key_restrictions.png) +## PhoneGap Build settings - If you don't set API key, the maps plugin still work with `development mode`. + ```xml + - ```js - plugin.google.maps.environment.setEnv({ - 'API_KEY_FOR_BROWSER_RELEASE': '(YOUR_API_KEY_IS_HERE)', - 'API_KEY_FOR_BROWSER_DEBUG': '' // If key is empty or unset, - // the maps plugin runs under the development mode. - }); + + + ``` - - -### Which browser supported? - - Modern browsers should work without any problem. - - ![](https://raw.githubusercontent.com/mapsplugin/cordova-plugin-googlemaps/master/images/modern_browsers.png) - Internet Explorer 11 might work. We don't confirm all features, but basic features work. +## Install optional variables (config.xml) -### Behavior differences - - `Google Maps JavaScript API v3` is completely different ecosystem with `Google Maps Android API` and `Google Maps SDK for iOS`. - - `Google Maps JavaScript API v3` : - - **can't** draw 3D building, - - **does't work** if offline, - - **can't** map rotation, - - etc... + - ![](https://raw.githubusercontent.com/mapsplugin/cordova-plugin-googlemaps/master/images/icon-android.png) **PLAY_SERVICES_VERSION = (17.0.0)**
+ The Google Play Services SDK version. + _You need to specify the same version number with all other plugins._ + Check out the latest version [here](https://developers.google.com/android/guides/releases). - In the browser platform, the maps plugin works almost the same behaviors as native platforms(Android, and iOS), - but not exactly the same behaviors. - So don't expect too much. + - ![](https://raw.githubusercontent.com/mapsplugin/cordova-plugin-googlemaps/master/images/icon-android.png) **ANDROID_SUPPORT_V4_VERSION = (27.1.1)**
+ This plugin requires the Android support library v4. + _The minimum version is 24.1.0._ + Check out the latest version [here](https://developer.android.com/topic/libraries/support-library/revisions.html). -### Touch mechanism difference + - ![](https://raw.githubusercontent.com/mapsplugin/cordova-plugin-googlemaps/master/images/icon-android.png) **GOOGLE_MAPS_ANDROID_SDK = ()**
+ The Google Maps SDK for Android version. + `i.e. GOOGLE_MAPS_ANDROID_SDK=maps-sdk-3.0.0-beta`. - As you may know, [this plugin displays native Google Maps view under the browser in Android and iOS](#how-does-this-plugin-work-android-ios). - However this plugin displays as `normal HTML element` in browser platform. + - ![](https://raw.githubusercontent.com/mapsplugin/cordova-plugin-googlemaps/master/images/icon-ios.png) **LOCATION_WHEN_IN_USE_DESCRIPTION**
+ This message is displayed when your application requests **LOCATION PERMISSION for only necessary times**. - Because of this, touch behavior is different. - The maps plugin does not hook the touch position, do not set `background: transparent`, ... etc. - But if you use this plugin as normal behavior, you don't need to consider about this. + - ![](https://raw.githubusercontent.com/mapsplugin/cordova-plugin-googlemaps/master/images/icon-ios.png) **LOCATION_ALWAYS_USAGE_DESCRIPTION**
+ This message is displayed when your application requests **LOCATION PERMISSION for always**. --------------------------------------------------------------------------------------------------------- @@ -204,43 +116,11 @@ --------------------------------------------------------------------------------------------------------- ## Release Notes - - **v2.7.0** - - Re-adoption: cordova-plugin-googlemaps-sdk dependency - - Fix: (iOS) Can't load image files from local host on ionic 4 / 5 - - Update: (Android) prevent null pointer error in AsyncLoadImage.java - - Fix: Css animation interference when call setDiv and there is a push/pop page - - Fix: (Android/iOS/Browser) KML parser crash - - Fix: flickering and wrong rendering of some DOM elements - - Add: `map.stopAnimation()` - - Fix: can't remove map while map.animateCamera() is running - - Update: (Android) Increase cache memory size - - Update: (Android/iOS) Danish localization - - Fix: (Android) Prevent resize event after `map.setDiv(null)` - - Fix: (Android/iOS) Can not interactive with the map inside
- - Fix: jslint errors - - Fix: marker.setIcon crashes - - Update: Set default value range to heading and tilt - - Fix: (Android/iOS) touch detection is wrong after clicking on back button very soon. - - Fix: An error occurs when you click a marker of marker cluster #2660 - - Remove promise-7.0.4-min.js.map - - Fix: (iOS) bug fix: App crashes if "bearing" property is "" - - Fix: HTMLColor2RGBA() converts to incorrect value - - Fix: (Android) Can't load marker image from the Ineternet - - - **v2.6.2** - - Fix: (Android) build error - - - **v2.6.1** - - Fix: (Android) Conflicting with `OneSignal-Cordova-SDK` - - Fix: (iOS) App crashes when marker url isn't valid. - - - **v2.6.0** - - Fix: Can not install to Cordova 9.0 project - - Fix: (Android) `ConcurrentModificationException` error at `onStop` - - Fix: (Android) Polygon becomes visible when you run `setPoints()` to invisible polygon - - Fix: (Android/iOS) TileOverlay does not work when your app runs on `file:` protocol with ionic. - - Update: (iOS) Specify the Google Maps SDK version as `=> 3.1.0`. Please use `cordova-ios@5.0.0` or above, otherwise modify `platform/ios/Podfile`. - - Add: (Android/iOS) API Key mechanism + + - **v2.8.0** + - Add: (Android/iOS/Browser) `mapOptions.preferences.gestureBounds` + - Add: (Android/iOS/Browser) ElevationService + --------------------------------------------------------------------------------------------------------- diff --git a/package.json b/package.json index 6c03090e7..9f791ea7b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-googlemaps", - "version": "2.7.0-20200330-2338", + "version": "2.8.0-20200429-1039", "description": "Google Maps native SDK for Android and iOS, and Google Maps JavaScript API v3 for browser.", "cordova": { "id": "cordova-plugin-googlemaps", diff --git a/plugin.xml b/plugin.xml index 4d0024f79..df05705b9 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - + cordova-plugin-googlemaps @@ -62,6 +62,9 @@ + + + @@ -182,6 +185,9 @@ + + + @@ -196,6 +202,8 @@ + + @@ -206,6 +214,7 @@ + @@ -316,6 +325,9 @@ + + + @@ -356,6 +368,8 @@ + + @@ -516,6 +530,9 @@ + + + diff --git a/src/android/plugin/google/maps/AsyncGetJsonWithURL.java b/src/android/plugin/google/maps/AsyncGetJsonWithURL.java new file mode 100644 index 000000000..efcda3418 --- /dev/null +++ b/src/android/plugin/google/maps/AsyncGetJsonWithURL.java @@ -0,0 +1,113 @@ +package plugin.google.maps; + +import android.net.Uri; +import android.os.AsyncTask; +import android.util.Log; + +import org.json.JSONObject; + +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.HashMap; + +public class AsyncGetJsonWithURL extends AsyncTask, Void, JSONObject> { + private AsyncHttpGetInterface callback; + + private final String TAG = "AsyncHttpGet"; + private String BASE_URI = ""; + + public AsyncGetJsonWithURL(String baseUri, AsyncHttpGetInterface callback) { + this.callback = callback; + this.BASE_URI = baseUri; + } + + protected JSONObject doInBackground(HashMap... params) { + + //-------------------------------- + // Load image from the Internet + //-------------------------------- + try { + Uri.Builder builder = Uri.parse(BASE_URI).buildUpon(); + for (String key: params[0].keySet()) { + builder.appendQueryParameter(key, params[0].get(key)); + } + + + String urlStr = builder.build().toString(); +// Log.d("Elevation", "url=" + urlStr); + URL url = new URL(urlStr); + + boolean redirect = true; + HttpURLConnection http = null; + String cookies = null; + int redirectCnt = 0; + while(redirect && redirectCnt < 10) { + redirect = false; + http = (HttpURLConnection)url.openConnection(); + http.setRequestMethod("GET"); + if (cookies != null) { + http.setRequestProperty("Cookie", cookies); + } + http.addRequestProperty("Accept-Language", "en-US,en;q=0.8"); + http.addRequestProperty("User-Agent", "Mozilla"); + http.setInstanceFollowRedirects(true); + HttpURLConnection.setFollowRedirects(true); + + // normally, 3xx is redirect + try { + int status = http.getResponseCode(); + if (status != HttpURLConnection.HTTP_OK) { + if (status == HttpURLConnection.HTTP_MOVED_TEMP + || status == HttpURLConnection.HTTP_MOVED_PERM + || status == HttpURLConnection.HTTP_SEE_OTHER) + redirect = true; + } + if (redirect) { + // get redirect url from "location" header field + url = new URL(http.getHeaderField("Location")); + + // get the cookie if need, for login + cookies = http.getHeaderField("Set-Cookie"); + + // Disconnect the current connection + http.disconnect(); + redirectCnt++; + continue; + } + if (status == HttpURLConnection.HTTP_OK) { + break; + } else { + return null; + } + } catch (Exception e) { + Log.e(TAG, "can not connect to " + url.toString(), e); + } + } + + InputStream inputStream = http.getInputStream(); + + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + int nRead; + byte[] data = new byte[16384]; + while ((nRead = inputStream.read(data, 0, data.length)) != -1) { + buffer.write(data, 0, nRead); + } + buffer.flush(); + inputStream.close(); + return new JSONObject(buffer.toString()); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + + } + + + @Override + protected void onPostExecute(JSONObject result) { + this.callback.onPostExecute(result); + } + +} diff --git a/src/android/plugin/google/maps/AsyncHttpGetInterface.java b/src/android/plugin/google/maps/AsyncHttpGetInterface.java new file mode 100644 index 000000000..b0ca1be8a --- /dev/null +++ b/src/android/plugin/google/maps/AsyncHttpGetInterface.java @@ -0,0 +1,7 @@ +package plugin.google.maps; + +import org.json.JSONObject; + +public interface AsyncHttpGetInterface { + public void onPostExecute(JSONObject result) ; +} diff --git a/src/android/plugin/google/maps/PluginElevationService.java b/src/android/plugin/google/maps/PluginElevationService.java new file mode 100644 index 000000000..47c1ac3e4 --- /dev/null +++ b/src/android/plugin/google/maps/PluginElevationService.java @@ -0,0 +1,112 @@ +package plugin.google.maps; + +import android.app.Activity; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.util.Log; + +import com.google.android.gms.maps.model.LatLng; + +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaInterface; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.CordovaWebView; +import org.apache.cordova.PluginResult; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.HashMap; +import java.util.List; + +public class PluginElevationService extends CordovaPlugin { + private Activity activity; + private final String TAG = "PluginElevationService"; + private String API_KEY = ""; + + public void initialize(final CordovaInterface cordova, final CordovaWebView webView) { + super.initialize(cordova, webView); + activity = cordova.getActivity(); + + try { + ApplicationInfo ai = activity.getPackageManager().getApplicationInfo(activity.getPackageName(), PackageManager.GET_META_DATA); + this.API_KEY = ai.metaData.getString("com.google.android.geo.API_KEY"); + } catch (Exception e) { + // ignore + } + } + + + @Override + public boolean execute(final String action, final JSONArray args, final CallbackContext callbackContext) throws JSONException { + + cordova.getThreadPool().submit(new Runnable() { + @Override + public void run() { + try { + if ("getElevationAlongPath".equals(action)) { + PluginElevationService.this.getElevationAlongPath(args, callbackContext); + } else if ("getElevationForLocations".equals(action)) { + PluginElevationService.this.getElevationForLocations(args, callbackContext); + } + + } catch (JSONException e) { + e.printStackTrace(); + } + } + }); + return true; + + } + + + + @SuppressWarnings("unused") + public void getElevationAlongPath(final JSONArray args, final CallbackContext callbackContext) throws JSONException { + + HashMap params = new HashMap(); + + JSONObject opts = args.getJSONObject(0); + + JSONArray points = opts.getJSONArray("path"); + List path = PluginUtil.JSONArray2LatLngList(points); + params.put("path", "enc:" + PluginUtil.encodePath(path)); + params.put("samples", opts.getString("samples")); + params.put("key", this.API_KEY); + + AsyncGetJsonWithURL httpGet = new AsyncGetJsonWithURL("https://maps.googleapis.com/maps/api/elevation/json", new AsyncHttpGetInterface() { + @Override + public void onPostExecute(JSONObject result) { + PluginResult pluginResult = null; + + try { + if (result == null) { + pluginResult = new PluginResult(PluginResult.Status.ERROR, "UNKNOWN_ERROR"); + } else { + if ("OK".equals(result.getString("status"))) { + pluginResult = new PluginResult(PluginResult.Status.OK, result); + } else { + pluginResult = new PluginResult(PluginResult.Status.ERROR, result.getString("status")); + } + } + } catch (Exception e){ + pluginResult = new PluginResult(PluginResult.Status.ERROR, "UNKNOWN_ERROR"); + } finally { + if (pluginResult == null) { + pluginResult = new PluginResult(PluginResult.Status.ERROR, "UNKNOWN_ERROR"); + } + callbackContext.sendPluginResult(pluginResult); + } + } + }); + + httpGet.execute(params); + } + + + @SuppressWarnings("unused") + public void getElevationForLocations(final JSONArray args, final CallbackContext callbackContext) throws JSONException { + + } + +} diff --git a/src/android/plugin/google/maps/PluginLocationService.java b/src/android/plugin/google/maps/PluginLocationService.java index b385cc212..16887af67 100644 --- a/src/android/plugin/google/maps/PluginLocationService.java +++ b/src/android/plugin/google/maps/PluginLocationService.java @@ -9,10 +9,11 @@ import android.os.Build; import android.os.Bundle; import android.os.Looper; -import android.support.annotation.NonNull; -import android.support.v4.content.PermissionChecker; import android.util.Log; +import androidx.annotation.NonNull; +import androidx.core.content.PermissionChecker; + import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.location.LocationCallback; diff --git a/src/android/plugin/google/maps/PluginMap.java b/src/android/plugin/google/maps/PluginMap.java index a3d379f0e..4ee105da5 100644 --- a/src/android/plugin/google/maps/PluginMap.java +++ b/src/android/plugin/google/maps/PluginMap.java @@ -16,8 +16,8 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; -import android.support.annotation.NonNull; -import android.support.v4.content.PermissionChecker; +import androidx.annotation.NonNull; +import androidx.core.content.PermissionChecker; import android.util.Base64; import android.util.Log; import android.view.Gravity; @@ -388,6 +388,19 @@ public void onClick(View v) { } + if (preferences.has("gestureBounds")) { + JSONObject gestureBounds = preferences.getJSONObject("gestureBounds"); + LatLng sw = new LatLng(gestureBounds.getDouble("south"), gestureBounds.getDouble("west")); + LatLng ne = new LatLng(gestureBounds.getDouble("north"), gestureBounds.getDouble("east")); + LatLngBounds bounds = new LatLngBounds(sw, ne); + + map.setLatLngBoundsForCameraTarget(bounds); + + map.setMinZoomPreference((float)gestureBounds.getDouble("minZoom")); + map.setMaxZoomPreference((float)gestureBounds.getDouble("maxZoom")); + + } + if (preferences.has("zoom")) { JSONObject zoom = preferences.getJSONObject("zoom"); if (zoom.has("minZoom")) { @@ -399,16 +412,6 @@ public void onClick(View v) { } - if (preferences.has("gestureBounds")) { - Object target = preferences.get("gestureBounds"); - @SuppressWarnings("rawtypes") - Class targetClass = target.getClass(); - if ("org.json.JSONArray".equals(targetClass.getName())) { - JSONArray points = preferences.getJSONArray("gestureBounds"); - LatLngBounds bounds = PluginUtil.JSONArray2LatLngBounds(points); - map.setLatLngBoundsForCameraTarget(bounds); - } - } } // Set event listener diff --git a/src/android/plugin/google/maps/PluginUtil.java b/src/android/plugin/google/maps/PluginUtil.java index 1f098ffb6..634362820 100644 --- a/src/android/plugin/google/maps/PluginUtil.java +++ b/src/android/plugin/google/maps/PluginUtil.java @@ -432,4 +432,54 @@ public static String getPgmStrings(Activity activity, String key) { Resources res = activity.getResources(); return res.getString(resId); } + + public static String encodePath(List path) { + double plat = 0; + double plng = 0; + StringBuilder builder = new StringBuilder(); + + for (LatLng location: path) { + builder.append(_encodePoint(plat, plng, location.latitude, location.longitude)); + + plat = location.latitude; + plng = location.longitude; + } + + return builder.toString(); + } + + private static String _encodePoint(double plat, double plng, double lat, double lng) { + long late5 = Math.round(lat * 1e5); + long plate5 = Math.round(plat * 1e5); + + long lnge5 = Math.round(lng * 1e5); + long plnge5 = Math.round(plng * 1e5); + + long dlng = lnge5 - plnge5; + long dlat = late5 - plate5; + + return _encodeSignedNumber(dlat) + _encodeSignedNumber(dlng); + } + private static String _encodeSignedNumber(long num) { + long sgn_num = num << 1; + + if (num < 0) { + sgn_num = ~(sgn_num); + } + + return (_encodeNumber(sgn_num)); + } + + + private static String _encodeNumber(long num) { + StringBuilder builder = new StringBuilder(); + + while (num >= 0x20) { + builder.append(Character.toChars((int) (0x20 | (num & 0x1f)) + 63)); + num >>= 5; + } + + builder.append(Character.toChars((int) num + 63)); + return builder.toString(); + } } diff --git a/src/browser/PluginElevationService.js b/src/browser/PluginElevationService.js new file mode 100644 index 000000000..d22e65253 --- /dev/null +++ b/src/browser/PluginElevationService.js @@ -0,0 +1,125 @@ + + +var BaseArrayClass = require('cordova-plugin-googlemaps.BaseArrayClass'); + +var service = null; +var lastRequestTime = 0; +var QUEUE = new BaseArrayClass(); +QUEUE.on('insert_at', function() { + if (QUEUE.getLength() === 1) { + this.trigger('next'); + } +}); +QUEUE.one('insert_at', function() { + service = new google.maps.ElevationService(); + this.trigger('next'); +}); +QUEUE.on('next', function() { + var self = QUEUE; + if (!service || self._executing || QUEUE.getLength() === 0) { + return; + } + if (Date.now() - lastRequestTime < 300) { + setTimeout(function() { + self.trigger('next'); + }, 300 + Math.floor(Math.random() * 200)); + return; + } + lastRequestTime = Date.now(); + self._executing = true; + + var cmd = QUEUE.removeAt(0, true); + var methods = { + 'getElevationAlongPath': service.getElevationAlongPath, + 'getElevationForLocations': service.getElevationForLocations + }; + + var execMethod = methods[cmd.method]; + execMethod.call(service, cmd.elevationRequest, function(result, status) { + switch(status) { + case google.maps.ElevationStatus.INVALID_ERROR: + self._executing = false; + cmd.onError('[elevation] The request was invalid'); + return; + case google.maps.ElevationStatus.OVER_QUERY_LIMIT: + QUEUE.insertAt(0, cmd); + console.warn('[elevation] Due to the OVER_QUERY_LIMIT error, wait 3 sec, then try again.'); + setTimeout(function() { + self._executing = false; + self.trigger('next'); + }, 3000 + Math.floor(Math.random() * 200)); + return; + case google.maps.ElevationStatus.REQUEST_DENIED: + self._executing = false; + cmd.onError('[elevation] Google denited your elevation request.'); + return; + case google.maps.ElevationStatus.UNKNOWN_ERROR: + self._executing = false; + cmd.onError('[elevation] There was an unknown error. Please try again.'); + return; + } + + var pluginResults = []; + for (var i = 0; i < result.length; i++) { + pluginResults.push({ + 'elevation': result[i].elevation, + 'location': result[i].location.toJSON(), + 'resolution': result[i].resolution + }); + } + + self._executing = false; + cmd.onSuccess({ + 'idx': cmd.pluginRequest.idx, + 'results': pluginResults + }); + + // Insert delay to prevent the OVER_QUERY_LIMIT error. + var delay = 300 + Math.floor(Math.random() * 200); + setTimeout(function() { + self._executing = false; + self.trigger('next'); + }, delay); + }); + +}); + +module.exports = { + 'getElevationAlongPath': function(onSuccess, onError, args) { + var request = args[0]; + var params = {}; + params.samples = request.samples; + params.path = []; + for (var i = 0; i < request.path.length; i++) { + params.path.push(new google.maps.LatLng(request.path[i].lat, request.path[i].lng)); + } + + QUEUE.push({ + 'method': 'getElevationAlongPath', + 'elevationRequest': params, + 'pluginRequest': request, + 'onSuccess': onSuccess, + 'onError': onError + }); + }, + + 'getElevationForLocations': function(onSuccess, onError, args) { + var request = args[0]; + var params = {}; + params.locations = []; + for (var i = 0; i < request.locations.length; i++) { + params.locations.push(new google.maps.LatLng(request.locations[i].lat, request.locations[i].lng)); + } + + QUEUE.push({ + 'method': 'getElevationForLocations', + 'elevationRequest': params, + 'pluginRequest': request, + 'onSuccess': onSuccess, + 'onError': onError + }); + } +}; + + +require('cordova/exec/proxy').add('PluginElevationService', module.exports); diff --git a/src/browser/PluginGeocoder.js b/src/browser/PluginGeocoder.js index 23b768c91..b0bb5493b 100644 --- a/src/browser/PluginGeocoder.js +++ b/src/browser/PluginGeocoder.js @@ -1,5 +1,4 @@ - var BaseArrayClass = require('cordova-plugin-googlemaps.BaseArrayClass'); var geocoder = null; @@ -32,9 +31,11 @@ QUEUE.on('next', function() { geocoder.geocode(cmd.geocoderRequest, function(results, status) { switch(status) { case google.maps.GeocoderStatus.ERROR: + self._executing = false; cmd.onError('[geocoding] Cannot connect to Google servers'); return; case google.maps.GeocoderStatus.INVALID_REQUEST: + self._executing = false; cmd.onError('[geocoding] Invalid request for geocoder'); return; case google.maps.GeocoderStatus.OVER_QUERY_LIMIT: @@ -46,9 +47,11 @@ QUEUE.on('next', function() { }, 3000 + Math.floor(Math.random() * 200)); return; case google.maps.GeocoderStatus.REQUEST_DENIED: + self._executing = false; cmd.onError('[geocoding] Google denited your geocoding request.'); return; case google.maps.GeocoderStatus.UNKNOWN_ERROR: + self._executing = false; cmd.onError('[geocoding] There was an unknown error. Please try again.'); return; } diff --git a/src/browser/PluginMap.js b/src/browser/PluginMap.js index 44e92bd7e..37a4a9542 100644 --- a/src/browser/PluginMap.js +++ b/src/browser/PluginMap.js @@ -42,20 +42,38 @@ function displayGrayMap(container) { function PluginMap(mapId, options) { var self = this; BaseClass.apply(this); - var mapDiv = document.querySelector('[__pluginMapId=\'' + mapId + '\']'); + var actualMapDiv = document.querySelector('[__pluginMapId=\'' + mapId + '\']'); + var shadowRoot = actualMapDiv.attachShadow({mode: 'open'}); + + var style = document.createElement('style'); + style.setAttribute('type', 'text/css'); + style.innerHTML = ':host {color: black;}'; + shadowRoot.appendChild(style); + + var mapDiv = document.createElement('div'); + mapDiv.style.position = 'relative'; + mapDiv.style.left = 0; + mapDiv.style.top = 0; + mapDiv.style.right = 0; + mapDiv.style.bottom = 0; + mapDiv.style.width = "100%"; + mapDiv.style.height = "100%"; + shadowRoot.appendChild(mapDiv); + mapDiv.style.backgroundColor = 'rgb(229, 227, 223)'; + var container = document.createElement('div'); container.style.userSelect='none'; container.style['-webkit-user-select']='none'; container.style['-moz-user-select']='none'; container.style['-ms-user-select']='none'; - mapDiv.style.position = 'relative'; container.style.position = 'absolute'; container.style.top = 0; container.style.bottom = 0; container.style.right = 0; container.style.left = 0; + mapDiv.insertBefore(container, mapDiv.firstElementChild); self.set('isGoogleReady', false); @@ -114,6 +132,19 @@ function PluginMap(mapId, options) { } } if (options.preferences) { + + if (options.preferences && options.preferences.gestureBounds) { + mapInitOptions.restriction = { + latLngBounds: { + south: options.preferences.gestureBounds.south, + west: options.preferences.gestureBounds.west, + north: options.preferences.gestureBounds.north, + east: options.preferences.gestureBounds.east + }, + strictBounds: false + }; + } + if (options.preferences.zoom) { mapInitOptions.minZoom = options.preferences.zoom.minZoom; if (options.preferences.zoom.maxZoom) { @@ -127,60 +158,12 @@ function PluginMap(mapId, options) { map.mapTypes = mapTypeReg; self.set('map', map); - var boundsLimit = null; - if (options.preferences && options.preferences.gestureBounds && - options.preferences.gestureBounds.length > 0) { - boundsLimit = new google.maps.LatLngBounds(); - options.preferences.gestureBounds.forEach(function(pos) { - boundsLimit.extend(pos); - }); - } - map.set('boundsLimit', boundsLimit); var timeoutError = setTimeout(function() { self.trigger('load_error'); displayGrayMap(mapDiv); }, 3000); - map.addListener('bounds_changed', function() { - var boundsLimit = map.get('boundsLimit'); - if (!boundsLimit) { - return; - } - var visibleBounds = map.getBounds(); - if (boundsLimit.intersects(visibleBounds) || - visibleBounds.contains(boundsLimit.getNorthEast()) && visibleBounds.contains(boundsLimit.getSouthWest()) || - boundsLimit.contains(visibleBounds.getNorthEast()) && boundsLimit.contains(visibleBounds.getSouthWest())) { - return; - } - var center = map.getCenter(); - var dummyLat = center.lat(), - dummyLng = center.lng(); - var ne = boundsLimit.getNorthEast(), - sw = boundsLimit.getSouthWest(); - if (dummyLat < sw.lat() ) { - dummyLat = sw.lat(); - } else if (dummyLat > ne.lat()) { - dummyLat = ne.lat(); - } - if (dummyLng < 0) { - // the Western Hemisphere - if (dummyLng > ne.lng()) { - dummyLng = ne.lng(); - } else if (dummyLng < sw.lng()) { - dummyLng = sw.lng(); - } - } else { - // the Eastern Hemisphere - if (dummyLng > ne.lng()) { - dummyLng = ne.lng(); - } else if (dummyLng < sw.lng()) { - dummyLng = sw.lng(); - } - } - var dummyLatLng = new google.maps.LatLng(dummyLat, dummyLng); - map.panTo(dummyLatLng); - }); google.maps.event.addListenerOnce(map, 'projection_changed', function() { clearTimeout(timeoutError); diff --git a/src/ios/GoogleMaps/CordovaGoogleMaps.m b/src/ios/GoogleMaps/CordovaGoogleMaps.m index e5e29de81..ca1fa759d 100644 --- a/src/ios/GoogleMaps/CordovaGoogleMaps.m +++ b/src/ios/GoogleMaps/CordovaGoogleMaps.m @@ -58,6 +58,10 @@ - (void)pluginInitialize [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; [GMSServices provideAPIKey:APIKey]; + + NSUserDefaults *myDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"cordova.plugin.googlemaps"]; + [myDefaults setObject:APIKey forKey:@"GOOGLE_MAPS_API_KEY"]; + [myDefaults synchronize]; }]; //------------------------------- diff --git a/src/ios/GoogleMaps/PluginElevationService.h b/src/ios/GoogleMaps/PluginElevationService.h new file mode 100644 index 000000000..d71af83ac --- /dev/null +++ b/src/ios/GoogleMaps/PluginElevationService.h @@ -0,0 +1,18 @@ +// +// PluginElevationService.h +// cordova-googlemaps-plugin v2 +// +// Created by Masashi Katsumata. +// +// + +#import +#import +#import "PluginUtil.h" + +@interface PluginElevationService : CDVPlugin + +@property (nonatomic, strong) NSOperationQueue *executeQueue; +- (void)getElevationAlongPath:(CDVInvokedUrlCommand*)command; +- (void)getElevationForLocations:(CDVInvokedUrlCommand*)command; +@end diff --git a/src/ios/GoogleMaps/PluginElevationService.m b/src/ios/GoogleMaps/PluginElevationService.m new file mode 100644 index 000000000..c545cf2dd --- /dev/null +++ b/src/ios/GoogleMaps/PluginElevationService.m @@ -0,0 +1,115 @@ +// +// PluginElevationService.m +// cordova-googlemaps-plugin v2 +// +// Created by Masashi Katsumata. +// +// + +#import "PluginElevationService.h" + +@implementation PluginElevationService + +- (void)pluginUnload +{ + if (self.executeQueue != nil){ + self.executeQueue.suspended = YES; + [self.executeQueue cancelAllOperations]; + self.executeQueue.suspended = NO; + self.executeQueue = nil; + } +} + +- (void)pluginInitialize +{ + self.executeQueue = [NSOperationQueue new]; + self.executeQueue.maxConcurrentOperationCount = 3; + +} + +- (void)getElevationAlongPath:(CDVInvokedUrlCommand*)command { + NSDictionary *json = [command.arguments objectAtIndex:0]; + + NSArray *path = [json objectForKey:@"path"]; + int i = 0; + NSDictionary *latLng; + GMSMutablePath *mutablePath = [GMSMutablePath path]; + for (i = 0; i < path.count; i++) { + latLng = [path objectAtIndex:i]; + [mutablePath + addCoordinate: + CLLocationCoordinate2DMake([[latLng objectForKey:@"lat"] doubleValue], [[latLng objectForKey:@"lng"] doubleValue])]; + } + + NSString *encodedPoint = [mutablePath encodedPath]; + encodedPoint = [encodedPoint stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLHostAllowedCharacterSet]; + encodedPoint = [NSString stringWithFormat:@"enc:%@", encodedPoint]; + + NSMutableDictionary *params = [NSMutableDictionary dictionary]; + [params setObject:encodedPoint forKey:@"path"]; + [params setObject:[json objectForKey:@"samples"] forKey:@"samples"]; + + [self httpGetWithDictionary:params command:command]; +} + +-(void)getElevationForLocations:(CDVInvokedUrlCommand *)command +{ + + NSDictionary *json = [command.arguments objectAtIndex:0]; + + NSArray *path = [json objectForKey:@"locations"]; + int i = 0; + NSDictionary *latLng; + GMSMutablePath *mutablePath = [GMSMutablePath path]; + for (i = 0; i < path.count; i++) { + latLng = [path objectAtIndex:i]; + [mutablePath + addCoordinate: + CLLocationCoordinate2DMake([[latLng objectForKey:@"lat"] doubleValue], [[latLng objectForKey:@"lng"] doubleValue])]; + } + + NSString *encodedPoint = [mutablePath encodedPath]; + encodedPoint = [encodedPoint stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLHostAllowedCharacterSet]; + encodedPoint = [NSString stringWithFormat:@"enc:%@", encodedPoint]; + + NSMutableDictionary *params = [NSMutableDictionary dictionary]; + [params setObject:encodedPoint forKey:@"locations"]; + + [self httpGetWithDictionary:params command:command]; +} + +- (void)httpGetWithDictionary:(NSDictionary *)params command:(CDVInvokedUrlCommand *)command +{ + + NSString *urlStr = @"https://maps.googleapis.com/maps/api/elevation/json?"; + + NSEnumerator *keys = [params keyEnumerator]; + NSString *pName; + while(pName = [keys nextObject]) { + urlStr = [urlStr stringByAppendingFormat:@"%@=%@&", pName, [params objectForKey:pName]]; + } + + NSUserDefaults *myDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"cordova.plugin.googlemaps"]; + NSString *DEFAULT_APIKey = [myDefaults objectForKey:@"GOOGLE_MAPS_API_KEY"]; + urlStr = [urlStr stringByAppendingFormat:@"key=%@", DEFAULT_APIKey]; + + NSURL *url = [NSURL URLWithString: urlStr]; + + [self.executeQueue addOperationWithBlock:^{ + [PluginUtil getJsonWithURL:url completionBlock:^(BOOL succeeded, NSDictionary *response, NSString *error) { + + CDVPluginResult* pluginResult; + if (!succeeded) { + NSLog(@"[elevation] %@", error); + pluginResult = [CDVPluginResult resultWithStatus: CDVCommandStatus_ERROR messageAsString:error]; + } else { + NSMutableDictionary *results = [NSMutableDictionary dictionary]; + [results setObject: [response objectForKey:@"results"] forKey:@"results"]; + pluginResult = [CDVPluginResult resultWithStatus: CDVCommandStatus_OK messageAsDictionary:results]; + } + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + }]; + }]; +} + +@end diff --git a/src/ios/GoogleMaps/PluginMap.m b/src/ios/GoogleMaps/PluginMap.m index 31605c94c..4bb2b3829 100644 --- a/src/ios/GoogleMaps/PluginMap.m +++ b/src/ios/GoogleMaps/PluginMap.m @@ -858,19 +858,8 @@ - (void)_setOptions:(NSDictionary *)initOptions requestMethod:(NSString *)reques // gestureBounds if ([preferences valueForKey:@"gestureBounds"] != nil) { - NSDictionary *latLng = nil; - double latitude, longitude; - int i = 0; - NSArray *latLngList = [preferences objectForKey:@"gestureBounds"]; - GMSMutablePath *path = [GMSMutablePath path]; - for (i = 0; i < [latLngList count]; i++) { - latLng = [latLngList objectAtIndex:i]; - latitude = [[latLng valueForKey:@"lat"] doubleValue]; - longitude = [[latLng valueForKey:@"lng"] doubleValue]; - [path addLatitude:latitude longitude:longitude]; - } - - [self.mapCtrl.map setCameraTargetBounds:[[GMSCoordinateBounds alloc] initWithPath:path]]; + NSDictionary *restriction = [preferences objectForKey:@"gestureBounds"]; + [self _setCameraRestriction:restriction]; } } @@ -929,6 +918,22 @@ - (void)_setOptions:(NSDictionary *)initOptions requestMethod:(NSString *)reques }]; }; +- (void)_setCameraRestriction:(NSDictionary *)params { + + GMSMutablePath *path = [GMSMutablePath path]; + [path + addCoordinate: CLLocationCoordinate2DMake([[params objectForKey:@"south"] doubleValue], [[params objectForKey:@"west"] doubleValue])]; + [path + addCoordinate: CLLocationCoordinate2DMake([[params objectForKey:@"north"] doubleValue], [[params objectForKey:@"east"] doubleValue])]; + + GMSCoordinateBounds *bounds = [[GMSCoordinateBounds alloc] initWithPath:path]; + self.mapCtrl.map.cameraTargetBounds = bounds; + + double minZoom = [[params objectForKey:@"minZoom"] doubleValue]; + double maxZoom = [[params objectForKey:@"maxZoom"] doubleValue]; + [self.mapCtrl.map setMinZoom:minZoom maxZoom:maxZoom]; +} + - (void)setOptions:(CDVInvokedUrlCommand *)command { [self.mapCtrl.executeQueue addOperationWithBlock:^{ diff --git a/src/ios/GoogleMaps/PluginUtil.h b/src/ios/GoogleMaps/PluginUtil.h index d7454edfa..a30c19b0c 100644 --- a/src/ios/GoogleMaps/PluginUtil.h +++ b/src/ios/GoogleMaps/PluginUtil.h @@ -72,6 +72,10 @@ typedef void (^TIFAnimationGroupCompletionBlock)(); + (GMSMutablePath *)getMutablePathFromCircle:(CLLocationCoordinate2D)center radius:(double)radius; + (NSString *)getAbsolutePathFromCDVFilePath:(UIView*)theWebView cdvFilePath:(NSString *)cdvFilePath; + (NSString *)PGM_LOCALIZATION:(NSString *)key; ++ (void)getJsonWithURL:(NSURL *)url completionBlock:(void (^)(BOOL succeeded, NSDictionary *response, NSString *error))completionBlock; ++ (double)getZoomFromBounds:(GMSCoordinateBounds *)bounds mapWidth:(double)mapWidth mapHeight:(double)mapHeight; ++ (double)_zoom:(double)mapPx worldPx:(double)worldPx fraction:(double)fraction; ++ (double)_latRad:(double)lat; @end diff --git a/src/ios/GoogleMaps/PluginUtil.m b/src/ios/GoogleMaps/PluginUtil.m index b2b283d92..47e460e13 100644 --- a/src/ios/GoogleMaps/PluginUtil.m +++ b/src/ios/GoogleMaps/PluginUtil.m @@ -466,4 +466,70 @@ + (NSString *)PGM_LOCALIZATION:(NSString *)key { return result; } + ++ (void)getJsonWithURL:(NSURL *)url completionBlock:(void (^)(BOOL succeeded, NSDictionary *response, NSString *error))completionBlock +{ + + NSURLRequest *req = [NSURLRequest requestWithURL:url + cachePolicy: NSURLRequestReloadIgnoringCacheData + timeoutInterval:5]; + //------------------------------------------------------------- + // Use NSURLSessionDataTask instead of [NSURLConnection sendAsynchronousRequest] + // https://stackoverflow.com/a/20871647 + //------------------------------------------------------------- + NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; + NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration]; + NSURLSessionDataTask *getTask = [session dataTaskWithRequest:req + completionHandler:^(NSData *data, NSURLResponse *res, NSError *error) { + [session finishTasksAndInvalidate]; + + + NSDictionary *json; + if (!error) { + json = [NSJSONSerialization + JSONObjectWithData:data + options:kNilOptions error:&error]; + } + + if (json) { + if ([@"OK" isEqualToString:[json objectForKey:@"status"]]) { + completionBlock(YES, json, nil); + } else { + completionBlock(NO, nil, [json objectForKey:@"status"]); + } + } else { + NSLog(@"[elevation] error = %@", error.description); + completionBlock(NO, nil, @"UNKNOWN_ERROR"); + } + }]; + [getTask resume]; + + +} + + ++ (double)_latRad:(double)lat { + double sin = sinh(lat * M_PI / 180); + double radX2 = log((1 + sin) / (1 - sin)) / 2; + return MAX(MIN(radX2, M_PI), -M_PI) / 2; +} + ++ (double)_zoom:(double)mapPx worldPx:(double)worldPx fraction:(double)fraction { + return floor(log(mapPx / worldPx / fraction) / M_LN2); +} + ++ (double)getZoomFromBounds:(GMSCoordinateBounds *)bounds mapWidth:(double)mapWidth mapHeight:(double)mapHeight { + CLLocationCoordinate2D ne = bounds.northEast; + CLLocationCoordinate2D sw = bounds.southWest; + double latFraction = ([PluginUtil _latRad:ne.latitude] - [PluginUtil _latRad:sw.latitude]) / M_PI; + double lngDiff = ne.longitude - sw.longitude; + + double lngFraction = ((lngDiff < 0) ? (lngDiff + 360) : lngDiff) / 360; + + double latZoom = [PluginUtil _zoom: mapHeight worldPx:256 fraction: latFraction]; + double lngZoom = [PluginUtil _zoom: mapWidth worldPx:256 fraction: lngFraction]; + + return MIN(MIN(latZoom, lngZoom), 21); +} + @end diff --git a/www/ElevationService.js b/www/ElevationService.js new file mode 100644 index 000000000..57ebb1660 --- /dev/null +++ b/www/ElevationService.js @@ -0,0 +1,123 @@ + +/***************************************************************************** + * ElevationService class + *****************************************************************************/ +var LatLng = require('./LatLng'); + +var ElevationService = function(exec) { + function _errorHandler(err) { + console.error(err); + } + return { + getElevationAlongPath: function(request, callback, errorCallback) { + var self = this; + + if (!request) { + return errorHandler('getElevationAlongPath needs request parameter'); + } + if (!request.samples) { + return errorHandler('getElevationAlongPath needs request.samples parameter'); + } + if (typeof request.samples !== 'number' || + request.samples < 2 || request.samples > 512) { + return errorHandler('getElevationAlongPath needs request.samples must be a value between 2 and 512 inclusive'); + } + + var path = request.path; + if (request.path && request.path.type === 'BaseArrayClass') { + path = request.path.getArray(); + } + for (var i = 0; i < path.length; i++) { + path[i] = { + lat: path[i].lat, + lng: path[i].lng + }; + } + if (path instanceof Array && !Array.isArray(request.path)) { + return errorHandler('getElevationAlongPath needs request.path must be an ILatLng array'); + } + + + var params = { + 'path': path, + samples: request.samples + }; + + var resolver = function (resolve, reject) { + exec.call({ + _isReady: true + }, function (_results) { + resolve(_results.results); + }, reject, 'PluginElevationService', 'getElevationAlongPath', [params]); + }; + + + var errorHandler = function(result) { + if (typeof errorCallback === 'function') { + errorCallback.call(self, result); + } else { + (self.errorHandler || _errorHandler).call(self, result); + } + }; + if (typeof callback === 'function') { + resolver(callback, errorHandler); + return self; + } else { + return new Promise(resolver); + } + }, + + getElevationForLocations: function(request, callback, errorCallback) { + var self = this; + + if (!request) { + return errorHandler('getElevationForLocations needs request parameter'); + } + + var locations = request.locations; + if (request.locations && request.locations.type === 'BaseArrayClass') { + locations = request.locations.getArray(); + } + for (var i = 0; i < locations.length; i++) { + locations[i] = { + lat: locations[i].lat, + lng: locations[i].lng + }; + } + if (locations instanceof Array && !Array.isArray(request.locations)) { + return errorHandler('getElevationAlongPath needs request.locations must be an ILatLng array'); + } + + + var params = { + 'locations': locations + }; + + var resolver = function (resolve, reject) { + exec.call({ + _isReady: true + }, function (_results) { + resolve(_results.results); + }, reject, 'PluginElevationService', 'getElevationForLocations', [params]); + }; + + + var errorHandler = function(result) { + if (typeof errorCallback === 'function') { + errorCallback.call(self, result); + } else { + (self.errorHandler || _errorHandler).call(self, result); + } + }; + if (typeof callback === 'function') { + resolver(callback, errorHandler); + return self; + } else { + return new Promise(resolver); + } + } + }; +}; + + +module.exports = ElevationService; diff --git a/www/Map.js b/www/Map.js index 80373fc0c..61cc79670 100644 --- a/www/Map.js +++ b/www/Map.js @@ -7,6 +7,7 @@ var utils = require('cordova/utils'), BaseClass = require('./BaseClass'), BaseArrayClass = require('./BaseArrayClass'), LatLng = require('./LatLng'), + LatLngBounds = require('./LatLngBounds'), MapTypeId = require('./MapTypeId'), event = require('./event'), VisibleRegion = require('./VisibleRegion'), @@ -18,6 +19,7 @@ var utils = require('cordova/utils'), GroundOverlay = require('./GroundOverlay'), KmlOverlay = require('./KmlOverlay'), KmlLoader = require('./KmlLoader'), + spherical = require('cordova-plugin-googlemaps.spherical'), MarkerCluster = require('./MarkerCluster'); /** @@ -98,12 +100,53 @@ Map.prototype.getMap = function(meta, div, options) { } if (options.preferences && options.preferences.gestureBounds) { - if (utils.isArray(options.preferences.gestureBounds) || - options.preferences.gestureBounds.type === 'LatLngBounds') { - options.preferences.gestureBounds = common.convertToPositionArray(options.preferences.gestureBounds); + + var bounds = new LatLngBounds(); + if (utils.isArray(options.preferences.gestureBounds)) { + options.preferences.gestureBounds.forEach(function(ele) { + if (ele.lat && ele.lng) { + bounds.extend(ele); + } + }); + } else if (options.preferences.gestureBounds.type === 'LatLngBounds' || + options.preferences.gestureBounds.northeast && options.preferences.gestureBounds.southwest) { + bounds.extend(options.preferences.gestureBounds.southwest); + bounds.extend(options.preferences.gestureBounds.northeast); + } + + if (!bounds.southwest || !bounds.northeast) { + console.warn('(getMap) options.preferences.gestureBounds is invalid.'); + delete options.preferences.gestureBounds; + } else { + var minZoom = !div ? 0 : spherical.computeBoundsZoom(bounds, div.offsetWidth, div.offsetHeight, 256); + var maxZoom = 23; + var prefMinZoom = 0; + var prefMaxZoom = 23; + if (options.preferences.zoom) { + if (options.preferences.zoom.minZoom) { + minZoom = options.preferences.zoom.minZoom; + prefMinZoom = minZoom; + } + if (options.preferences.zoom.maxZoom) { + maxZoom = options.preferences.zoom.maxZoom; + maxZoom = minZoom; + } + } + options.preferences.gestureBounds = { + 'south': bounds.southwest.lat, + 'west': bounds.southwest.lng, + 'north': bounds.northeast.lat, + 'east': bounds.northeast.lng, + 'prefMinZoom': prefMinZoom, + 'prefMaxZoom': prefMaxZoom, + 'minZoom': minZoom, + 'maxZoom': maxZoom + }; + self.set('restriction', options.preferences.gestureBounds); } } + if (!common.isDom(div)) { self.set('visible', false); options = div; diff --git a/www/plugin-loader-for-android_ios.js b/www/plugin-loader-for-android_ios.js index 593e64cd8..bb9b89b8b 100644 --- a/www/plugin-loader-for-android_ios.js +++ b/www/plugin-loader-for-android_ios.js @@ -154,6 +154,7 @@ if (!cordova) { environment: require('./Environment'), Geocoder: require('./Geocoder')(execCmd), LocationService: require('./LocationService')(execCmd), + ElevationService: require('./ElevationService')(execCmd), geometry: { encoding: require('./encoding'), spherical: require('./spherical'), diff --git a/www/plugin-loader-for-browser.js b/www/plugin-loader-for-browser.js index 87d636a1f..a1e16b6b8 100644 --- a/www/plugin-loader-for-browser.js +++ b/www/plugin-loader-for-browser.js @@ -28,6 +28,7 @@ module.exports = { MapTypeId: require('cordova-plugin-googlemaps.MapTypeId'), environment: require('cordova-plugin-googlemaps.Environment'), Geocoder: require('cordova-plugin-googlemaps.Geocoder')(execCmd), + ElevationService: require('cordova-plugin-googlemaps.ElevationService')(execCmd), LocationService: require('cordova-plugin-googlemaps.LocationService')(execCmd), geometry: { encoding: require('cordova-plugin-googlemaps.encoding'), diff --git a/www/spherical.js b/www/spherical.js index 04a08c93e..b35c16c27 100644 --- a/www/spherical.js +++ b/www/spherical.js @@ -269,6 +269,38 @@ function computeLength(path) { }); return length * EARTH_RADIUS; } + +/** + * Returns the zoom level that fits for given bounds. + * https://stackoverflow.com/a/13274361/697856 + */ +function computeBoundsZoom(bounds, mapWidth, mapHeight, tileSize) { + var ZOOM_MAX = 23; + + var ne = bounds.northeast; + var sw = bounds.southwest; + + var latFraction = (_latRad(ne.lat) - _latRad(sw.lat)) / Math.PI; + + var lngDiff = ne.lng - sw.lng; + var lngFraction = ((lngDiff < 0) ? (lngDiff + 360) : lngDiff) / 360; + + var latZoom = _zoom(mapHeight, tileSize, latFraction); + var lngZoom = _zoom(mapWidth, tileSize, lngFraction); + + return Math.min(latZoom, lngZoom, ZOOM_MAX); +} + +function _latRad(lat) { + var sin = Math.sin(lat * Math.PI / 180); + var radX2 = Math.log((1 + sin) / (1 - sin)) / 2; + return Math.max(Math.min(radX2, Math.PI), -Math.PI) / 2; +} + +function _zoom(mapPx, worldPx, fraction) { + return Math.floor(Math.log(mapPx / worldPx / fraction) / Math.LN2); +} + module.exports = { computeDistanceBetween: computeDistanceBetween, computeOffset: computeOffset, @@ -277,5 +309,6 @@ module.exports = { computeSignedArea: computeSignedArea, computeHeading: computeHeading, interpolate: interpolate, - computeLength: computeLength + computeLength: computeLength, + computeBoundsZoom: computeBoundsZoom }; From 458d2dffcdc438bb272090a8e8dcea2f7eaf9fbc Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Fri, 1 May 2020 23:59:10 -0700 Subject: [PATCH 02/50] still working on. --- package.json | 2 +- plugin.xml | 20 +- .../google/maps/PluginDirectionsService.java | 276 ++++++++++++++++++ .../google/maps/PluginElevationService.java | 36 +++ src/browser/PluginDirectionsService.js | 261 +++++++++++++++++ src/browser/PluginElevationService.js | 9 +- src/browser/PluginGeocoder.js | 8 + src/ios/GoogleMaps/PluginDirectionsService.h | 18 ++ src/ios/GoogleMaps/PluginDirectionsService.m | 272 +++++++++++++++++ src/ios/GoogleMaps/PluginElevationService.m | 14 +- src/ios/GoogleMaps/PluginUtil.h | 2 + src/ios/GoogleMaps/PluginUtil.m | 34 ++- www/Common.js | 2 +- www/DirectionsRenderer.js | 186 ++++++++++++ www/DirectionsService.js | 166 +++++++++++ www/Map.js | 39 ++- www/Polyline.js | 5 + www/plugin-loader-for-android_ios.js | 1 + www/plugin-loader-for-browser.js | 1 + 19 files changed, 1334 insertions(+), 18 deletions(-) create mode 100644 src/android/plugin/google/maps/PluginDirectionsService.java create mode 100644 src/browser/PluginDirectionsService.js create mode 100644 src/ios/GoogleMaps/PluginDirectionsService.h create mode 100644 src/ios/GoogleMaps/PluginDirectionsService.m create mode 100644 www/DirectionsRenderer.js create mode 100644 www/DirectionsService.js diff --git a/package.json b/package.json index 9f791ea7b..ec65da3db 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-googlemaps", - "version": "2.8.0-20200429-1039", + "version": "2.8.0-20200501-1158", "description": "Google Maps native SDK for Android and iOS, and Google Maps JavaScript API v3 for browser.", "cordova": { "id": "cordova-plugin-googlemaps", diff --git a/plugin.xml b/plugin.xml index df05705b9..6ae84197a 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - + cordova-plugin-googlemaps @@ -65,6 +65,12 @@ + + + + + + @@ -188,6 +194,9 @@ + + + @@ -215,6 +224,7 @@ + @@ -328,6 +338,9 @@ + + + @@ -370,6 +383,8 @@ + + @@ -533,6 +548,9 @@ + + + diff --git a/src/android/plugin/google/maps/PluginDirectionsService.java b/src/android/plugin/google/maps/PluginDirectionsService.java new file mode 100644 index 000000000..4b98f30bc --- /dev/null +++ b/src/android/plugin/google/maps/PluginDirectionsService.java @@ -0,0 +1,276 @@ +package plugin.google.maps; + +import android.app.Activity; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.util.Log; + +import com.google.android.gms.maps.model.LatLng; + +import org.apache.cordova.CallbackContext; +import org.apache.cordova.CordovaInterface; +import org.apache.cordova.CordovaPlugin; +import org.apache.cordova.CordovaWebView; +import org.apache.cordova.PluginResult; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.HashMap; +import java.util.List; +import java.util.Locale; + +public class PluginDirectionsService extends CordovaPlugin { + private Activity activity; + private final String TAG = "PluginDirectionsService"; + private String API_KEY = ""; + + public void initialize(final CordovaInterface cordova, final CordovaWebView webView) { + super.initialize(cordova, webView); + activity = cordova.getActivity(); + + try { + ApplicationInfo ai = activity.getPackageManager().getApplicationInfo(activity.getPackageName(), PackageManager.GET_META_DATA); + this.API_KEY = ai.metaData.getString("com.google.android.geo.API_KEY"); + } catch (Exception e) { + // ignore + } + } + + + @Override + public boolean execute(final String action, final JSONArray args, final CallbackContext callbackContext) throws JSONException { + + HashMap params = new HashMap(); + + JSONObject opts = args.getJSONObject(0); + + //------------------- + // required parameters + //------------------- + params.put("origin", _decode_DirectionsRequestLocation(opts.getJSONObject("origin"))); + params.put("destination", _decode_DirectionsRequestLocation(opts.getJSONObject("destination"))); + params.put("key", this.API_KEY); + + //------------------- + // mode parameter + //------------------- + if (opts.has("travelMode")) { + // Default : driving + String travelMode = opts.getString("travelMode").toLowerCase(); + if (!"driving".equals(travelMode)) { + params.put("mode", travelMode); + + //------------------- + // transitOptions parameter + //------------------- + if ("transit".equals(travelMode) && opts.has("transitOptions")) { + JSONObject transitOptions = opts.getJSONObject("transitOptions"); + if (transitOptions.has("arrivalTime")) { + params.put("arrival_time", String.valueOf(transitOptions.getInt("arrivalTime"))); + } + if (transitOptions.has("departureTime")) { + params.put("departure_time", String.valueOf(transitOptions.getInt("departureTime"))); + } + } + } else { + + //------------------- + // DrivingOptions parameter + //------------------- + if (opts.has("drivingOptions")) { + JSONObject drivingOptions = opts.getJSONObject("drivingOptions"); + if (drivingOptions.has("departureTime")) { + params.put("departure_time", String.valueOf(drivingOptions.getInt("departureTime"))); + } + if (drivingOptions.has("trafficModel")) { + String trafficModel = drivingOptions.getString("trafficModel").toLowerCase(); + if (!"best_guess".equals(trafficModel)) { + params.put("traffic_model", trafficModel); + } + } + } + } + + //------------------- + // transitOptions parameter + //------------------- + if (opts.has("transitOptions")) { + JSONObject transitOptions = opts.getJSONObject("transitOptions"); + //------------------- + // transitOptions.modes parameter + //------------------- + if (transitOptions.has("modes")) { + JSONArray modes = transitOptions.getJSONArray("modes"); + StringBuilder buffer = new StringBuilder(); + int n = modes.length(); + for (int i = 0; i < n; i++) { + if (i > 0) { + buffer.append("|"); + } + buffer.append(modes.getString(i).toLowerCase()); + } + params.put("transit_mode", buffer.toString()); + } + //------------------- + // transitOptions.routingPreference parameter + //------------------- + if (transitOptions.has("routingPreference")) { + String routingPreference = transitOptions.getString("routingPreference").toLowerCase(); + params.put("transit_routing_preference", routingPreference); + } + } + } + + + + //------------------- + // waypoints parameter + //------------------- + if (opts.has("waypoints")) { + JSONArray waypoints = opts.getJSONArray("waypoints"); + StringBuilder buffer = new StringBuilder(); + int n = waypoints.length(); + + int cnt = 0; + if (opts.has("optimizeWaypoints") && opts.getBoolean("optimizeWaypoints")) { + cnt = 1; + buffer.append("optimize:true"); + } + for (int i = 0; i < n; i++) { + JSONObject point = waypoints.getJSONObject(i); + if (point.has("location")) { + boolean stopOver = false; + if (point.has("stopover")) { + stopOver = point.getBoolean("stopover"); + } + if (cnt > 0) { + buffer.append("|"); + } + if (!stopOver) { + buffer.append("via:"); + } + buffer.append(_decode_DirectionsRequestLocation(point.getJSONObject("location"))); + cnt++; + } + } + if (cnt > 0) { + params.put("waypoints", buffer.toString()); + } + } + //------------------- + // alternatives parameter + //------------------- + if (opts.has("provideRouteAlternatives") && opts.getBoolean("provideRouteAlternatives")) { + params.put("alternatives", "true"); + } + + //------------------- + // avoid parameter + //------------------- + boolean avoidFerries = false; + boolean avoidHighways = false; + boolean avoidTolls = false; + if (opts.has("avoidFerries")) { + avoidFerries = opts.getBoolean("avoidFerries"); + } + if (opts.has("avoidHighways")) { + avoidHighways = opts.getBoolean("avoidHighways"); + } + if (opts.has("avoidTolls")) { + avoidTolls = opts.getBoolean("avoidTolls"); + } + if (avoidFerries || avoidHighways || avoidTolls) { + StringBuilder buffer = new StringBuilder(); + if (avoidFerries) { + buffer.append("ferries|"); + } + if (avoidTolls) { + buffer.append("tolls|"); + } + if (avoidHighways) { + buffer.append("highways|"); + } + buffer.delete(buffer.length() - 2, buffer.length()); + params.put("avoid", buffer.toString()); + } + //------------------- + // language parameter + //------------------- + String lCode = Locale.getDefault().getLanguage(); + params.put("language", lCode); + + //------------------- + // units parameter + //------------------- + String localeFull = Locale.getDefault().getDisplayLanguage(); + if (opts.has("unitSystem")) { + params.put("units", opts.getString("unitSystem").toLowerCase()); + } else if ("en_US".equals(localeFull)) { + params.put("units", "imperial"); + } else { + params.put("units", "metric"); + } + + //------------------- + // region parameter + //------------------- + if (opts.has("region")) { + params.put("region", opts.getString("region").toLowerCase()); + } + + + AsyncGetJsonWithURL httpGet = new AsyncGetJsonWithURL("https://maps.googleapis.com/maps/api/directions/json", new AsyncHttpGetInterface() { + @Override + public void onPostExecute(JSONObject result) { + PluginResult pluginResult = null; + + try { + if (result == null) { + pluginResult = new PluginResult(PluginResult.Status.ERROR, "UNKNOWN_ERROR"); + } else { + if ("OK".equals(result.getString("status"))) { + pluginResult = new PluginResult(PluginResult.Status.OK, result); + } else { + pluginResult = new PluginResult(PluginResult.Status.ERROR, result.getString("status")); + } + } + } catch (Exception e){ + pluginResult = new PluginResult(PluginResult.Status.ERROR, "UNKNOWN_ERROR"); + } finally { + if (pluginResult == null) { + pluginResult = new PluginResult(PluginResult.Status.ERROR, "UNKNOWN_ERROR"); + } + callbackContext.sendPluginResult(pluginResult); + } + } + }); + + httpGet.execute(params); + return true; + } + + private String _decode_DirectionsRequestLocation(JSONObject position) throws JSONException { + String positionType = position.getString("type"); + + if ("string".equals(positionType)) { + return position.getString("value"); + } + + JSONObject value = position.getJSONObject("value"); + if ("location".equals(positionType)) { + return String.format("%f,%f", value.getDouble("lat"), value.getDouble("lng")); + } + if (value.has("placeId")) { + return String.format("place_id:%s", value.getString("placeId")); + } + if (value.has("location")) { + JSONObject location = value.getJSONObject("location"); + return String.format("%f,%f", location.getDouble("lat"), location.getDouble("lng")); + } + if (value.has("query")) { + return value.getString("query"); + } + return ""; + } +} diff --git a/src/android/plugin/google/maps/PluginElevationService.java b/src/android/plugin/google/maps/PluginElevationService.java index 47c1ac3e4..b2c679ff9 100644 --- a/src/android/plugin/google/maps/PluginElevationService.java +++ b/src/android/plugin/google/maps/PluginElevationService.java @@ -107,6 +107,42 @@ public void onPostExecute(JSONObject result) { @SuppressWarnings("unused") public void getElevationForLocations(final JSONArray args, final CallbackContext callbackContext) throws JSONException { + HashMap params = new HashMap(); + + JSONObject opts = args.getJSONObject(0); + + JSONArray points = opts.getJSONArray("locations"); + List path = PluginUtil.JSONArray2LatLngList(points); + params.put("locations", "enc:" + PluginUtil.encodePath(path)); + params.put("key", this.API_KEY); + + AsyncGetJsonWithURL httpGet = new AsyncGetJsonWithURL("https://maps.googleapis.com/maps/api/elevation/json", new AsyncHttpGetInterface() { + @Override + public void onPostExecute(JSONObject result) { + PluginResult pluginResult = null; + + try { + if (result == null) { + pluginResult = new PluginResult(PluginResult.Status.ERROR, "UNKNOWN_ERROR"); + } else { + if ("OK".equals(result.getString("status"))) { + pluginResult = new PluginResult(PluginResult.Status.OK, result); + } else { + pluginResult = new PluginResult(PluginResult.Status.ERROR, result.getString("status")); + } + } + } catch (Exception e){ + pluginResult = new PluginResult(PluginResult.Status.ERROR, "UNKNOWN_ERROR"); + } finally { + if (pluginResult == null) { + pluginResult = new PluginResult(PluginResult.Status.ERROR, "UNKNOWN_ERROR"); + } + callbackContext.sendPluginResult(pluginResult); + } + } + }); + + httpGet.execute(params); } } diff --git a/src/browser/PluginDirectionsService.js b/src/browser/PluginDirectionsService.js new file mode 100644 index 000000000..34b1b065b --- /dev/null +++ b/src/browser/PluginDirectionsService.js @@ -0,0 +1,261 @@ + + +var BaseArrayClass = require('cordova-plugin-googlemaps.BaseArrayClass'); + +function _cnv_DirectionsRoute(route) { + if (route.bounds) { + route.bounds = { + 'southwest' : { + 'lat': route.bounds.getSouthWest().lat(), + 'lng': route.bounds.getSouthWest().lng() + }, + 'northeast' : { + 'lat': route.bounds.getNorthEast().lat(), + 'lng': route.bounds.getNorthEast().lng() + } + }; + } + if (route.overview_path) { + route.overview_path = route.overview_path.map(function(latLng) { + return { + 'lat': latLng.lat(), + 'lng': latLng.lng() + }; + }); + } + if (route.legs) { + route.legs = route.legs.map(_cnv_DirectionsLeg); + } + return route; +} + +function _cnv_DirectionsLeg(leg) { + if (leg.arrival_time) { + leg.arrival_time.value = leg.arrival_time.value.getTime(); + } + if (leg.departure_time) { + leg.departure_time.value = leg.departure_time.value.getTime(); + } + if (leg.end_location) { + leg.end_location = { + 'lat': leg.end_location.lat(), + 'lng': leg.end_location.lng() + }; + } + if (leg.start_location) { + leg.start_location = { + 'lat': leg.start_location.lat(), + 'lng': leg.start_location.lng() + }; + } + if (leg.steps) { + leg.steps = leg.steps.map(_cnv_DirectionsStep); + } + if (leg.via_waypoints) { + leg.via_waypoints = leg.via_waypoints.map(function(latLng) { + return { + 'lat': latLng.lat(), + 'lng': latLng.lng() + }; + }); + } + return leg; +} + +function _cnv_DirectionsStep(step) { + if (step.start_location) { + step.start_location = { + 'lat': step.start_location.lat(), + 'lng': step.start_location.lng() + }; + } + if (step.end_location) { + step.end_location = { + 'lat': step.end_location.lat(), + 'lng': step.end_location.lng() + }; + } + if (step.path) { + step.path = step.path.map(function(latLng) { + return { + 'lat': latLng.lat(), + 'lng': latLng.lng() + }; + }); + } + if (step.steps) { + step.steps = step.steps.map(_cnv_DirectionsStep); + } + if (step.transit) { + step.steps = _cnv_TransitDetails(step.transit); + } + return step; +} +function _cnv_TransitDetails(transit) { + + if (transit.arrival_stop) { + transit.arrival_stop.location = { + 'lat': transit.arrival_stop.location.lat(), + 'lng': transit.arrival_stop.location.lng() + }; + } + if (transit.departure_stop) { + transit.departure_stop.location = { + 'lat': transit.departure_stop.location.lat(), + 'lng': transit.departure_stop.location.lng() + }; + } + if (transit.arrival_time) { + transit.arrival_time.value = transit.arrival_time.value.getTime(); + } + if (transit.departure_time) { + transit.departure_time.value = transit.departure_time.value.getTime(); + } + return transit; +} + +var service = null; +var lastRequestTime = 0; +var QUEUE = new BaseArrayClass(); +QUEUE.on('insert_at', function() { + if (!window.google || !window.google.maps) { + return; + } + if (QUEUE.getLength() === 1) { + this.trigger('next'); + } +}); +QUEUE.one('insert_at', function() { + + if (!window.google || !window.google.maps) { + setTimeout(arguments.callee.bind(this), 100); + return; + } + service = new google.maps.DirectionsService(); + this.trigger('next'); +}); +QUEUE.on('next', function() { + var self = QUEUE; + if (!service || self._executing || QUEUE.getLength() === 0) { + return; + } + if (Date.now() - lastRequestTime < 300) { + setTimeout(function() { + self.trigger('next'); + }, 300 + Math.floor(Math.random() * 200)); + return; + } + lastRequestTime = Date.now(); + self._executing = true; + + var cmd = QUEUE.removeAt(0, true); + + service.route(cmd.request, function(result, status) { + switch(status) { + case google.maps.DirectionsStatus.INVALID_REQUEST: + self._executing = false; + cmd.onError('[directions] The DirectionsRequest provided was invalid.'); + return; + case google.maps.DirectionsStatus.MAX_WAYPOINTS_EXCEEDED: + self._executing = false; + cmd.onError('[directions] Too many DirectionsWaypoints were provided in the DirectionsRequest.'); + return; + case google.maps.DirectionsStatus.NOT_FOUND: + self._executing = false; + cmd.onError('[directions] At least one of the origin, destination, or waypoints could not be geocoded.'); + return; + case google.maps.DirectionsStatus.OVER_QUERY_LIMIT: + QUEUE.insertAt(0, cmd); + console.warn('[directions] Due to the OVER_QUERY_LIMIT error, wait 3 sec, then try again.'); + setTimeout(function() { + self._executing = false; + self.trigger('next'); + }, 3000 + Math.floor(Math.random() * 200)); + return; + case google.maps.DirectionsStatus.REQUEST_DENIED: + self._executing = false; + cmd.onError('[directions] Google denited your elevation request.'); + return; + case google.maps.DirectionsStatus.UNKNOWN_ERROR: + self._executing = false; + cmd.onError('[directions] There was an unknown error. Please try again.'); + return; + case google.maps.DirectionsStatus.ZERO_RESULTS: + self._executing = false; + cmd.onError('[directions] No route could be found between the origin and destination.'); + return; + } + + if (result.routes) { + result.routes = result.routes.map(_cnv_DirectionsRoute); + } + + self._executing = false; + cmd.onSuccess(result); + + // Insert delay to prevent the OVER_QUERY_LIMIT error. + var delay = 300 + Math.floor(Math.random() * 200); + setTimeout(function() { + self._executing = false; + self.trigger('next'); + }, delay); + }); + +}); + +function _decode_DirectionsRequestLocation(position) { + if (position.type === 'string') { + return position.value; + } else if (position.type === 'location') { + return { + 'lat': position.value.lat, + 'lng': position.value.lng + }; + } else { + var place = {}; + if (position.value.location) { + place.location = position.value.location; + } + if (position.value.placeId) { + place.placeId = position.value.placeId; + } + if (position.value.query) { + place.query = position.value.query; + } + return place; + } +} + +module.exports = { + 'route': function(onSuccess, onError, args) { + var request = args[0]; + + request.origin = _decode_DirectionsRequestLocation(request.origin); + request.destination = _decode_DirectionsRequestLocation(request.destination); + if (request.waypoints) { + request.waypoints = request.waypoints.map(function(point) { + point.location = _decode_DirectionsRequestLocation(point.location); + return point; + }); + } + + if (request.drivingOptions && typeof request.drivingOptions.departureTime === 'number') { + request.drivingOptions.departureTime = new Date(request.drivingOptions.departureTime); + } + if (request.transitOptions && typeof request.transitOptions.departureTime === 'number') { + request.transitOptions.departureTime = new Date(request.transitOptions.departureTime); + } + if (request.transitOptions && typeof request.transitOptions.arrivalTime === 'number') { + request.transitOptions.arrivalTime = new Date(request.transitOptions.arrivalTime); + } + + QUEUE.push({ + 'request': request, + 'onSuccess': onSuccess, + 'onError': onError + }); + } +}; + + +require('cordova/exec/proxy').add('PluginDirectionsService', module.exports); diff --git a/src/browser/PluginElevationService.js b/src/browser/PluginElevationService.js index d22e65253..ae9e10450 100644 --- a/src/browser/PluginElevationService.js +++ b/src/browser/PluginElevationService.js @@ -6,11 +6,19 @@ var service = null; var lastRequestTime = 0; var QUEUE = new BaseArrayClass(); QUEUE.on('insert_at', function() { + if (!window.google || !window.google.maps) { + return; + } if (QUEUE.getLength() === 1) { this.trigger('next'); } }); QUEUE.one('insert_at', function() { + + if (!window.google || !window.google.maps) { + setTimeout(arguments.callee.bind(this), 100); + return; + } service = new google.maps.ElevationService(); this.trigger('next'); }); @@ -70,7 +78,6 @@ QUEUE.on('next', function() { self._executing = false; cmd.onSuccess({ - 'idx': cmd.pluginRequest.idx, 'results': pluginResults }); diff --git a/src/browser/PluginGeocoder.js b/src/browser/PluginGeocoder.js index b0bb5493b..275074895 100644 --- a/src/browser/PluginGeocoder.js +++ b/src/browser/PluginGeocoder.js @@ -5,11 +5,19 @@ var geocoder = null; var lastRequestTime = 0; var QUEUE = new BaseArrayClass(); QUEUE.on('insert_at', function() { + if (!window.google || !window.google.maps) { + return; + } if (QUEUE.getLength() === 1) { this.trigger('next'); } }); QUEUE.one('insert_at', function() { + + if (!window.google || !window.google.maps) { + setTimeout(arguments.callee.bind(this), 100); + return; + } geocoder = new google.maps.Geocoder(); this.trigger('next'); }); diff --git a/src/ios/GoogleMaps/PluginDirectionsService.h b/src/ios/GoogleMaps/PluginDirectionsService.h new file mode 100644 index 000000000..2d4e3f687 --- /dev/null +++ b/src/ios/GoogleMaps/PluginDirectionsService.h @@ -0,0 +1,18 @@ +// +// PluginElevationService.h +// cordova-googlemaps-plugin v2 +// +// Created by Masashi Katsumata. +// +// + +#import +#import +#import "PluginUtil.h" + +@interface PluginDirectionsService : CDVPlugin + +@property (nonatomic, strong) NSOperationQueue *executeQueue; +- (void)getElevationAlongPath:(CDVInvokedUrlCommand*)command; +- (void)getElevationForLocations:(CDVInvokedUrlCommand*)command; +@end diff --git a/src/ios/GoogleMaps/PluginDirectionsService.m b/src/ios/GoogleMaps/PluginDirectionsService.m new file mode 100644 index 000000000..0bfa3102a --- /dev/null +++ b/src/ios/GoogleMaps/PluginDirectionsService.m @@ -0,0 +1,272 @@ +// +// PluginElevationService.m +// cordova-googlemaps-plugin v2 +// +// Created by Masashi Katsumata. +// +// + +#import "PluginDirectionsService.h" + +@implementation PluginDirectionsService + +- (void)pluginUnload +{ + if (self.executeQueue != nil){ + self.executeQueue.suspended = YES; + [self.executeQueue cancelAllOperations]; + self.executeQueue.suspended = NO; + self.executeQueue = nil; + } +} + +- (void)pluginInitialize +{ + self.executeQueue = [NSOperationQueue new]; + self.executeQueue.maxConcurrentOperationCount = 3; + +} + +- (NSString *)_decode_DirectionsRequestLocation: (NSDictionary *)position { + NSString *positionType = [position objectForKey:@"type"]; + + if ([@"string" isEqualToString: positionType]) { + return [[position objectForKey:@"value"] stringValue]; + } + + NSDictionary *value = [position objectForKey:@"value"]; + if ([@"location" isEqualToString:positionType]) { + return [NSString stringWithFormat:@"%f,%f", + [[value objectForKey:@"lat"] doubleValue], + [[value objectForKey:@"lng"] doubleValue] + ]; + } + if ([value objectForKey:@"placeId"]) { + return [NSString stringWithFormat:@"place_id:%@", + [[value objectForKey:@"placeId"] stringValue] + ]; + } + + if ([value objectForKey:@"location"]) { + NSDictionary *location = [value objectForKey:@"location"]; + return [NSString stringWithFormat:@"%f,%f", + [[location objectForKey:@"lat"] doubleValue], + [[location objectForKey:@"lng"] doubleValue] + ]; + } + if ([value objectForKey:@"query"]) { + return [value objectForKey:@"query"]; + } + return @""; +} + +- (void)route:(CDVInvokedUrlCommand*)command { + NSDictionary *opts = [command.arguments objectAtIndex:0]; + NSLog(@"route = %@", opts); + + + NSMutableDictionary *params = [NSMutableDictionary dictionary]; + //----------------------- + // required parameters + //----------------------- + [params setObject:[self _decode_DirectionsRequestLocation:[opts objectForKey:@"origin"]] forKey:@"origin"]; + [params setObject:[self _decode_DirectionsRequestLocation:[opts objectForKey:@"destination"]] forKey:@"destination"]; + + //----------------------- + // mode parameter + //----------------------- + if ([opts objectForKey:@"travelMode"]) { + // Default: driving + NSString *travelMode = [opts objectForKey:@"travelMode"]; + travelMode = [travelMode lowercaseString]; + if (![@"driving" isEqualToString:travelMode]) { + [params setObject:travelMode forKey:@"mode"]; + + //----------------------- + // transitOptions parameter + //----------------------- + if ([@"transit" isEqualToString:travelMode] && + [opts objectForKey:@"transitOptions"]) { + NSDictionary *transitOptions = [opts objectForKey:@"transitOptions"]; + if ([transitOptions objectForKey:@"arrivalTime"]) { + [params setObject:[NSString stringWithFormat:@"%@", [transitOptions objectForKey:@"arrivalTime"]] forKey:@"arrival_time"]; + } + if ([transitOptions objectForKey:@"depatureTime"]) { + [params setObject:[NSString stringWithFormat:@"%@", [transitOptions objectForKey:@"depatureTime"]] forKey:@"depature_time"]; + } + } + } else { + //----------------------- + // DrivingOptions parameter + //----------------------- + if ([opts objectForKey:@"drivingOptions"]) { + NSDictionary *drivingOptions = [opts objectForKey:@"drivingOptions"]; + if ([drivingOptions objectForKey:@"depatureTime"]) { + [params setObject:[NSString stringWithFormat:@"%@", [drivingOptions objectForKey:@"depatureTime"]] forKey:@"depature_time"]; + } + if ([drivingOptions objectForKey:@"trafficModel"]) { + NSString *trafficModel = [[[opts objectForKey:@"trafficModel"] stringValue] lowercaseString]; + [params setObject:trafficModel forKey:@"traffic_model"]; + } + } + } + + //------------------- + // transitOptions parameter + //------------------- + if ([opts objectForKey:@"transitOptions"]) { + NSDictionary *transitOptions = [opts objectForKey:@"transitOptions"]; + //------------------- + // transitOptions.modes parameter + //------------------- + if ([transitOptions objectForKey:@"modes"]) { + NSArray *modes = [transitOptions objectForKey:@"modes"]; + NSString *buffer = @""; + for (int i = 0; i < modes.count; i++) { + if (i > 0) { + buffer = [buffer stringByAppendingString:@"|"]; + } + buffer = [buffer stringByAppendingString:[[modes objectAtIndex:i] lowercaseString]]; + } + [params setObject:buffer forKey:@"transit_mode"]; + } + //------------------- + // transitOptions.routingPreference parameter + //------------------- + if ([transitOptions objectForKey:@"routingPreference"]) { + NSString *routingPreference = [[[transitOptions objectForKey:@"routingPreference"] stringValue] lowercaseString]; + [params setObject:routingPreference forKey:@"transit_routing_preference"]; + } + } + } + //------------------- + // waypoints parameter + //------------------- + if ([opts objectForKey:@"waypoints"]) { + NSArray *waypoints = [opts objectForKey:@"waypoints"]; + NSString *buffer = @""; + int cnt = 0; + if ([opts objectForKey:@"optimizeWayPoints"]) { + cnt = 1; + buffer = @"optimize:true"; + } + for (int i = 0; i < waypoints.count; i++) { + NSDictionary *point = [waypoints objectAtIndex:i]; + bool stopOver = false; + if ([point objectForKey:@"location"]) { + if ([point objectForKey:@"stopover"]) { + stopOver = [point objectForKey:@"stopover"]; + } + if (cnt > 0) { + buffer = [buffer stringByAppendingString:@"%7C"]; + } + if (!stopOver) { + buffer = [buffer stringByAppendingString:@"via:"]; + } + buffer = [buffer stringByAppendingString:[self _decode_DirectionsRequestLocation:[point objectForKey:@"location"]]]; + cnt++; + } + } + if (cnt > 0) { + [params setObject:buffer forKey:@"waypoints"]; + } + } + //------------------- + // alternatives parameter + //------------------- + if ([opts objectForKey:@"provideRouteAlternatives"]) { + [params setObject:@"true" forKey:@"alternatives"]; + } + + //------------------- + // avoid parameter + //------------------- + bool avoidFerries = false; + bool avoidHighways = false; + bool avoidTolls = false; + if ([opts objectForKey:@"avoideFerries"]) { + avoidFerries = [[opts objectForKey:@"avoideFerries"] boolValue]; + } + if ([opts objectForKey:@"avoidHighways"]) { + avoidHighways = [[opts objectForKey:@"avoidHighways"] boolValue]; + } + if ([opts objectForKey:@"avoidTolls"]) { + avoidTolls = [[opts objectForKey:@"avoidTolls"] boolValue]; + } + if (avoidFerries || avoidHighways || avoidTolls) { + NSString *buffer = @""; + int cnt = 0; + if (avoidFerries) { + buffer = @"ferries"; + cnt = 1; + } + if (avoidTolls) { + if (cnt > 0) { + buffer = [buffer stringByAppendingString:@"|"]; + } + buffer = [buffer stringByAppendingString:@"tolls"]; + cnt++; + } + if (avoidHighways) { + if (cnt > 0) { + buffer = [buffer stringByAppendingString:@"|"]; + } + buffer = [buffer stringByAppendingString:@"highways"]; + } + [params setObject:buffer forKey:@"avoid"]; + } + + //------------------- + // language parameter + //------------------- + NSArray *preferredLanguages = [NSLocale preferredLanguages]; + NSString *localeCode = [preferredLanguages objectAtIndex:0]; + NSString *languageCode = [[localeCode componentsSeparatedByString:@"-"] firstObject]; + [params setObject:languageCode forKey:@"language"]; + + //------------------- + // units parameter + //------------------- + if ([opts objectForKey:@"unitSystem"]) { + [params setObject:[[[opts objectForKey:@"unitSystem"] stringValue] lowercaseString] forKey:@"units"]; +// } else if ([@"en_US" isEqualToString:localeCode]) { +// [params setObject:@"imperial" forKey:@"units"]; +// } else { +// [params setObject:@"metric" forKey:@"units"]; + } + + //------------------- + // region parameter + //------------------- + if ([opts objectForKey:@"region"]) { + [params setObject:[[[opts objectForKey:@"region"] stringValue] lowercaseString] forKey:@"region"]; + } + + [self httpGetWithDictionary:params command:command]; +} + +- (void)httpGetWithDictionary:(NSDictionary *)params command:(CDVInvokedUrlCommand *)command +{ + + NSString *urlStr = @"https://maps.googleapis.com/maps/api/directions/json?"; + + NSUserDefaults *myDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"cordova.plugin.googlemaps"]; + NSString *DEFAULT_APIKey = [myDefaults objectForKey:@"GOOGLE_MAPS_API_KEY"]; + urlStr = [urlStr stringByAppendingFormat:@"key=%@&", DEFAULT_APIKey]; + + [self.executeQueue addOperationWithBlock:^{ + [PluginUtil getJsonWithURL:urlStr params:params completionBlock:^(BOOL succeeded, NSDictionary *result, NSString *error) { + + CDVPluginResult* pluginResult; + if (!succeeded) { + NSLog(@"[directions] %@", error); + pluginResult = [CDVPluginResult resultWithStatus: CDVCommandStatus_ERROR messageAsString:error]; + } else { + pluginResult = [CDVPluginResult resultWithStatus: CDVCommandStatus_OK messageAsDictionary:result]; + } + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + }]; + }]; +} + +@end diff --git a/src/ios/GoogleMaps/PluginElevationService.m b/src/ios/GoogleMaps/PluginElevationService.m index c545cf2dd..4c6ec7b2f 100644 --- a/src/ios/GoogleMaps/PluginElevationService.m +++ b/src/ios/GoogleMaps/PluginElevationService.m @@ -83,20 +83,12 @@ - (void)httpGetWithDictionary:(NSDictionary *)params command:(CDVInvokedUrlComma NSString *urlStr = @"https://maps.googleapis.com/maps/api/elevation/json?"; - NSEnumerator *keys = [params keyEnumerator]; - NSString *pName; - while(pName = [keys nextObject]) { - urlStr = [urlStr stringByAppendingFormat:@"%@=%@&", pName, [params objectForKey:pName]]; - } - NSUserDefaults *myDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"cordova.plugin.googlemaps"]; NSString *DEFAULT_APIKey = [myDefaults objectForKey:@"GOOGLE_MAPS_API_KEY"]; - urlStr = [urlStr stringByAppendingFormat:@"key=%@", DEFAULT_APIKey]; - - NSURL *url = [NSURL URLWithString: urlStr]; - + urlStr = [urlStr stringByAppendingFormat:@"key=%@&", DEFAULT_APIKey]; + [self.executeQueue addOperationWithBlock:^{ - [PluginUtil getJsonWithURL:url completionBlock:^(BOOL succeeded, NSDictionary *response, NSString *error) { + [PluginUtil getJsonWithURL:urlStr params:params completionBlock:^(BOOL succeeded, NSDictionary *response, NSString *error) { CDVPluginResult* pluginResult; if (!succeeded) { diff --git a/src/ios/GoogleMaps/PluginUtil.h b/src/ios/GoogleMaps/PluginUtil.h index a30c19b0c..2e38cf76f 100644 --- a/src/ios/GoogleMaps/PluginUtil.h +++ b/src/ios/GoogleMaps/PluginUtil.h @@ -40,6 +40,7 @@ typedef void (^MYCompletionHandler)(NSError *error); @end @interface NSString (GoogleMapsPlugin) +- (NSString *)urlencode; - (NSString*)regReplace:(NSString*)pattern replaceTxt:(NSString*)replaceTxt options:(NSRegularExpressionOptions)options; @end @@ -72,6 +73,7 @@ typedef void (^TIFAnimationGroupCompletionBlock)(); + (GMSMutablePath *)getMutablePathFromCircle:(CLLocationCoordinate2D)center radius:(double)radius; + (NSString *)getAbsolutePathFromCDVFilePath:(UIView*)theWebView cdvFilePath:(NSString *)cdvFilePath; + (NSString *)PGM_LOCALIZATION:(NSString *)key; ++ (void)getJsonWithURL:(NSString *)baseUrlStr params:(NSDictionary *)params completionBlock:(void (^)(BOOL succeeded, NSDictionary *response, NSString *error))completionBlock; + (void)getJsonWithURL:(NSURL *)url completionBlock:(void (^)(BOOL succeeded, NSDictionary *response, NSString *error))completionBlock; + (double)getZoomFromBounds:(GMSCoordinateBounds *)bounds mapWidth:(double)mapWidth mapHeight:(double)mapHeight; + (double)_zoom:(double)mapPx worldPx:(double)worldPx fraction:(double)fraction; diff --git a/src/ios/GoogleMaps/PluginUtil.m b/src/ios/GoogleMaps/PluginUtil.m index 47e460e13..873e13d8a 100644 --- a/src/ios/GoogleMaps/PluginUtil.m +++ b/src/ios/GoogleMaps/PluginUtil.m @@ -60,6 +60,26 @@ - (UIColor*)parsePluginColor @end @implementation NSString (GoogleMapsPlugin) +- (NSString *)urlencode { + NSMutableString *output = [NSMutableString string]; + const unsigned char *source = (const unsigned char *)[self UTF8String]; + int sourceLen = strlen((const char *)source); + for (int i = 0; i < sourceLen; ++i) { + const unsigned char thisChar = source[i]; + if (thisChar == ' '){ + [output appendString:@"+"]; + } else if (thisChar == '.' || thisChar == '-' || thisChar == '_' || thisChar == '~' || + (thisChar >= 'a' && thisChar <= 'z') || + (thisChar >= 'A' && thisChar <= 'Z') || + (thisChar >= '0' && thisChar <= '9')) { + [output appendFormat:@"%c", thisChar]; + } else { + [output appendFormat:@"%%%02X", thisChar]; + } + } + return output; +} + - (NSString*)regReplace:(NSString*)pattern replaceTxt:(NSString*)replaceTxt options:(NSRegularExpressionOptions)options { NSError *error = nil; @@ -467,6 +487,18 @@ + (NSString *)PGM_LOCALIZATION:(NSString *)key { } ++ (void)getJsonWithURL:(NSString *)urlStr params:(NSDictionary *)params completionBlock:(void (^)(BOOL succeeded, NSDictionary *response, NSString *error))completionBlock { + + NSEnumerator *keys = [params keyEnumerator]; + NSString *pName; + while(pName = [keys nextObject]) { + urlStr = [urlStr stringByAppendingFormat:@"%@=%@&", pName, [params objectForKey:pName]]; + } + NSLog(@"url = %@", urlStr); + NSURL *url = [NSURL URLWithString: urlStr]; + [PluginUtil getJsonWithURL:url completionBlock: completionBlock]; +} + + (void)getJsonWithURL:(NSURL *)url completionBlock:(void (^)(BOOL succeeded, NSDictionary *response, NSString *error))completionBlock { @@ -498,7 +530,7 @@ + (void)getJsonWithURL:(NSURL *)url completionBlock:(void (^)(BOOL succeeded, NS completionBlock(NO, nil, [json objectForKey:@"status"]); } } else { - NSLog(@"[elevation] error = %@", error.description); + NSLog(@"[getJsonWithURL] error = %@", error.description); completionBlock(NO, nil, @"UNKNOWN_ERROR"); } }]; diff --git a/www/Common.js b/www/Common.js index cf6201833..61d945eb3 100644 --- a/www/Common.js +++ b/www/Common.js @@ -550,7 +550,7 @@ function convertToPositionArray(array) { array = array || []; if (!utils.isArray(array)) { - if (array.type === 'LatLngBounds') { + if (array.type === 'LatLngBounds' || array.southwest && array.northeast) { array = [ array.southwest, { diff --git a/www/DirectionsRenderer.js b/www/DirectionsRenderer.js new file mode 100644 index 000000000..21f90242a --- /dev/null +++ b/www/DirectionsRenderer.js @@ -0,0 +1,186 @@ + + +var utils = require('cordova/utils'), + event = require('./event'), + BaseClass = require('./BaseClass'), + BaseArrayClass = require('./BaseArrayClass'), + VisibleRegion = require('./VisibleRegion'), + spherical = require('./spherical'), + encoding = require('./encoding'); + +/***************************************************************************** + * DirectionsRenderer Class + *****************************************************************************/ +var DirectionsRenderer = function(map, exec, options) { + BaseClass.apply(this); + + var self = this; + //self.set("visible", DirectionsRendererOptions.visible === undefined ? true : DirectionsRendererOptions.visible); + //self.set("zIndex", DirectionsRendererOptions.zIndex || 0); + + Object.defineProperty(self, '_isReady', { + value: true, + writable: false + }); + Object.defineProperty(self, 'type', { + value: 'DirectionsRenderer', + writable: false + }); + Object.defineProperty(self, 'map', { + value: map, + writable: false + }); + Object.defineProperty(self, 'exec', { + value: exec, + writable: false + }); + Object.defineProperty(self, 'polyline', { + value: self.map.addPolyline({ + 'points': [], + 'color': '#AA00FF', + 'width': 10 + }), + writable: false + }); + self.set('overview_path', []); + Object.defineProperty(self, 'waypoints', { + value: new BaseArrayClass(), + writable: false + }); + Object.defineProperty(self, 'waypointMarkers', { + value: new BaseArrayClass(), + writable: false + }); + self.set('options', options); + self.set('requestingFlag', false); + + self.on('routeIndex_changed', self._redrawRoute.bind(self)); + self.on('overview_path_changed', self._redrawPolyline.bind(self)); + self.waypoints.on('insert_at', self._waypoint_created.bind(self)); + self.orders = []; +}; + +utils.extend(DirectionsRenderer, BaseClass); + +DirectionsRenderer.prototype.getId = function () { + return this.__pgmId; +}; + +DirectionsRenderer.prototype._waypoint_created = function(index) { + var self = this; + var position = self.waypoints.getAt(index); + var marker = self.map.addMarker({ + 'position': position, + 'draggable': true, + 'idx': index + }); + self.orders.push(index); + marker.on('marker_drag_end', self._onWaypointMoved.bind(self, marker)); + self.waypointMarkers.push(marker); +}; + +DirectionsRenderer.prototype._onWaypointMoved = function(marker) { + var self = this; + var position = marker.getPosition(); + var index = marker.get('idx'); + self.waypoints.setAt(index, position); + + var requestingFlag = self.get('requestingFlag'); + if (requestingFlag) return; + self.set('requestingFlag', true); + + var options = self.get('options'); + var points = self.waypoints.getArray(); + var start_location = points.shift(); + var end_location = points.pop(); + + plugin.google.maps.DirectionsService.route({ + 'origin': start_location, + 'destination': end_location, + 'travelMode': options.directions.request.travelMode || 'DRIVING', + 'waypoints': points + }, function(result) { + + var stepOverlays = new BaseArrayClass(); + var route = result.routes[0]; + // options.directions.routes[routeIdx] = route; + + var overview_path = route.overview_polyline; + if (typeof overview_path === 'object' && route.overview_polyline.points) { + overview_path = route.overview_polyline.points; + } + var overview_path = encoding.decodePath(overview_path); + + if (!options.preserveViewport) { + setTimeout(function() { + self.map.animateCamera({ + 'target': route.bounds, + 'duration': 1000 + }); + }, 100); + } + // prevent the OVER_QUERY_LIMIT + setTimeout(function() { + self.set('requestingFlag', false); + }, 1000); + self.set('overview_path', overview_path); + }); +}; + +DirectionsRenderer.prototype.setRouteIndex = function(index) { + var self = this; + self.set('routeIndex', index); +}; + +DirectionsRenderer.prototype._redrawRoute = function(oldIdx, newIdx) { + var self = this; + var options = self.get('options'); + var n = options.directions.routes.length; + + if (newIdx < 0 || newIdx > n - 1) { + return; + } + var stepOverlays = new BaseArrayClass(); + var route = options.directions.routes[newIdx]; + + var overview_path = route.overview_polyline; + if (typeof overview_path === 'object' && route.overview_polyline.points) { + overview_path = route.overview_polyline.points; + } + overview_path = encoding.decodePath(overview_path); + self.set('overview_path', overview_path); + + var waypointsRef = self.waypoints; + waypointsRef.empty(); + + var idx = 0; + var lastPosition = route.legs[0].steps[0].start_location; + waypointsRef.push(lastPosition); + var n = route.legs[0].steps.length; + route.legs[0].steps.forEach(function(step) { + var pos = step.end_location; + if (spherical.computeDistanceBetween(lastPosition, pos) < 100 && idx < n) { + return; + } + lastPosition = pos; + + waypointsRef.push(pos); + }); + + if (!options.preserveViewport) { + setTimeout(function() { + self.map.animateCamera({ + 'target': route.bounds, + 'duration': 1000 + }); + }, 100); + } +}; + +DirectionsRenderer.prototype._redrawPolyline = function(marker) { + var self = this; + var polyline = self.polyline; + var overview_path = self.get('overview_path'); + polyline.setPoints(overview_path); +}; +module.exports = DirectionsRenderer; diff --git a/www/DirectionsService.js b/www/DirectionsService.js new file mode 100644 index 000000000..1e97425cb --- /dev/null +++ b/www/DirectionsService.js @@ -0,0 +1,166 @@ + +/***************************************************************************** + * DirectionsService class + *****************************************************************************/ +function _cnv_DirectionsRoute(route) { + if (route.legs) { + route.legs = route.legs.map(function(leg) { + return _cnv_DirectionsLeg(leg); + }); + } + return route; +} + +function _cnv_DirectionsLeg(leg) { + if (leg.arrival_time) { + leg.arrival_time.value = new Date(leg.arrival_time.value); + } + if (leg.departure_time) { + leg.departure_time.value = new Date(leg.departure_time.value); + } + if (leg.steps) { + leg.steps = leg.steps.map(function(step) { + return _cnv_DirectionsStep(step); + }); + } + return leg; +} + +function _cnv_DirectionsStep(step) { + if (step.steps) { + step.steps = step.steps.map(function(s) { + return _cnv_DirectionsStep(s); + }); + } + if (step.transit) { + if (step.transit.arrival_time) { + step.transit.arrival_time.value = new Date(step.transit.arrival_time.value); + } + if (step.transit.departure_time) { + step.transit.departure_time.value = new Date(step.transit.departure_time.value); + } + } + + return step; +} + +function _cnv_DirectionsRequestLocation(position) { + if (typeof position === 'string') { + position = { + 'type': 'string', + 'value': position + }; + } else if (position.lat && position.lng) { + position = { + 'type': 'location', + 'value': { + 'lat': position.lat, + 'lng': position.lng + } + }; + } else { + var place = {}; + if (position.location) { + place.location = { + 'lat': position.location.lat, + 'lng': position.location.lng + }; + } + if (position.placeId) { + place.placeId = position.placeId; + } + if (position.query) { + place.query = position.query; + } + position = { + 'type': 'place', + 'value': place + }; + } + return position; +} + +var DirectionsService = function(exec) { + function _errorHandler(err) { + console.error(err); + } + + return { + route: function(request, callback, errorCallback) { + var self = this; + + if (!request) { + return errorHandler('route needs request parameter'); + } + if (!request.destination) { + return errorHandler('route() needs request.destination parameter'); + } + if (!request.origin) { + return errorHandler('route() needs request.origin parameter'); + } + if (!request.travelMode) { + return errorHandler('route() needs request.travelMode parameter'); + } + + request.origin = _cnv_DirectionsRequestLocation(request.origin); + request.destination = _cnv_DirectionsRequestLocation(request.destination); + + if (request.drivingOptions && typeof request.drivingOptions.departureTime === 'date') { + request.drivingOptions.departureTime = request.drivingOptions.departureTime.getTime(); + } + if (request.transitOptions && typeof request.transitOptions.departureTime === 'date') { + request.transitOptions.departureTime = request.transitOptions.departureTime.getTime(); + } + if (request.transitOptions && typeof request.transitOptions.arrivalTime === 'date') { + request.transitOptions.arrivalTime = request.transitOptions.arrivalTime.getTime(); + } + if (request.waypoints) { + request.waypoints = request.waypoints.map(function(waypoint) { + if (waypoint.lat && waypoint.lng) { + waypoint = { + stopover: false, + location: { + 'type': 'location', + 'value': waypoint + } + }; + } else if (waypoint.location) { + waypoint.location = _cnv_DirectionsRequestLocation(waypoint.location); + } + return waypoint; + }); + } + + var resolver = function (resolve, reject) { + exec.call({ + _isReady: true + }, function (result) { + result = result || {}; + result.routes = result.routes.map(function(route) { + return _cnv_DirectionsRoute(route); + }); + result.request = request; + resolve(result); + }, reject, 'PluginDirectionsService', 'route', [request]); + }; + + + var errorHandler = function(result) { + if (typeof errorCallback === 'function') { + errorCallback.call(self, result); + } else { + (self.errorHandler || _errorHandler).call(self, result); + } + }; + if (typeof callback === 'function') { + resolver(callback, errorHandler); + return self; + } else { + return new Promise(resolver); + } + } + }; +}; + + +module.exports = DirectionsService; diff --git a/www/Map.js b/www/Map.js index 61cc79670..c74a2afbf 100644 --- a/www/Map.js +++ b/www/Map.js @@ -19,7 +19,9 @@ var utils = require('cordova/utils'), GroundOverlay = require('./GroundOverlay'), KmlOverlay = require('./KmlOverlay'), KmlLoader = require('./KmlLoader'), - spherical = require('cordova-plugin-googlemaps.spherical'), + DirectionsRenderer = require('./DirectionsRenderer'), + spherical = require('./spherical'), + encoding = require('./encoding'), MarkerCluster = require('./MarkerCluster'); /** @@ -534,7 +536,7 @@ Map.prototype.animateCamera = function(cameraPosition, callback) { // cameraPosition.padding = 10; // } - if (utils.isArray(target) || target.type === 'LatLngBounds') { + if (utils.isArray(target) || target.type === 'LatLngBounds' || target.southwest && target.northeast) { target = common.convertToPositionArray(target); if (target.length === 0) { // skip if no point is specified @@ -1111,6 +1113,33 @@ Map.prototype.addKmlOverlay = function(kmlOverlayOptions, callback) { }; +Map.prototype.addDirectionsRenderer = function(directionsRendererOptions, callback) { + var self = this; + directionsRendererOptions = directionsRendererOptions || {}; + + if (directionsRendererOptions.directions) { + + var resolver = function(resolve, reject) { + var renderer = new DirectionsRenderer(self, self.exec, directionsRendererOptions); + renderer.setRouteIndex(0); + resolve(renderer); + }; + + if (typeof callback === 'function') { + resolver(callback, self.errorHandler); + } else { + return new Promise(resolver); + } + } else { + + if (typeof callback === 'function') { + throw new Error('directionsRendererOptions.directions is required.'); + } else { + return Promise.reject('directionsRendererOptions.directions is required.'); + } + } +}; + //------------- // Ground overlay //------------- @@ -1239,6 +1268,9 @@ Map.prototype.addTileOverlay = function(tilelayerOptions, callback) { Map.prototype.addPolygon = function(polygonOptions, callback) { var self = this; polygonOptions.points = polygonOptions.points || []; + if (typeof polygonOptions.points === 'string') { + polygonOptions.points = encoding.decodePath(polygonOptions.points); + } var _orgs = polygonOptions.points; polygonOptions.points = common.convertToPositionArray(polygonOptions.points); polygonOptions.holes = polygonOptions.holes || []; @@ -1297,6 +1329,9 @@ Map.prototype.addPolygon = function(polygonOptions, callback) { Map.prototype.addPolyline = function(polylineOptions, callback) { var self = this; polylineOptions.points = polylineOptions.points || []; + if (typeof polylineOptions.points === 'string') { + polylineOptions.points = encoding.decodePath(polylineOptions.points); + } var _orgs = polylineOptions.points; polylineOptions.points = common.convertToPositionArray(polylineOptions.points); polylineOptions.color = common.HTMLColor2RGBA(polylineOptions.color || '#FF000080', 0.75); diff --git a/www/Polyline.js b/www/Polyline.js index 090fd1774..ce56e7c8e 100644 --- a/www/Polyline.js +++ b/www/Polyline.js @@ -1,5 +1,7 @@ + var utils = require('cordova/utils'), common = require('./Common'), + encoding = require('./encoding'), Overlay = require('./Overlay'); /***************************************************************************** @@ -83,6 +85,9 @@ utils.extend(Polyline, Overlay); Polyline.prototype.setPoints = function (points) { var self = this; + if (typeof points === 'string') { + points = encoding.decodePath(points);; + } var mvcArray = self.points; mvcArray.empty(true); diff --git a/www/plugin-loader-for-android_ios.js b/www/plugin-loader-for-android_ios.js index bb9b89b8b..07257759e 100644 --- a/www/plugin-loader-for-android_ios.js +++ b/www/plugin-loader-for-android_ios.js @@ -155,6 +155,7 @@ if (!cordova) { Geocoder: require('./Geocoder')(execCmd), LocationService: require('./LocationService')(execCmd), ElevationService: require('./ElevationService')(execCmd), + DirectionsService: require('./DirectionsService')(execCmd), geometry: { encoding: require('./encoding'), spherical: require('./spherical'), diff --git a/www/plugin-loader-for-browser.js b/www/plugin-loader-for-browser.js index a1e16b6b8..3941d8d19 100644 --- a/www/plugin-loader-for-browser.js +++ b/www/plugin-loader-for-browser.js @@ -29,6 +29,7 @@ module.exports = { environment: require('cordova-plugin-googlemaps.Environment'), Geocoder: require('cordova-plugin-googlemaps.Geocoder')(execCmd), ElevationService: require('cordova-plugin-googlemaps.ElevationService')(execCmd), + DirectionsService: require('cordova-plugin-googlemaps.DirectionsService')(execCmd), LocationService: require('cordova-plugin-googlemaps.LocationService')(execCmd), geometry: { encoding: require('cordova-plugin-googlemaps.encoding'), From 14f2e93a3c78cbf67218a4a8fc9ea7bedf4ae056 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Sat, 2 May 2020 22:16:25 -0700 Subject: [PATCH 03/50] still working on --- src/android/frameworks/pgm-custom.gradle | 4 ++-- src/android/plugin/google/maps/AsyncLoadImage.java | 10 ++++++++++ src/android/plugin/google/maps/PluginPolyline.java | 12 +++++++++--- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/android/frameworks/pgm-custom.gradle b/src/android/frameworks/pgm-custom.gradle index 0144d229d..75d9c18ef 100644 --- a/src/android/frameworks/pgm-custom.gradle +++ b/src/android/frameworks/pgm-custom.gradle @@ -39,8 +39,8 @@ android { Properties props = new Properties() def isKeyFound = 0 def useBetaSdk = 0 - props.setProperty("GOOGLE_MAPS_PLAY_SERVICES_VERSION", "16.0.0"); - props.setProperty("ANDROID_SUPPORT_V4_VERSION", "27.1.1"); + props.setProperty("GOOGLE_MAPS_PLAY_SERVICES_VERSION", "17.0.0"); + // props.setProperty("ANDROID_SUPPORT_V4_VERSION", "27.1.1"); props.setProperty("GOOGLE_MAPS_ANDROID_SDK", ""); widget.preference.each { pref -> diff --git a/src/android/plugin/google/maps/AsyncLoadImage.java b/src/android/plugin/google/maps/AsyncLoadImage.java index 16e0bb04b..1046a319b 100644 --- a/src/android/plugin/google/maps/AsyncLoadImage.java +++ b/src/android/plugin/google/maps/AsyncLoadImage.java @@ -230,6 +230,16 @@ protected AsyncLoadImageResult doInBackground(Void... params) { iconUrl = iconUrl.replaceAll("(\\/\\.\\/+)+", "/"); //Log.d(TAG, "--> iconUrl = " + iconUrl); } + if (iconUrl.startsWith("http://localhost") || + iconUrl.startsWith("http://127.0.0.1")) { +// Log.d(TAG, String.format("---->(201)iconURL = %s", iconUrl)); + if (iconUrl.contains("://")) { + iconUrl = iconUrl.replaceAll("http://.+?/", "file:///android_asset/www/"); + } else { + // Avoid WebViewLocalServer (because can not make a connection for some reason) + iconUrl = "file:///android_asset/www/".concat(iconUrl); + } + } if (iconUrl.indexOf("file://") == 0 && !iconUrl.contains("file:///android_asset/")) { diff --git a/src/android/plugin/google/maps/PluginPolyline.java b/src/android/plugin/google/maps/PluginPolyline.java index 8d1f52ca9..7c86918fb 100644 --- a/src/android/plugin/google/maps/PluginPolyline.java +++ b/src/android/plugin/google/maps/PluginPolyline.java @@ -39,15 +39,17 @@ public void create(final JSONArray args, final CallbackContext callbackContext) final String hashCode = args.getString(2); polylineHashCode = hashCode; + int pointCnt = 0; if (opts.has("points")) { JSONArray points = opts.getJSONArray("points"); List path = PluginUtil.JSONArray2LatLngList(points); - int i = 0; - for (i = 0; i < path.size(); i++) { + for (int i = 0; i < path.size(); i++) { polylineOptions.add(path.get(i)); builder.include(path.get(i)); } + pointCnt = path.size(); } + final int finalPointCnt = pointCnt; if (opts.has("color")) { color = PluginUtil.parsePluginColor(opts.getJSONArray("color")); polylineOptions.color(color); @@ -85,7 +87,11 @@ public void run() { pluginMap.objects.put(id, polyline); String boundsId = "polyline_bounds_" + hashCode; - pluginMap.objects.put(boundsId, builder.build()); + if (finalPointCnt > 0) { + pluginMap.objects.put(boundsId, builder.build()); + } else { + pluginMap.objects.put(boundsId, new LatLngBounds(new LatLng(360,360), new LatLng(360,360))); + } String propertyId = "polyline_property_" + hashCode; pluginMap.objects.put(propertyId, properties); From b0f9c23fb440e9ef7ae37388b06bf4c492e92a25 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Sat, 2 May 2020 23:35:31 -0700 Subject: [PATCH 04/50] still working on --- src/browser/PluginElevationService.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/browser/PluginElevationService.js b/src/browser/PluginElevationService.js index ae9e10450..787e138dd 100644 --- a/src/browser/PluginElevationService.js +++ b/src/browser/PluginElevationService.js @@ -98,7 +98,7 @@ module.exports = { params.samples = request.samples; params.path = []; for (var i = 0; i < request.path.length; i++) { - params.path.push(new google.maps.LatLng(request.path[i].lat, request.path[i].lng)); + params.path.push(request.path[i]); } QUEUE.push({ @@ -115,7 +115,7 @@ module.exports = { var params = {}; params.locations = []; for (var i = 0; i < request.locations.length; i++) { - params.locations.push(new google.maps.LatLng(request.locations[i].lat, request.locations[i].lng)); + params.locations.push(request.locations[i]); } QUEUE.push({ From fb024dcead322432971dadd3bf00c2a2228fc027 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Tue, 5 May 2020 23:17:49 -0700 Subject: [PATCH 05/50] still working on --- package.json | 2 +- plugin.xml | 2 +- src/browser/PluginMap.js | 62 +++++++++++++--- src/ios/GoogleMaps/PluginMap.m | 79 +++++++++++--------- src/ios/GoogleMaps/PluginMarker.m | 2 +- www/Map.js | 116 +++++++++++++++++++----------- 6 files changed, 177 insertions(+), 86 deletions(-) diff --git a/package.json b/package.json index ec65da3db..67601d4ed 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-googlemaps", - "version": "2.8.0-20200501-1158", + "version": "2.8.0-20200505-1116", "description": "Google Maps native SDK for Android and iOS, and Google Maps JavaScript API v3 for browser.", "cordova": { "id": "cordova-plugin-googlemaps", diff --git a/plugin.xml b/plugin.xml index 6ae84197a..2275a952f 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - + cordova-plugin-googlemaps diff --git a/src/browser/PluginMap.js b/src/browser/PluginMap.js index 37a4a9542..ef72ed8bf 100644 --- a/src/browser/PluginMap.js +++ b/src/browser/PluginMap.js @@ -47,7 +47,11 @@ function PluginMap(mapId, options) { var style = document.createElement('style'); style.setAttribute('type', 'text/css'); - style.innerHTML = ':host {color: black;}'; + style.innerHTML = [ + ':host {color: black;}', + 'button.gm-control-active>img {display: none;}', + 'button.gm-control-active>img:nth-child(1) {display: inline;}' + ].join("\n"); shadowRoot.appendChild(style); var mapDiv = document.createElement('div'); @@ -78,6 +82,7 @@ function PluginMap(mapId, options) { self.set('isGoogleReady', false); self.set('container', container); + self.set('_actualDiv', actualMapDiv); self.PLUGINS = {}; Object.defineProperty(self, '__pgmId', { @@ -131,6 +136,12 @@ function PluginMap(mapId, options) { mapInitOptions.zoomControl = options.controls.zoom == true; } } + + if (options.gestures) { + mapInitOptions.draggable = options.gestures.scroll; + mapInitOptions.gestureHandling = options.gestures.scroll; + mapInitOptions.disableDoubleClickZoom = !options.gestures.zoom; + } if (options.preferences) { if (options.preferences && options.preferences.gestureBounds) { @@ -144,7 +155,7 @@ function PluginMap(mapId, options) { strictBounds: false }; } - + if (options.preferences.zoom) { mapInitOptions.minZoom = options.preferences.zoom.minZoom; if (options.preferences.zoom.maxZoom) { @@ -239,7 +250,13 @@ PluginMap.prototype.setOptions = function(onSuccess, onError, args) { var map = self.get('map'), options = args[0]; - var mapInitOptions = {}; + var mapInitOptions = { + draggable: true, + gestureHandling: 'auto', + disableDoubleClickZoom: false, + heading: 0, + tilt: 0 + }; if (options) { if (options.mapType) { @@ -254,6 +271,12 @@ PluginMap.prototype.setOptions = function(onSuccess, onError, args) { mapInitOptions.zoomControl = options.controls.zoom == true; } } + if (options.gestures) { + mapInitOptions.draggable = options.gestures.scroll; + mapInitOptions.gestureHandling = options.gestures.scroll; + mapInitOptions.disableDoubleClickZoom = !options.gestures.zoom; + } + if (options.preferences) { if (options.preferences.zoom) { mapInitOptions.minZoom = Math.max(options.preferences.zoom || 2, 2); @@ -332,16 +355,37 @@ PluginMap.prototype.setDiv = function(onSuccess, onError, args) { container = self.get('container'); if (args.length === 0) { - if (container && container.parentNode) { - container.parentNode.removeAttribute('__pluginMapId'); + var actualMapDiv = self.get('_actualDiv'); + if (actualMapDiv && actualMapDiv.parentNode) { + actualMapDiv.removeAttribute('__pluginMapId'); container.parentNode.removeChild(container); } } else { + + // var domId = args[0]; + // var mapDiv = document.querySelector('[__pluginDomId=\'' + domId + '\']'); + // mapDiv.style.position = 'relative'; + // mapDiv.insertBefore(container, mapDiv.firstElementChild); + // mapDiv.setAttribute('__pluginMapId', self.__pgmId); var domId = args[0]; - var mapDiv = document.querySelector('[__pluginDomId=\'' + domId + '\']'); - mapDiv.style.position = 'relative'; - mapDiv.insertBefore(container, mapDiv.firstElementChild); - mapDiv.setAttribute('__pluginMapId', self.__pgmId); + var actualMapDiv = document.querySelector('[__pluginDomId=\'' + domId + '\']'); + actualMapDiv.setAttribute('__pluginMapId', self.__pgmId); + actualMapDiv.style.position = 'relative'; + + var shadowRoot = actualMapDiv.attachShadow({ mode: 'open' }); + + var style = document.createElement('style'); + style.setAttribute('type', 'text/css'); + style.innerHTML = [ + ':host {color: black;}', + 'button.gm-control-active>img {display: none;}', + 'button.gm-control-active>img:nth-child(1) {display: inline;}' + ].join("\n"); + shadowRoot.appendChild(style); + shadowRoot.appendChild(container); + + + // mapDiv.insertBefore(container, mapDiv.firstElementChild); } google.maps.event.trigger(map, 'resize'); diff --git a/src/ios/GoogleMaps/PluginMap.m b/src/ios/GoogleMaps/PluginMap.m index 4bb2b3829..9ec6aaa40 100644 --- a/src/ios/GoogleMaps/PluginMap.m +++ b/src/ios/GoogleMaps/PluginMap.m @@ -276,7 +276,7 @@ - (void)clear:(CDVInvokedUrlCommand *)command { [self.mapCtrl.plugins removeAllObjects]; - if (command != nil) { + if (command != (id)[NSNull null]) { CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; @@ -589,7 +589,7 @@ -(void)_changeCameraPosition: (NSString*)action requestMethod:(NSString *)reques if (self.isRemoved) { return; } - if (cameraBounds != nil){ + if (cameraBounds != (id)[NSNull null]){ GMSCameraPosition *cameraPosition2 = [GMSCameraPosition cameraWithLatitude:self.mapCtrl.map.camera.target.latitude longitude:self.mapCtrl.map.camera.target.longitude @@ -614,7 +614,7 @@ -(void)_changeCameraPosition: (NSString*)action requestMethod:(NSString *)reques if ([action isEqual: @"moveCamera"]) { [self.mapCtrl.map setCamera:cameraPosition]; - if (cameraBounds != nil){ + if (cameraBounds != (id)[NSNull null]){ double delayInSeconds = 0.5; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ @@ -661,7 +661,7 @@ - (void)setActiveMarkerId:(CDVInvokedUrlCommand*)command { NSString *markerId = [command.arguments objectAtIndex:0]; GMSMarker *marker = [self.mapCtrl.objects objectForKey:markerId]; - if (marker != nil) { + if (marker != (id)[NSNull null]) { self.mapCtrl.map.selectedMarker = marker; self.mapCtrl.activeMarker = marker; } @@ -749,13 +749,13 @@ - (void)fromPointToLatLng:(CDVInvokedUrlCommand*)command { - (void)_setOptions:(NSDictionary *)initOptions requestMethod:(NSString *)requestMethod command:(CDVInvokedUrlCommand *)command { [[NSOperationQueue mainQueue] addOperationWithBlock:^{ - + NSLog(@"options=%@", initOptions); BOOL isEnabled = NO; //controls NSDictionary *controls = [initOptions objectForKey:@"controls"]; if (controls) { //compass - if ([controls valueForKey:@"compass"] != nil) { + if ([controls valueForKey:@"compass"] != (id)[NSNull null]) { isEnabled = [[controls valueForKey:@"compass"] boolValue]; if (isEnabled == true) { self.mapCtrl.map.settings.compassButton = YES; @@ -764,7 +764,7 @@ - (void)_setOptions:(NSDictionary *)initOptions requestMethod:(NSString *)reques } } //myLocationButton - if ([controls valueForKey:@"myLocationButton"] != nil) { + if ([controls valueForKey:@"myLocationButton"] != (id)[NSNull null]) { isEnabled = [[controls valueForKey:@"myLocationButton"] boolValue]; if (isEnabled == true) { self.mapCtrl.map.settings.myLocationButton = YES; @@ -773,7 +773,7 @@ - (void)_setOptions:(NSDictionary *)initOptions requestMethod:(NSString *)reques } } //myLocation - if ([controls valueForKey:@"myLocation"] != nil) { + if ([controls valueForKey:@"myLocation"] != (id)[NSNull null]) { isEnabled = [[controls valueForKey:@"myLocation"] boolValue]; if (isEnabled == true) { self.mapCtrl.map.myLocationEnabled = YES; @@ -782,7 +782,7 @@ - (void)_setOptions:(NSDictionary *)initOptions requestMethod:(NSString *)reques } } //indoorPicker - if ([controls valueForKey:@"indoorPicker"] != nil) { + if ([controls valueForKey:@"indoorPicker"] != (id)[NSNull null]) { isEnabled = [[controls valueForKey:@"indoorPicker"] boolValue]; if (isEnabled == true) { self.mapCtrl.map.settings.indoorPicker = YES; @@ -798,22 +798,22 @@ - (void)_setOptions:(NSDictionary *)initOptions requestMethod:(NSString *)reques NSDictionary *gestures = [initOptions objectForKey:@"gestures"]; if (gestures) { //rotate - if ([gestures valueForKey:@"rotate"] != nil) { + if ([gestures valueForKey:@"rotate"] != (id)[NSNull null]) { isEnabled = [[gestures valueForKey:@"rotate"] boolValue]; self.mapCtrl.map.settings.rotateGestures = isEnabled; } //scroll - if ([gestures valueForKey:@"scroll"] != nil) { + if ([gestures valueForKey:@"scroll"] != (id)[NSNull null]) { isEnabled = [[gestures valueForKey:@"scroll"] boolValue]; self.mapCtrl.map.settings.scrollGestures = isEnabled; } //tilt - if ([gestures valueForKey:@"tilt"] != nil) { + if ([gestures valueForKey:@"tilt"] != (id)[NSNull null]) { isEnabled = [[gestures valueForKey:@"tilt"] boolValue]; self.mapCtrl.map.settings.tiltGestures = isEnabled; } //zoom - if ([gestures valueForKey:@"zoom"] != nil) { + if ([gestures valueForKey:@"zoom"] != (id)[NSNull null]) { isEnabled = [[gestures valueForKey:@"zoom"] boolValue]; self.mapCtrl.map.settings.zoomGestures = isEnabled; } @@ -822,19 +822,19 @@ - (void)_setOptions:(NSDictionary *)initOptions requestMethod:(NSString *)reques NSDictionary *preferences = [initOptions objectForKey:@"preferences"]; if (preferences) { //padding - if ([preferences valueForKey:@"padding"] != nil) { + if ([preferences valueForKey:@"padding"] != (id)[NSNull null]) { NSDictionary *padding = [preferences valueForKey:@"padding"]; UIEdgeInsets current = self.mapCtrl.map.padding; - if ([padding objectForKey:@"left"] != nil) { + if ([padding objectForKey:@"left"] != (id)[NSNull null]) { current.left = [[padding objectForKey:@"left"] floatValue]; } - if ([padding objectForKey:@"top"] != nil) { + if ([padding objectForKey:@"top"] != (id)[NSNull null]) { current.top = [[padding objectForKey:@"top"] floatValue]; } - if ([padding objectForKey:@"bottom"] != nil) { + if ([padding objectForKey:@"bottom"] != (id)[NSNull null]) { current.bottom = [[padding objectForKey:@"bottom"] floatValue]; } - if ([padding objectForKey:@"right"] != nil) { + if ([padding objectForKey:@"right"] != (id)[NSNull null]) { current.right = [[padding objectForKey:@"right"] floatValue]; } @@ -842,14 +842,14 @@ - (void)_setOptions:(NSDictionary *)initOptions requestMethod:(NSString *)reques [self.mapCtrl.map setPadding:newPadding]; } //zoom - if ([preferences valueForKey:@"zoom"] != nil) { + if ([preferences valueForKey:@"zoom"] != (id)[NSNull null]) { NSDictionary *zoom = [preferences valueForKey:@"zoom"]; float minZoom = self.mapCtrl.map.minZoom; float maxZoom = self.mapCtrl.map.maxZoom; - if ([zoom objectForKey:@"minZoom"] != nil) { + if ([zoom objectForKey:@"minZoom"] != (id)[NSNull null]) { minZoom = [[zoom objectForKey:@"minZoom"] doubleValue]; } - if ([zoom objectForKey:@"maxZoom"] != nil) { + if ([zoom objectForKey:@"maxZoom"] != (id)[NSNull null]) { maxZoom = [[zoom objectForKey:@"maxZoom"] doubleValue]; } @@ -857,9 +857,11 @@ - (void)_setOptions:(NSDictionary *)initOptions requestMethod:(NSString *)reques } // gestureBounds - if ([preferences valueForKey:@"gestureBounds"] != nil) { + if ([preferences valueForKey:@"gestureBounds"]) { NSDictionary *restriction = [preferences objectForKey:@"gestureBounds"]; [self _setCameraRestriction:restriction]; + } else { + [self _setCameraRestriction:nil]; } } @@ -868,7 +870,7 @@ - (void)_setOptions:(NSDictionary *)initOptions requestMethod:(NSString *)reques if (styles) { NSError *error; GMSMapStyle *mapStyle = [GMSMapStyle styleWithJSONString:styles error:&error]; - if (mapStyle != nil) { + if (mapStyle != (id)[NSNull null]) { self.mapCtrl.map.mapStyle = mapStyle; self.mapCtrl.map.mapType = kGMSTypeNormal; } else { @@ -919,19 +921,28 @@ - (void)_setOptions:(NSDictionary *)initOptions requestMethod:(NSString *)reques }; - (void)_setCameraRestriction:(NSDictionary *)params { + + if (params == (id)[NSNull null]) { + self.mapCtrl.map.cameraTargetBounds = nil; + double minZoom = 0; + double maxZoom = 23; + [self.mapCtrl.map setMinZoom:minZoom maxZoom:maxZoom]; + + } else { - GMSMutablePath *path = [GMSMutablePath path]; - [path - addCoordinate: CLLocationCoordinate2DMake([[params objectForKey:@"south"] doubleValue], [[params objectForKey:@"west"] doubleValue])]; - [path - addCoordinate: CLLocationCoordinate2DMake([[params objectForKey:@"north"] doubleValue], [[params objectForKey:@"east"] doubleValue])]; + GMSMutablePath *path = [GMSMutablePath path]; + [path + addCoordinate: CLLocationCoordinate2DMake([[params objectForKey:@"south"] doubleValue], [[params objectForKey:@"west"] doubleValue])]; + [path + addCoordinate: CLLocationCoordinate2DMake([[params objectForKey:@"north"] doubleValue], [[params objectForKey:@"east"] doubleValue])]; - GMSCoordinateBounds *bounds = [[GMSCoordinateBounds alloc] initWithPath:path]; - self.mapCtrl.map.cameraTargetBounds = bounds; + GMSCoordinateBounds *bounds = [[GMSCoordinateBounds alloc] initWithPath:path]; + self.mapCtrl.map.cameraTargetBounds = bounds; - double minZoom = [[params objectForKey:@"minZoom"] doubleValue]; - double maxZoom = [[params objectForKey:@"maxZoom"] doubleValue]; - [self.mapCtrl.map setMinZoom:minZoom maxZoom:maxZoom]; + double minZoom = [[params objectForKey:@"minZoom"] doubleValue]; + double maxZoom = [[params objectForKey:@"maxZoom"] doubleValue]; + [self.mapCtrl.map setMinZoom:minZoom maxZoom:maxZoom]; + } } @@ -966,7 +977,7 @@ - (void)setPadding:(CDVInvokedUrlCommand *)command { - (void)getFocusedBuilding:(CDVInvokedUrlCommand*)command { [[NSOperationQueue mainQueue] addOperationWithBlock:^{ GMSIndoorBuilding *building = self.mapCtrl.map.indoorDisplay.activeBuilding; - if (building != nil || [building.levels count] == 0) { + if (building != (id)[NSNull null] || [building.levels count] == 0) { CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; return; diff --git a/src/ios/GoogleMaps/PluginMarker.m b/src/ios/GoogleMaps/PluginMarker.m index f06e4c659..324393afc 100644 --- a/src/ios/GoogleMaps/PluginMarker.m +++ b/src/ios/GoogleMaps/PluginMarker.m @@ -1463,11 +1463,11 @@ - (void)downloadImageWithURL:(NSURL *)url completionBlock:(void (^)(BOOL succeed if (![fileManager fileExistsAtPath:iconPath]) { NSLog(@"(error)There is no file at '%@'.", iconPath); completionBlock(NO, nil); - return; } else { UIImage *image = [UIImage imageNamed:iconPath]; completionBlock(YES, image); } + return; } NSURLRequest *req = [NSURLRequest requestWithURL:url diff --git a/www/Map.js b/www/Map.js index c74a2afbf..c47b748ae 100644 --- a/www/Map.js +++ b/www/Map.js @@ -253,14 +253,27 @@ Map.prototype.getMap = function(meta, div, options) { div.insertBefore(self._layers.info, div.firstChild); + var background = undefined; + var bg; while (div.parentNode) { - div.style.backgroundColor = 'rgba(0,0,0,0) !important'; + bg = common.getStyle(div, '--background'); + if (!bg) { + bg = common.getStyle(div, 'background-color'); + } + bg = (bg || "").trim(); + background = background || bg; + // console.log(`background = ${background}`); + // div.style.backgroundColor = 'rgba(0,0,0,0) !important'; // Add _gmaps_cdv_ class common.attachTransparentClass(div); div = div.parentNode; } + + if (background) { + plugin.google.maps.environment.setBackgroundColor(background); + } } cordova.fireDocumentEvent('plugin_touch', { force: true @@ -295,51 +308,60 @@ Map.prototype.getMap = function(meta, div, options) { Map.prototype.setOptions = function(options) { options = options || {}; + var self = this; if (options.controls) { - var myLocation = this.get('myLocation'); - if ('myLocation' in options.controls) { - myLocation = options.controls.myLocation === true; - } - var myLocationButton = this.get('myLocationButton'); - if ('myLocationButton' in options.controls) { - myLocationButton = options.controls.myLocationButton === true; - } - this.set('myLocation', myLocation); - this.set('myLocationButton', myLocationButton); - if (myLocation === true || myLocation === false) { - options.controls.myLocation = myLocation; - } - if (myLocationButton === true || myLocationButton === false) { - options.controls.myLocationButton = myLocationButton; - } - } - if (options.camera) { - if (options.camera.latLng) { - options.camera.target = options.camera.latLng; - delete options.camera.latLng; - } - this.set('camera', options.camera); - if (options.camera.target) { - this.set('camera_target', options.camera.target); - } - if (options.camera.bearing) { - this.set('camera_bearing', options.camera.bearing); - } - if (options.camera.zoom) { - this.set('camera_zoom', options.camera.zoom); - } - if (options.camera.tilt) { - this.set('camera_tilt', options.camera.tilt); - } + this.set('myLocation', options.controls.myLocation === true); + this.set('myLocationButton', options.controls.myLocationButton === true); } if (options.preferences && options.preferences.gestureBounds) { - if (utils.isArray(options.preferences.gestureBounds) || - options.preferences.gestureBounds.type === 'LatLngBounds') { - options.preferences.gestureBounds = common.convertToPositionArray(options.preferences.gestureBounds); + + var bounds = new LatLngBounds(); + if (utils.isArray(options.preferences.gestureBounds)) { + options.preferences.gestureBounds.forEach(function(ele) { + if (ele.lat && ele.lng) { + bounds.extend(ele); + } + }); + } else if (options.preferences.gestureBounds.type === 'LatLngBounds' || + options.preferences.gestureBounds.northeast && options.preferences.gestureBounds.southwest) { + bounds.extend(options.preferences.gestureBounds.southwest); + bounds.extend(options.preferences.gestureBounds.northeast); + } + + if (!bounds.southwest || !bounds.northeast) { + console.warn('(getMap) options.preferences.gestureBounds is invalid.'); + delete options.preferences.gestureBounds; + } else { + var minZoom = !div ? 0 : spherical.computeBoundsZoom(bounds, div.offsetWidth, div.offsetHeight, 256); + var maxZoom = 23; + var prefMinZoom = 0; + var prefMaxZoom = 23; + if (options.preferences.zoom) { + if (options.preferences.zoom.minZoom) { + minZoom = options.preferences.zoom.minZoom; + prefMinZoom = minZoom; + } + if (options.preferences.zoom.maxZoom) { + maxZoom = options.preferences.zoom.maxZoom; + maxZoom = minZoom; + } + } + options.preferences.gestureBounds = { + 'south': bounds.southwest.lat, + 'west': bounds.southwest.lng, + 'north': bounds.northeast.lat, + 'east': bounds.northeast.lng, + 'prefMinZoom': prefMinZoom, + 'prefMaxZoom': prefMaxZoom, + 'minZoom': minZoom, + 'maxZoom': maxZoom + }; + self.set('restriction', options.preferences.gestureBounds); } } + if (utils.isArray(options.styles)) { options.styles = JSON.stringify(options.styles); } @@ -894,14 +916,28 @@ Map.prototype.setDiv = function(div) { } var elemId = common.getPluginDomId(div); args.push(elemId); + + var background = undefined; + var bg; while (div.parentNode) { - div.style.backgroundColor = 'rgba(0,0,0,0)'; + bg = common.getStyle(div, '--background'); + if (!bg) { + bg = common.getStyle(div, 'background-color'); + } + bg = (bg || "").trim(); + background = background || bg; + // console.log(`background = ${background}`); + // div.style.backgroundColor = 'rgba(0,0,0,0) !important'; // Add _gmaps_cdv_ class common.attachTransparentClass(div); div = div.parentNode; } + + if (background) { + plugin.google.maps.environment.setBackgroundColor(background); + } } self.exec.call(self, function() { cordova.fireDocumentEvent('plugin_touch', { From 017f0886a24b362ae2557a2c24bbf3cf52ff4b93 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Wed, 6 May 2020 00:23:43 -0700 Subject: [PATCH 06/50] still working on --- www/Map.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/www/Map.js b/www/Map.js index c47b748ae..1aa15e598 100644 --- a/www/Map.js +++ b/www/Map.js @@ -1,5 +1,6 @@ + var utils = require('cordova/utils'), cordova_exec = require('cordova/exec'), common = require('./Common'), @@ -309,11 +310,22 @@ Map.prototype.setOptions = function(options) { options = options || {}; var self = this; + var div = self.get('div'); if (options.controls) { this.set('myLocation', options.controls.myLocation === true); this.set('myLocationButton', options.controls.myLocationButton === true); } + if (options.camera && utils.isArray(options.camera.target)) { + var cameraBounds = new LatLngBounds(); + options.camera.target.forEach(function(ele) { + if (ele.lat && ele.lng) { + cameraBounds.extend(ele); + } + }); + options.camera.target = cameraBounds.getCenter(); + options.camera.zoom = spherical.computeBoundsZoom(cameraBounds, div.offsetWidth, div.offsetHeight, 256); + } if (options.preferences && options.preferences.gestureBounds) { var bounds = new LatLngBounds(); From de34efa4fd88e79ea5c37f75fa9786db9ede3fb6 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Wed, 6 May 2020 22:22:08 -0700 Subject: [PATCH 07/50] Bug fix: #fff does not become white --- www/Common.js | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/www/Common.js b/www/Common.js index 61d945eb3..4788a5d59 100644 --- a/www/Common.js +++ b/www/Common.js @@ -45,11 +45,14 @@ function HTMLColor2RGBA(colorValue, defaultOpacity) { } if (colorStr.match(/^#([0-9A-F]){3}$/i)) { matches = colorStr.match(/([0-9A-F])/ig); + var r = parseInt(matches[0], 16); + var g = parseInt(matches[1], 16); + var b = parseInt(matches[2], 16); return [ - parseInt(matches[0], 16), - parseInt(matches[1], 16), - parseInt(matches[2], 16), + (r << 4) + r, + (g << 4) + g, + (b << 4) + b, alpha ]; } @@ -59,10 +62,14 @@ function HTMLColor2RGBA(colorValue, defaultOpacity) { alpha = parseInt(alpha + alpha, 16); matches = colorStr.match(/([0-9A-F])/ig); + var r = parseInt(matches[0], 16); + var g = parseInt(matches[1], 16); + var b = parseInt(matches[2], 16); + return [ - parseInt(matches[0], 16), - parseInt(matches[1], 16), - parseInt(matches[2], 16), + (r << 4) + r, + (g << 4) + g, + (b << 4) + b, alpha ]; } From 202c3dccc6a22ab09b28d54a2782f111ecafc310 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Wed, 6 May 2020 22:48:46 -0700 Subject: [PATCH 08/50] Map.setOptions() return a promise --- package.json | 2 +- plugin.xml | 2 +- www/Map.js | 65 ++++++++++++++++++++++++++++++++++++---------------- 3 files changed, 47 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index 67601d4ed..97e94b44d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-googlemaps", - "version": "2.8.0-20200505-1116", + "version": "2.8.0-20200506-2248", "description": "Google Maps native SDK for Android and iOS, and Google Maps JavaScript API v3 for browser.", "cordova": { "id": "cordova-plugin-googlemaps", diff --git a/plugin.xml b/plugin.xml index 2275a952f..dde59045d 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - + cordova-plugin-googlemaps diff --git a/www/Map.js b/www/Map.js index 1aa15e598..65c9b884a 100644 --- a/www/Map.js +++ b/www/Map.js @@ -316,16 +316,39 @@ Map.prototype.setOptions = function(options) { this.set('myLocationButton', options.controls.myLocationButton === true); } - if (options.camera && utils.isArray(options.camera.target)) { - var cameraBounds = new LatLngBounds(); - options.camera.target.forEach(function(ele) { - if (ele.lat && ele.lng) { - cameraBounds.extend(ele); - } - }); - options.camera.target = cameraBounds.getCenter(); - options.camera.zoom = spherical.computeBoundsZoom(cameraBounds, div.offsetWidth, div.offsetHeight, 256); + if (options && options.camera) { + this.set('camera', options.camera); + if (options.camera.target) { + this.set('camera_target', options.camera.target); + } + if (options.camera.bearing) { + this.set('camera_bearing', options.camera.bearing); + } + if (options.camera.zoom) { + this.set('camera_zoom', options.camera.zoom); + } + if (options.camera.tilt) { + this.set('camera_tilt', options.camera.tilt); + } } + + // if (options && options.camera) { + // if (utils.isArray(options.camera.target)) { + // var bounds = new LatLngBounds(); + // options.camera.target.forEach(function(latlng) { + // bounds.extend(latlng); + // }); + // options.camera.zoom = spherical.computeBoundsZoom(bounds, div.offsetWidth, div.offsetHeight, 256); + // console.log(options.camera.zoom, bounds); + // options.camera.target = bounds.getCenter(); + // } else if ('southwest' in options.camera.target && 'northeast' in options.camera.target) { + // bounds.extend(options.camera.target.southwest); + // bounds.extend(options.camera.target.northeast); + // options.camera.zoom = spherical.computeBoundsZoom(bounds, div.offsetWidth, div.offsetHeight, 256); + // options.camera.target = bounds.getCenter(); + // } + // } + // console.log(options); if (options.preferences && options.preferences.gestureBounds) { var bounds = new LatLngBounds(); @@ -341,7 +364,7 @@ Map.prototype.setOptions = function(options) { bounds.extend(options.preferences.gestureBounds.northeast); } - if (!bounds.southwest || !bounds.northeast) { + if (!('southwest' in bounds) || !('northeast' in bounds)) { console.warn('(getMap) options.preferences.gestureBounds is invalid.'); delete options.preferences.gestureBounds; } else { @@ -918,7 +941,7 @@ Map.prototype.setDiv = function(div) { self.set('div', div); if (cordova.platform === 'browser') { - return; + return Promise.resolve(); } @@ -951,16 +974,18 @@ Map.prototype.setDiv = function(div) { plugin.google.maps.environment.setBackgroundColor(background); } } - self.exec.call(self, function() { - cordova.fireDocumentEvent('plugin_touch', { - force: true, - action: 'setDiv' + return (new Promise(function(resolve) { + self.exec.call(self, function() { + cordova.fireDocumentEvent('plugin_touch', { + force: true, + action: 'setDiv' + }); + self.refreshLayout(); + resolve(); + }, self.errorHandler, self.__pgmId, 'setDiv', args, { + sync: true }); - self.refreshLayout(); - }, self.errorHandler, self.__pgmId, 'setDiv', args, { - sync: true - }); - return self; + })); }; /** From ba4392107e526934d15f1079a76f79e045244261 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Wed, 6 May 2020 23:42:15 -0700 Subject: [PATCH 09/50] still working on --- package.json | 2 +- plugin.xml | 2 +- www/Map.js | 28 +++++++++++++++++++++++----- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 97e94b44d..873aa36de 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-googlemaps", - "version": "2.8.0-20200506-2248", + "version": "2.8.0-20200506-2341", "description": "Google Maps native SDK for Android and iOS, and Google Maps JavaScript API v3 for browser.", "cordova": { "id": "cordova-plugin-googlemaps", diff --git a/plugin.xml b/plugin.xml index dde59045d..f6c5a3741 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - + cordova-plugin-googlemaps diff --git a/www/Map.js b/www/Map.js index 65c9b884a..f205f24f3 100644 --- a/www/Map.js +++ b/www/Map.js @@ -82,11 +82,15 @@ utils.extend(Map, Overlay); Map.prototype.refreshLayout = function() { // Webkit redraw mandatory // http://stackoverflow.com/a/3485654/697856 - document.body.style.display = 'inline-block'; - document.body.offsetHeight; - document.body.style.display = ''; + // document.body.style.display = 'inline-block'; + // document.body.offsetHeight; + // document.body.style.display = ''; + document.body.style.transform = 'rotateZ(0deg)'; + var self = this; - this.exec.call(this, null, null, this.__pgmId, 'resizeMap', []); + return (new Promise(function(resolve) { + self.exec.call(self, resolve, resolve, self.__pgmId, 'resizeMap', []); + })); }; Map.prototype.getMap = function(meta, div, options) { @@ -981,7 +985,21 @@ Map.prototype.setDiv = function(div) { action: 'setDiv' }); self.refreshLayout(); - resolve(); + + var waitCnt = 0; + var waitCameraSync = function() { + if (!self.getVisibleRegion() && (waitCnt++ < 10)) { + setTimeout(function() { + common.nextTick(waitCameraSync); + }, 100); + return; + } + resolve(); + }; + setTimeout(function() { + common.nextTick(waitCameraSync); + }, 100); + }, self.errorHandler, self.__pgmId, 'setDiv', args, { sync: true }); From 47fecab565f10ecd32a773003c6a0dfc07cd228e Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Thu, 7 May 2020 23:17:58 -0700 Subject: [PATCH 10/50] - fix: (Android) mapOptions.camera.padding does not work on map.setOptions() - change: (browser) put mapDiv into a shadow DOM - change: (Android / iOS / Browser) info layer put into a shadow layer --- package.json | 2 +- plugin.xml | 2 +- src/android/plugin/google/maps/PluginMap.java | 2 +- src/browser/PluginMap.js | 76 +++++------ www/Map.js | 121 +++++++----------- 5 files changed, 82 insertions(+), 121 deletions(-) diff --git a/package.json b/package.json index 873aa36de..4f2939947 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-googlemaps", - "version": "2.8.0-20200506-2341", + "version": "2.8.0-20200507-2315", "description": "Google Maps native SDK for Android and iOS, and Google Maps JavaScript API v3 for browser.", "cordova": { "id": "cordova-plugin-googlemaps", diff --git a/plugin.xml b/plugin.xml index f6c5a3741..7bf2e5bb7 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - + cordova-plugin-googlemaps diff --git a/src/android/plugin/google/maps/PluginMap.java b/src/android/plugin/google/maps/PluginMap.java index 4ee105da5..086e7bd9a 100644 --- a/src/android/plugin/google/maps/PluginMap.java +++ b/src/android/plugin/google/maps/PluginMap.java @@ -1280,7 +1280,7 @@ public void run() { e.printStackTrace(); } if (results.cameraBounds != null) { - fitBounds(results.cameraBounds, (int)(results.cameraPadding / density)); + fitBounds(results.cameraBounds, (int)(results.cameraPadding * density)); } } diff --git a/src/browser/PluginMap.js b/src/browser/PluginMap.js index ef72ed8bf..2dcfd5c02 100644 --- a/src/browser/PluginMap.js +++ b/src/browser/PluginMap.js @@ -43,7 +43,20 @@ function PluginMap(mapId, options) { var self = this; BaseClass.apply(this); var actualMapDiv = document.querySelector('[__pluginMapId=\'' + mapId + '\']'); - var shadowRoot = actualMapDiv.attachShadow({mode: 'open'}); + + var container = document.createElement('div'); + container.style.userSelect='none'; + container.style['-webkit-user-select']='none'; + container.style['-moz-user-select']='none'; + container.style['-ms-user-select']='none'; + container.style.position = 'absolute'; + container.style.top = 0; + container.style.bottom = 0; + container.style.right = 0; + container.style.left = 0; + actualMapDiv.appendChild(container); + + var shadowRoot = container.attachShadow({mode: 'open'}); var style = document.createElement('style'); style.setAttribute('type', 'text/css'); @@ -67,22 +80,14 @@ function PluginMap(mapId, options) { mapDiv.style.backgroundColor = 'rgb(229, 227, 223)'; - var container = document.createElement('div'); - container.style.userSelect='none'; - container.style['-webkit-user-select']='none'; - container.style['-moz-user-select']='none'; - container.style['-ms-user-select']='none'; - container.style.position = 'absolute'; - container.style.top = 0; - container.style.bottom = 0; - container.style.right = 0; - container.style.left = 0; - mapDiv.insertBefore(container, mapDiv.firstElementChild); + + // mapDiv.insertBefore(container, mapDiv.firstElementChild); + // shadowRoot.appendChild(container); self.set('isGoogleReady', false); self.set('container', container); - self.set('_actualDiv', actualMapDiv); + // self.set('shadowRoot', shadowRoot); self.PLUGINS = {}; Object.defineProperty(self, '__pgmId', { @@ -165,7 +170,7 @@ function PluginMap(mapId, options) { } } - var map = new google.maps.Map(container, mapInitOptions); + var map = new google.maps.Map(mapDiv, mapInitOptions); map.mapTypes = mapTypeReg; self.set('map', map); @@ -353,43 +358,28 @@ PluginMap.prototype.setDiv = function(onSuccess, onError, args) { var self = this, map = self.get('map'), container = self.get('container'); + // shadowRoot = self.get('shadowRoot'); if (args.length === 0) { - var actualMapDiv = self.get('_actualDiv'); - if (actualMapDiv && actualMapDiv.parentNode) { - actualMapDiv.removeAttribute('__pluginMapId'); + if (container.parentNode) { container.parentNode.removeChild(container); } + onSuccess(); } else { - // var domId = args[0]; - // var mapDiv = document.querySelector('[__pluginDomId=\'' + domId + '\']'); - // mapDiv.style.position = 'relative'; - // mapDiv.insertBefore(container, mapDiv.firstElementChild); - // mapDiv.setAttribute('__pluginMapId', self.__pgmId); - var domId = args[0]; - var actualMapDiv = document.querySelector('[__pluginDomId=\'' + domId + '\']'); - actualMapDiv.setAttribute('__pluginMapId', self.__pgmId); - actualMapDiv.style.position = 'relative'; - - var shadowRoot = actualMapDiv.attachShadow({ mode: 'open' }); - - var style = document.createElement('style'); - style.setAttribute('type', 'text/css'); - style.innerHTML = [ - ':host {color: black;}', - 'button.gm-control-active>img {display: none;}', - 'button.gm-control-active>img:nth-child(1) {display: inline;}' - ].join("\n"); - shadowRoot.appendChild(style); - shadowRoot.appendChild(container); - - - // mapDiv.insertBefore(container, mapDiv.firstElementChild); + if (!container.parentNode) { + var domId = args[0]; + var actualMapDiv = document.querySelector('[__pluginDomId=\'' + domId + '\']'); + actualMapDiv.setAttribute('__pluginMapId', self.__pgmId); + actualMapDiv.style.position = 'relative'; + actualMapDiv.appendChild(container); + } + + setTimeout(function() { + onSuccess(); + }, 1000); } - google.maps.event.trigger(map, 'resize'); - onSuccess(); }; PluginMap.prototype.resizeMap = function(onSuccess) { var self = this; diff --git a/www/Map.js b/www/Map.js index f205f24f3..80dcbadf1 100644 --- a/www/Map.js +++ b/www/Map.js @@ -1,6 +1,5 @@ - var utils = require('cordova/utils'), cordova_exec = require('cordova/exec'), common = require('./Common'), @@ -53,9 +52,22 @@ var Map = function(__pgmId, _exec) { infoWindowLayer.style.overflow = 'visible'; infoWindowLayer.style['z-index'] = 1; + + var shadowInfo = infoWindowLayer.attachShadow({mode: 'open'}); + + var style = document.createElement('style'); + style.setAttribute('type', 'text/css'); + style.innerHTML = [ + ':host {color: black;}', + 'button.gm-control-active>img {display: none;}', + 'button.gm-control-active>img:nth-child(1) {display: inline;}' + ].join("\n"); + shadowInfo.appendChild(style); + Object.defineProperty(self, '_layers', { value: { - info: infoWindowLayer + info: shadowInfo, + _info: infoWindowLayer }, enumerable: false, writable: false @@ -82,15 +94,11 @@ utils.extend(Map, Overlay); Map.prototype.refreshLayout = function() { // Webkit redraw mandatory // http://stackoverflow.com/a/3485654/697856 - // document.body.style.display = 'inline-block'; - // document.body.offsetHeight; - // document.body.style.display = ''; - document.body.style.transform = 'rotateZ(0deg)'; - var self = this; + document.body.style.display = 'inline-block'; + document.body.offsetHeight; + document.body.style.display = ''; - return (new Promise(function(resolve) { - self.exec.call(self, resolve, resolve, self.__pgmId, 'resizeMap', []); - })); + this.exec.call(this, null, null, this.__pgmId, 'resizeMap', []); }; Map.prototype.getMap = function(meta, div, options) { @@ -241,9 +249,9 @@ Map.prototype.getMap = function(meta, div, options) { if (common.isDom(div)) { // Insert the infoWindow layer - if (self._layers.info.parentNode) { + if (self._layers._info.parentNode) { try { - self._layers.info.parentNode.removeChild(self._layers.info.parentNode); + self._layers._info.parentNode.removeChild(self._layers._info.parentNode); } catch (e) { // ignore } @@ -255,7 +263,7 @@ Map.prototype.getMap = function(meta, div, options) { div.children[i].style.position = 'relative'; } } - div.insertBefore(self._layers.info, div.firstChild); + div.insertBefore(self._layers._info, div.firstChild); var background = undefined; @@ -277,6 +285,7 @@ Map.prototype.getMap = function(meta, div, options) { } if (background) { + background = common.HTMLColor2RGBA(background); plugin.google.maps.environment.setBackgroundColor(background); } } @@ -320,39 +329,16 @@ Map.prototype.setOptions = function(options) { this.set('myLocationButton', options.controls.myLocationButton === true); } - if (options && options.camera) { - this.set('camera', options.camera); - if (options.camera.target) { - this.set('camera_target', options.camera.target); - } - if (options.camera.bearing) { - this.set('camera_bearing', options.camera.bearing); - } - if (options.camera.zoom) { - this.set('camera_zoom', options.camera.zoom); - } - if (options.camera.tilt) { - this.set('camera_tilt', options.camera.tilt); - } + if (options.camera && utils.isArray(options.camera.target)) { + var cameraBounds = new LatLngBounds(); + options.camera.target.forEach(function(ele) { + if (ele.lat && ele.lng) { + cameraBounds.extend(ele); + } + }); + options.camera.target = cameraBounds.getCenter(); + options.camera.zoom = spherical.computeBoundsZoom(cameraBounds, div.offsetWidth, div.offsetHeight, 256); } - - // if (options && options.camera) { - // if (utils.isArray(options.camera.target)) { - // var bounds = new LatLngBounds(); - // options.camera.target.forEach(function(latlng) { - // bounds.extend(latlng); - // }); - // options.camera.zoom = spherical.computeBoundsZoom(bounds, div.offsetWidth, div.offsetHeight, 256); - // console.log(options.camera.zoom, bounds); - // options.camera.target = bounds.getCenter(); - // } else if ('southwest' in options.camera.target && 'northeast' in options.camera.target) { - // bounds.extend(options.camera.target.southwest); - // bounds.extend(options.camera.target.northeast); - // options.camera.zoom = spherical.computeBoundsZoom(bounds, div.offsetWidth, div.offsetHeight, 256); - // options.camera.target = bounds.getCenter(); - // } - // } - // console.log(options); if (options.preferences && options.preferences.gestureBounds) { var bounds = new LatLngBounds(); @@ -368,7 +354,7 @@ Map.prototype.setOptions = function(options) { bounds.extend(options.preferences.gestureBounds.northeast); } - if (!('southwest' in bounds) || !('northeast' in bounds)) { + if (!bounds.southwest || !bounds.northeast) { console.warn('(getMap) options.preferences.gestureBounds is invalid.'); delete options.preferences.gestureBounds; } else { @@ -919,9 +905,9 @@ Map.prototype.setDiv = function(div) { div.setAttribute('__pluginMapId', self.__pgmId); // Insert the infoWindow layer - if (self._layers.info.parentNode) { + if (self._layers._info.parentNode) { try { - self._layers.info.parentNode.removeChild(self._layers.info.parentNode); + self._layers._info.parentNode.removeChild(self._layers._info.parentNode); } catch(e) { //ignore } @@ -933,7 +919,7 @@ Map.prototype.setDiv = function(div) { div.children[i].style.position = 'relative'; } } - div.insertBefore(self._layers.info, div.firstChild); + div.insertBefore(self._layers._info, div.firstChild); // Webkit redraw mandatory // http://stackoverflow.com/a/3485654/697856 @@ -945,7 +931,7 @@ Map.prototype.setDiv = function(div) { self.set('div', div); if (cordova.platform === 'browser') { - return Promise.resolve(); + return; } @@ -975,35 +961,20 @@ Map.prototype.setDiv = function(div) { } if (background) { + background = common.HTMLColor2RGBA(background); plugin.google.maps.environment.setBackgroundColor(background); } } - return (new Promise(function(resolve) { - self.exec.call(self, function() { - cordova.fireDocumentEvent('plugin_touch', { - force: true, - action: 'setDiv' - }); - self.refreshLayout(); - - var waitCnt = 0; - var waitCameraSync = function() { - if (!self.getVisibleRegion() && (waitCnt++ < 10)) { - setTimeout(function() { - common.nextTick(waitCameraSync); - }, 100); - return; - } - resolve(); - }; - setTimeout(function() { - common.nextTick(waitCameraSync); - }, 100); - - }, self.errorHandler, self.__pgmId, 'setDiv', args, { - sync: true + self.exec.call(self, function() { + cordova.fireDocumentEvent('plugin_touch', { + force: true, + action: 'setDiv' }); - })); + self.refreshLayout(); + }, self.errorHandler, self.__pgmId, 'setDiv', args, { + sync: true + }); + return self; }; /** From 02efa092d2afb60ed6af87de8d9385196704adff Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Fri, 8 May 2020 11:23:59 -0700 Subject: [PATCH 11/50] still working on --- www/Map.js | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/www/Map.js b/www/Map.js index 80dcbadf1..0553598e2 100644 --- a/www/Map.js +++ b/www/Map.js @@ -1,5 +1,4 @@ - var utils = require('cordova/utils'), cordova_exec = require('cordova/exec'), common = require('./Common'), @@ -94,11 +93,15 @@ utils.extend(Map, Overlay); Map.prototype.refreshLayout = function() { // Webkit redraw mandatory // http://stackoverflow.com/a/3485654/697856 - document.body.style.display = 'inline-block'; - document.body.offsetHeight; - document.body.style.display = ''; + // document.body.style.display = 'inline-block'; + // document.body.offsetHeight; + // document.body.style.display = ''; + document.body.style.transform = 'rotateZ(0deg)'; - this.exec.call(this, null, null, this.__pgmId, 'resizeMap', []); + var self = this; + return (new Promise(function(resolve) { + self.exec.call(self, null, null, self.__pgmId, 'resizeMap', []); + })); }; Map.prototype.getMap = function(meta, div, options) { @@ -308,8 +311,9 @@ Map.prototype.getMap = function(meta, div, options) { self._privateInitialize(); delete self._privateInitialize; - self.refreshLayout(); - self.trigger(event.MAP_READY, self); + self.refreshLayout().then(function() { + self.trigger(event.MAP_READY, self); + }); }; setTimeout(function() { common.nextTick(waitCameraSync); @@ -931,7 +935,7 @@ Map.prototype.setDiv = function(div) { self.set('div', div); if (cordova.platform === 'browser') { - return; + return Promise.resolve(); } @@ -965,16 +969,17 @@ Map.prototype.setDiv = function(div) { plugin.google.maps.environment.setBackgroundColor(background); } } - self.exec.call(self, function() { - cordova.fireDocumentEvent('plugin_touch', { - force: true, - action: 'setDiv' + return (new Promise(function(resolve) { + self.exec.call(self, function() { + cordova.fireDocumentEvent('plugin_touch', { + force: true, + action: 'setDiv' + }); + self.refreshLayout().then(resolve); + }, self.errorHandler, self.__pgmId, 'setDiv', args, { + sync: true }); - self.refreshLayout(); - }, self.errorHandler, self.__pgmId, 'setDiv', args, { - sync: true - }); - return self; + })); }; /** From 6b1b5da57c973a179bf4a535e007b49d81c7346f Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Fri, 8 May 2020 12:45:13 -0700 Subject: [PATCH 12/50] still working on --- www/Map.js | 45 +++++++++++++++++++++------------------------ 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/www/Map.js b/www/Map.js index 0553598e2..48d4867c0 100644 --- a/www/Map.js +++ b/www/Map.js @@ -1,4 +1,5 @@ + var utils = require('cordova/utils'), cordova_exec = require('cordova/exec'), common = require('./Common'), @@ -51,9 +52,6 @@ var Map = function(__pgmId, _exec) { infoWindowLayer.style.overflow = 'visible'; infoWindowLayer.style['z-index'] = 1; - - var shadowInfo = infoWindowLayer.attachShadow({mode: 'open'}); - var style = document.createElement('style'); style.setAttribute('type', 'text/css'); style.innerHTML = [ @@ -61,12 +59,11 @@ var Map = function(__pgmId, _exec) { 'button.gm-control-active>img {display: none;}', 'button.gm-control-active>img:nth-child(1) {display: inline;}' ].join("\n"); - shadowInfo.appendChild(style); + infoWindowLayer.appendChild(style); Object.defineProperty(self, '_layers', { value: { - info: shadowInfo, - _info: infoWindowLayer + info: infoWindowLayer }, enumerable: false, writable: false @@ -99,9 +96,7 @@ Map.prototype.refreshLayout = function() { document.body.style.transform = 'rotateZ(0deg)'; var self = this; - return (new Promise(function(resolve) { - self.exec.call(self, null, null, self.__pgmId, 'resizeMap', []); - })); + self.exec.call(self, null, null, self.__pgmId, 'resizeMap', []); }; Map.prototype.getMap = function(meta, div, options) { @@ -252,9 +247,9 @@ Map.prototype.getMap = function(meta, div, options) { if (common.isDom(div)) { // Insert the infoWindow layer - if (self._layers._info.parentNode) { + if (self._layers.info.parentNode) { try { - self._layers._info.parentNode.removeChild(self._layers._info.parentNode); + self._layers.info.parentNode.removeChild(self._layers.info.parentNode); } catch (e) { // ignore } @@ -266,7 +261,7 @@ Map.prototype.getMap = function(meta, div, options) { div.children[i].style.position = 'relative'; } } - div.insertBefore(self._layers._info, div.firstChild); + div.insertBefore(self._layers.info, div.firstChild); var background = undefined; @@ -311,9 +306,8 @@ Map.prototype.getMap = function(meta, div, options) { self._privateInitialize(); delete self._privateInitialize; - self.refreshLayout().then(function() { - self.trigger(event.MAP_READY, self); - }); + self.refreshLayout(); + self.trigger(event.MAP_READY, self); }; setTimeout(function() { common.nextTick(waitCameraSync); @@ -329,8 +323,8 @@ Map.prototype.setOptions = function(options) { var self = this; var div = self.get('div'); if (options.controls) { - this.set('myLocation', options.controls.myLocation === true); - this.set('myLocationButton', options.controls.myLocationButton === true); + self.set('myLocation', options.controls.myLocation === true); + self.set('myLocationButton', options.controls.myLocationButton === true); } if (options.camera && utils.isArray(options.camera.target)) { @@ -359,7 +353,7 @@ Map.prototype.setOptions = function(options) { } if (!bounds.southwest || !bounds.northeast) { - console.warn('(getMap) options.preferences.gestureBounds is invalid.'); + console.warn('(setOptions) options.preferences.gestureBounds is invalid.'); delete options.preferences.gestureBounds; } else { var minZoom = !div ? 0 : spherical.computeBoundsZoom(bounds, div.offsetWidth, div.offsetHeight, 256); @@ -394,8 +388,9 @@ Map.prototype.setOptions = function(options) { if (utils.isArray(options.styles)) { options.styles = JSON.stringify(options.styles); } - this.exec.call(this, null, this.errorHandler, this.__pgmId, 'setOptions', [options]); - return this; + return (new Promise(function(resolve, reject) { + self.exec.call(self, resolve, reject, self.__pgmId, 'setOptions', [options]); + })); }; Map.prototype.getMyLocation = function(params, success_callback, error_callback) { @@ -909,9 +904,9 @@ Map.prototype.setDiv = function(div) { div.setAttribute('__pluginMapId', self.__pgmId); // Insert the infoWindow layer - if (self._layers._info.parentNode) { + if (self._layers.info.parentNode) { try { - self._layers._info.parentNode.removeChild(self._layers._info.parentNode); + self._layers.info.parentNode.removeChild(self._layers.info.parentNode); } catch(e) { //ignore } @@ -923,7 +918,7 @@ Map.prototype.setDiv = function(div) { div.children[i].style.position = 'relative'; } } - div.insertBefore(self._layers._info, div.firstChild); + div.insertBefore(self._layers.info, div.firstChild); // Webkit redraw mandatory // http://stackoverflow.com/a/3485654/697856 @@ -931,6 +926,7 @@ Map.prototype.setDiv = function(div) { // div.offsetHeight; // div.style.display = ''; document.body.style.transform = 'rotateZ(0deg)'; + div.style.overflow = 'hidden'; self.set('div', div); @@ -975,7 +971,8 @@ Map.prototype.setDiv = function(div) { force: true, action: 'setDiv' }); - self.refreshLayout().then(resolve); + self.refreshLayout(); + resolve(); }, self.errorHandler, self.__pgmId, 'setDiv', args, { sync: true }); From a0f25c5e10669173347e4c5ae4575317c0191c24 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Fri, 8 May 2020 13:50:08 -0700 Subject: [PATCH 13/50] still working on --- package.json | 2 +- plugin.xml | 2 +- src/ios/GoogleMaps/PluginMap.m | 2 +- www/Map.js | 13 ++++++++++--- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 4f2939947..1349c097f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-googlemaps", - "version": "2.8.0-20200507-2315", + "version": "2.8.0-20200508-1350", "description": "Google Maps native SDK for Android and iOS, and Google Maps JavaScript API v3 for browser.", "cordova": { "id": "cordova-plugin-googlemaps", diff --git a/plugin.xml b/plugin.xml index 7bf2e5bb7..56ae08440 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - + cordova-plugin-googlemaps diff --git a/src/ios/GoogleMaps/PluginMap.m b/src/ios/GoogleMaps/PluginMap.m index 9ec6aaa40..ddd56bbf4 100644 --- a/src/ios/GoogleMaps/PluginMap.m +++ b/src/ios/GoogleMaps/PluginMap.m @@ -520,7 +520,7 @@ -(void)_changeCameraPosition: (NSString*)action requestMethod:(NSString *)reques double longitude; GMSCameraPosition *cameraPosition; GMSCoordinateBounds *cameraBounds = nil; - CGFloat scale = self.mapCtrl.screenScale; + CGFloat scale = 1; //self.mapCtrl.screenScale; UIEdgeInsets paddingUiEdgeInsets = UIEdgeInsetsMake(cameraPadding / scale, cameraPadding / scale, cameraPadding / scale, cameraPadding / scale); diff --git a/www/Map.js b/www/Map.js index 48d4867c0..583620208 100644 --- a/www/Map.js +++ b/www/Map.js @@ -55,9 +55,15 @@ var Map = function(__pgmId, _exec) { var style = document.createElement('style'); style.setAttribute('type', 'text/css'); style.innerHTML = [ - ':host {color: black;}', - 'button.gm-control-active>img {display: none;}', - 'button.gm-control-active>img:nth-child(1) {display: inline;}' + '.pgm-html-info-frame > * {', + 'margin: 0;', + 'padding: 0;', + 'border: 0;', + 'font-size: 100%;', + 'font: inherit;', + 'vertical-align: baseline;', + 'color: black;', + '}' ].join("\n"); infoWindowLayer.appendChild(style); @@ -927,6 +933,7 @@ Map.prototype.setDiv = function(div) { // div.style.display = ''; document.body.style.transform = 'rotateZ(0deg)'; div.style.overflow = 'hidden'; + div.style.position = 'relative'; self.set('div', div); From c680247ea7ddd614702ebd5f0b78ec83042371e0 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Fri, 8 May 2020 23:40:29 -0700 Subject: [PATCH 14/50] - Bug fix (android / iOS) zIndex does not work - Bug fix (android / iOS) StreetView remains after page changing. --- package.json | 2 +- plugin.xml | 2 +- .../plugin/google/maps/MyPluginLayout.java | 5 ++-- src/ios/GoogleMaps/MyPluginScrollView.m | 24 +++++++++++-------- src/ios/GoogleMaps/PluginMap.m | 6 ++--- www/js_CordovaGoogleMaps-for-android_ios.js | 6 +++++ 6 files changed, 28 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 1349c097f..b1b86e393 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-googlemaps", - "version": "2.8.0-20200508-1350", + "version": "2.8.0-20200508-2339", "description": "Google Maps native SDK for Android and iOS, and Google Maps JavaScript API v3 for browser.", "cordova": { "id": "cordova-plugin-googlemaps", diff --git a/plugin.xml b/plugin.xml index 56ae08440..89b5b7d94 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - + cordova-plugin-googlemaps diff --git a/src/android/plugin/google/maps/MyPluginLayout.java b/src/android/plugin/google/maps/MyPluginLayout.java index 044f84d5c..6fc4cea48 100644 --- a/src/android/plugin/google/maps/MyPluginLayout.java +++ b/src/android/plugin/google/maps/MyPluginLayout.java @@ -365,12 +365,13 @@ public void run() { int childCnt = scrollFrameLayout.getChildCount(); View view; int index = childCnt; - for (int i = childCnt - 1; i >= 0; i--) { +// for (int i = childCnt - 1; i >= 0; i--) { + for (int i = 0; i < childCnt; i++) { view = scrollFrameLayout.getChildAt(i); if (view.getTag() == null) { continue; } - if (Integer.parseInt(view.getTag() + "") < depth) { + if (Integer.parseInt(view.getTag() + "") > depth) { index = i; break; } diff --git a/src/ios/GoogleMaps/MyPluginScrollView.m b/src/ios/GoogleMaps/MyPluginScrollView.m index ad9d35f49..871735552 100644 --- a/src/ios/GoogleMaps/MyPluginScrollView.m +++ b/src/ios/GoogleMaps/MyPluginScrollView.m @@ -28,27 +28,31 @@ - (id)initWithFrame:(CGRect)aRect - (void)attachView:(UIView *)view depth:(NSInteger)depth { NSArray *subviews = [self subviews]; - UIView *subview; - NSInteger tag; int viewCnt = (int)[subviews count]; int index = viewCnt; - for (int i = 0; i < viewCnt; i++) { - subview = [subviews objectAtIndex: i]; - tag = subview.tag; - if (tag == 0) { - continue; - } + + NSArray *sortedArray; + sortedArray = [subviews sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { + NSInteger first = ((UIView*)a).tag; + NSInteger second = ((UIView*)b).tag; + return first - second; + }]; + + + for (int i = 0; i < sortedArray.count; i++) { + NSInteger tag = ((UIView *)[sortedArray objectAtIndex:i]).tag; if (tag > depth) { index = i; break; } } - + + [self insertSubview:view atIndex:index]; } - (void)detachView:(UIView *)view { [view removeFromSuperview]; - + } - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { diff --git a/src/ios/GoogleMaps/PluginMap.m b/src/ios/GoogleMaps/PluginMap.m index ddd56bbf4..597e99be0 100644 --- a/src/ios/GoogleMaps/PluginMap.m +++ b/src/ios/GoogleMaps/PluginMap.m @@ -520,7 +520,7 @@ -(void)_changeCameraPosition: (NSString*)action requestMethod:(NSString *)reques double longitude; GMSCameraPosition *cameraPosition; GMSCoordinateBounds *cameraBounds = nil; - CGFloat scale = 1; //self.mapCtrl.screenScale; + CGFloat scale = self.mapCtrl.screenScale; UIEdgeInsets paddingUiEdgeInsets = UIEdgeInsetsMake(cameraPadding / scale, cameraPadding / scale, cameraPadding / scale, cameraPadding / scale); @@ -921,13 +921,13 @@ - (void)_setOptions:(NSDictionary *)initOptions requestMethod:(NSString *)reques }; - (void)_setCameraRestriction:(NSDictionary *)params { - + if (params == (id)[NSNull null]) { self.mapCtrl.map.cameraTargetBounds = nil; double minZoom = 0; double maxZoom = 23; [self.mapCtrl.map setMinZoom:minZoom maxZoom:maxZoom]; - + } else { GMSMutablePath *path = [GMSMutablePath path]; diff --git a/www/js_CordovaGoogleMaps-for-android_ios.js b/www/js_CordovaGoogleMaps-for-android_ios.js index e203d46ca..a3c40ae9a 100644 --- a/www/js_CordovaGoogleMaps-for-android_ios.js +++ b/www/js_CordovaGoogleMaps-for-android_ios.js @@ -574,6 +574,12 @@ CordovaGoogleMaps.prototype.followMapDivPositionOnly = function(opts) { // Obtain only minimum information var mapDiv = map.getDiv(); var divId = mapDiv.getAttribute('__pluginDomId'); + if (!divId) { + changed = true; + map.remove(); + return; + } + var divId = mapDiv.getAttribute('__pluginDomId'); mapRects[divId] = { size: common.getDivRect(mapDiv), zIndex: common.getZIndex(mapDiv) From e4297e4c9662ecce2c838896218efc6a57a9fb5b Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Sat, 9 May 2020 22:14:52 -0700 Subject: [PATCH 15/50] Fix (Android) : mapOptions.camera does not work correctly --- package.json | 2 +- plugin.xml | 2 +- src/android/plugin/google/maps/PluginMap.java | 13 ++++++++---- www/Map.js | 20 +++++++++---------- 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index b1b86e393..4fc83aabd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-googlemaps", - "version": "2.8.0-20200508-2339", + "version": "2.8.0-20200509-2214", "description": "Google Maps native SDK for Android and iOS, and Google Maps JavaScript API v3 for browser.", "cordova": { "id": "cordova-plugin-googlemaps", diff --git a/plugin.xml b/plugin.xml index 89b5b7d94..079768ea0 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - + cordova-plugin-googlemaps diff --git a/src/android/plugin/google/maps/PluginMap.java b/src/android/plugin/google/maps/PluginMap.java index 086e7bd9a..b7133c2ec 100644 --- a/src/android/plugin/google/maps/PluginMap.java +++ b/src/android/plugin/google/maps/PluginMap.java @@ -693,11 +693,11 @@ public void detachFromWebView(JSONArray args, final CallbackContext callbackCont public void resizeMap(JSONArray args, final CallbackContext callbackContext) throws JSONException { if (mapCtrl.mPluginLayout == null || mapDivId == null) { //Log.d("PluginMap", "---> resizeMap / mPluginLayout = null"); - callbackContext.success(); if (initCameraBounds != null) { mainHandler.postDelayed(new Runnable() { @Override public void run() { + callbackContext.success(); } }, 100); } @@ -729,8 +729,8 @@ public void run() { public void run() { if(mapCtrl.mPluginLayout == null || mapDivId == null) { - callbackContext.success(); - return; + callbackContext.success(); + return; } RectF drawRect = mapCtrl.mPluginLayout.HTMLNodeRectFs.get(mapDivId); @@ -752,7 +752,12 @@ public void run() { params.topMargin = y; mapView.setLayoutParams(params); - callbackContext.success(); + mainHandler.postDelayed(new Runnable() { + @Override + public void run() { + callbackContext.success(); + } + }, 500); } } }); diff --git a/www/Map.js b/www/Map.js index 583620208..17091b43b 100644 --- a/www/Map.js +++ b/www/Map.js @@ -333,16 +333,16 @@ Map.prototype.setOptions = function(options) { self.set('myLocationButton', options.controls.myLocationButton === true); } - if (options.camera && utils.isArray(options.camera.target)) { - var cameraBounds = new LatLngBounds(); - options.camera.target.forEach(function(ele) { - if (ele.lat && ele.lng) { - cameraBounds.extend(ele); - } - }); - options.camera.target = cameraBounds.getCenter(); - options.camera.zoom = spherical.computeBoundsZoom(cameraBounds, div.offsetWidth, div.offsetHeight, 256); - } + // if (options.camera && utils.isArray(options.camera.target)) { + // var cameraBounds = new LatLngBounds(); + // options.camera.target.forEach(function(ele) { + // if (ele.lat && ele.lng) { + // cameraBounds.extend(ele); + // } + // }); + // options.camera.target = cameraBounds.getCenter(); + // options.camera.zoom = spherical.computeBoundsZoom(cameraBounds, div.offsetWidth, div.offsetHeight, 256); + // } if (options.preferences && options.preferences.gestureBounds) { var bounds = new LatLngBounds(); From 640101cbb7b4dd5d4acecf8abe34f959bdd59f36 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Mon, 11 May 2020 12:10:28 -0700 Subject: [PATCH 16/50] still working on DirectionsRenderer --- package.json | 2 +- plugin.xml | 2 +- www/DirectionsRenderer.js | 274 ++++++++++++++++++++++++++++++++------ www/DirectionsService.js | 12 +- 4 files changed, 237 insertions(+), 53 deletions(-) diff --git a/package.json b/package.json index 4fc83aabd..f922302fe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-googlemaps", - "version": "2.8.0-20200509-2214", + "version": "2.8.0-20200510-1209", "description": "Google Maps native SDK for Android and iOS, and Google Maps JavaScript API v3 for browser.", "cordova": { "id": "cordova-plugin-googlemaps", diff --git a/plugin.xml b/plugin.xml index 079768ea0..15f1adff3 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - + cordova-plugin-googlemaps diff --git a/www/DirectionsRenderer.js b/www/DirectionsRenderer.js index 21f90242a..33a3314d7 100644 --- a/www/DirectionsRenderer.js +++ b/www/DirectionsRenderer.js @@ -8,6 +8,14 @@ var utils = require('cordova/utils'), spherical = require('./spherical'), encoding = require('./encoding'); +var _decodePolyline = function(property) { + if (typeof property === 'object' && property.points) { + return encoding.decodePath(property.points); + } else if (typeof property === 'string') { + return encoding.decodePath(property); + } +}; + /***************************************************************************** * DirectionsRenderer Class *****************************************************************************/ @@ -34,30 +42,44 @@ var DirectionsRenderer = function(map, exec, options) { value: exec, writable: false }); - Object.defineProperty(self, 'polyline', { - value: self.map.addPolyline({ - 'points': [], - 'color': '#AA00FF', - 'width': 10 - }), + Object.defineProperty(self, 'waypoints', { + value: new BaseArrayClass(), + writable: false + }); + Object.defineProperty(self, 'markers', { + value: new BaseArrayClass(), writable: false }); - self.set('overview_path', []); Object.defineProperty(self, 'waypoints', { value: new BaseArrayClass(), writable: false }); - Object.defineProperty(self, 'waypointMarkers', { + + Object.defineProperty(self, 'pathList', { + value: new BaseArrayClass(), + writable: false + }); + Object.defineProperty(self, 'pathCollection', { value: new BaseArrayClass(), writable: false }); self.set('options', options); + self.set('draggable', options.draggable || false); self.set('requestingFlag', false); + self.set('routeIndex', options.routeIndex || 0, false); + + self.on('panel_changed', self._panel_changed.bind(self)); + self.set('panel', options.panel); self.on('routeIndex_changed', self._redrawRoute.bind(self)); self.on('overview_path_changed', self._redrawPolyline.bind(self)); self.waypoints.on('insert_at', self._waypoint_created.bind(self)); - self.orders = []; + self.waypoints.on('remove_at', self._waypoint_removed.bind(self)); + self.pathList.on('insert_at', self._pathList_created.bind(self)); + self.pathList.on('remove_at', self._pathList_removed.bind(self)); + self.pathList.on('set_at', self._pathList_updated.bind(self)); + + self.trigger('routeIndex_changed'); }; utils.extend(DirectionsRenderer, BaseClass); @@ -66,17 +88,147 @@ DirectionsRenderer.prototype.getId = function () { return this.__pgmId; }; +DirectionsRenderer.prototype._panel_changed = function(oldDivId, newDivId) { + var self = this; + if (oldDivId) { + var oldDiv = document.getElementById(oldDivId); + if (oldDiv) { + oldDivId.innerHTML = ''; + } + } + if (newDivId) { + var options = self.get('options'); + + var newDiv = document.getElementById(newDivId); + if (newDiv && options.directions.routes.length) { + + + var routeIndex = self.get('routeIndex'); + var shadowRoot = newDiv.attachShadow({mode: 'open'}); + + var style = document.createElement('style'); + shadowRoot.appendChild(style); + style.innerHTML = ` + div.summary1 { + color: green; + font-size: 1.5em; + padding-top: 5%; + padding-bottom: 2%; + } + div.summary2 { + color: green; + font-size: 1em; + } + ul.steps { + list-style-type: none; + padding: 0%; + } + li.step { + padding: 0.5em; + border-bottom: 1px solid #ccc; + } + li:last-child { + border-bottom: none; + } + `; + + var container = document.createElement('div'); + container.style.position = 'relative'; + container.style.overflowY = 'scroll'; + container.style.width = '90%'; + container.style.height = '100%'; + container.style.padding = '0% 5%'; + shadowRoot.appendChild(container); + + var summary = document.createElement('div'); + summary.style.width = '100%'; + + + var summary1 = document.createElement('div'); + summary1.classList.add('summary1'); + summary1.innerHTML = [ + options.directions.routes[routeIndex].legs[0].duration.text, + options.directions.routes[routeIndex].legs[0].distance.text + ].join(' / '); + summary.appendChild(summary1); + + var eta = new Date(Date.now() + options.directions.routes[routeIndex].legs[0].duration.value); + var summary2 = document.createElement('div'); + summary2.classList.add('summary2'); + summary2.innerHTML = eta; + summary.appendChild(summary2); + + container.appendChild(summary); + + var ul = document.createElement('ul'); + ul.classList.add('steps'); + + options.directions.routes[routeIndex].legs[0].steps.forEach(function(step) { + var stepLi = document.createElement('li'); + stepLi.classList.add('step'); + + var stepSummary = document.createElement('div'); + stepSummary.style.width = '100%'; + stepSummary.innerHTML = [ + step.duration.text, + step.distance.text, + ].join(" / "); + stepLi.appendChild(stepSummary); + + var stepInstruction = document.createElement('div'); + stepInstruction.style.width = '100%'; + stepInstruction.innerHTML = step.instructions; + stepLi.appendChild(stepInstruction); + + ul.appendChild(stepLi); + }); + newDiv.innerHTML = ''; + container.appendChild(ul); + } + } +}; + +DirectionsRenderer.prototype._pathList_created = function(index) { + var self = this; + var path = self.pathList.getAt(index); + var polyline = self.map.addPolyline({ + 'points': path, + 'color': '#AA00FF', + 'width': 10 + }); + self.pathCollection.push(polyline); +}; + +DirectionsRenderer.prototype._pathList_updated = function(index) { + var self = this; + var polyline = self.pathCollection.getAt(index); + var path = self.pathList.getAt(index); + polyline.setPoints(path); +}; + +DirectionsRenderer.prototype._pathList_removed = function(index) { + var self = this; + var polyline = self.pathCollection.removeAt(index); + polyline.remove(); +}; + DirectionsRenderer.prototype._waypoint_created = function(index) { var self = this; var position = self.waypoints.getAt(index); var marker = self.map.addMarker({ 'position': position, - 'draggable': true, - 'idx': index + 'idx': index, + 'title': `idx=${index}` }); - self.orders.push(index); + self.bindTo('draggable', marker); marker.on('marker_drag_end', self._onWaypointMoved.bind(self, marker)); - self.waypointMarkers.push(marker); + self.markers.push(marker); +}; + +DirectionsRenderer.prototype._waypoint_removed = function(index) { + var self = this; + var marker = self.markers.removeAt(index); + marker.remove(); }; DirectionsRenderer.prototype._onWaypointMoved = function(marker) { @@ -89,41 +241,71 @@ DirectionsRenderer.prototype._onWaypointMoved = function(marker) { if (requestingFlag) return; self.set('requestingFlag', true); + var n = self.waypoints.getLength(); + var routeIndex = self.get('routeIndex'); + var options = self.get('options'); - var points = self.waypoints.getArray(); - var start_location = points.shift(); - var end_location = points.pop(); + var points = []; + if (index == 0) { + points.push(self.waypoints.getAt(0)); + points.push(self.waypoints.getAt(1)); + } else if (index == n - 1) { + points.push(self.waypoints.getAt(n - 2)); + points.push(self.waypoints.getAt(n - 1)); + } else { + points.push(self.waypoints.getAt(index - 1)); + points.push(self.waypoints.getAt(index)); + points.push(self.waypoints.getAt(index + 1)); + } + plugin.google.maps.DirectionsService.route({ - 'origin': start_location, - 'destination': end_location, + 'origin': points.shift(), + 'destination': points.pop(), 'travelMode': options.directions.request.travelMode || 'DRIVING', 'waypoints': points }, function(result) { - var stepOverlays = new BaseArrayClass(); - var route = result.routes[0]; - // options.directions.routes[routeIdx] = route; + // Redraw the polyline + options.directions.routes = result.routes; + var route = options.directions.routes[routeIndex]; + var leg = route.legs[0]; - var overview_path = route.overview_polyline; - if (typeof overview_path === 'object' && route.overview_polyline.points) { - overview_path = route.overview_polyline.points; - } - var overview_path = encoding.decodePath(overview_path); - - if (!options.preserveViewport) { - setTimeout(function() { - self.map.animateCamera({ - 'target': route.bounds, - 'duration': 1000 - }); - }, 100); + var currentPath = []; + console.log(`index = ${index}`); + if (index == 0) { + leg.steps.forEach(function(step) { + currentPath = currentPath.concat(_decodePolyline(step.polyline)); + }); + self.pathList.setAt(0, currentPath); + } else if (index == n - 1) { + leg.steps.forEach(function(step) { + currentPath = currentPath.concat(_decodePolyline(step.polyline)); + }); + self.pathList.setAt(index - 1, currentPath); + } else { + var i; + for (i = 0; i < leg.steps.length; i++) { + currentPath = currentPath.concat(_decodePolyline(leg.steps[i].polyline)); + if (spherical.computeDistanceBetween(position, leg.steps[i].end_location) < 5) { + break; + } + } + self.pathList.setAt(index - 1, currentPath); + + currentPath = []; + while (i < leg.steps.length) { + currentPath = currentPath.concat(_decodePolyline(leg.steps[i++].polyline)); + } + self.pathList.setAt(index, currentPath); } + + + // prevent the OVER_QUERY_LIMIT setTimeout(function() { self.set('requestingFlag', false); }, 1000); - self.set('overview_path', overview_path); }); }; @@ -136,36 +318,40 @@ DirectionsRenderer.prototype._redrawRoute = function(oldIdx, newIdx) { var self = this; var options = self.get('options'); var n = options.directions.routes.length; + var routeIndex = self.get('routeIndex'); if (newIdx < 0 || newIdx > n - 1) { return; } var stepOverlays = new BaseArrayClass(); - var route = options.directions.routes[newIdx]; - - var overview_path = route.overview_polyline; - if (typeof overview_path === 'object' && route.overview_polyline.points) { - overview_path = route.overview_polyline.points; - } - overview_path = encoding.decodePath(overview_path); - self.set('overview_path', overview_path); + var route = options.directions.routes[routeIndex]; var waypointsRef = self.waypoints; waypointsRef.empty(); + var currentPath = []; var idx = 0; var lastPosition = route.legs[0].steps[0].start_location; + currentPath = currentPath.concat(_decodePolyline(route.legs[0].steps[0].polyline)); waypointsRef.push(lastPosition); var n = route.legs[0].steps.length; - route.legs[0].steps.forEach(function(step) { + route.legs[0].steps.forEach(function(step, i) { + if (i == 0) return; + var pos = step.end_location; + currentPath = currentPath.concat(_decodePolyline(step.polyline)); if (spherical.computeDistanceBetween(lastPosition, pos) < 100 && idx < n) { return; } lastPosition = pos; + self.pathList.push(currentPath.slice(0)); + currentPath = []; waypointsRef.push(pos); }); + if (currentPath.length > 0) { + self.pathList.push(currentPath.slice(0)); + } if (!options.preserveViewport) { setTimeout(function() { diff --git a/www/DirectionsService.js b/www/DirectionsService.js index 1e97425cb..91ccb463a 100644 --- a/www/DirectionsService.js +++ b/www/DirectionsService.js @@ -1,4 +1,5 @@ + /***************************************************************************** * DirectionsService class *****************************************************************************/ @@ -81,25 +82,22 @@ function _cnv_DirectionsRequestLocation(position) { } var DirectionsService = function(exec) { - function _errorHandler(err) { - console.error(err); - } return { route: function(request, callback, errorCallback) { var self = this; if (!request) { - return errorHandler('route needs request parameter'); + throw new Error('route needs request parameter'); } if (!request.destination) { - return errorHandler('route() needs request.destination parameter'); + throw new Error('route() needs request.destination parameter'); } if (!request.origin) { - return errorHandler('route() needs request.origin parameter'); + throw new Error('route() needs request.origin parameter'); } if (!request.travelMode) { - return errorHandler('route() needs request.travelMode parameter'); + throw new Error('route() needs request.travelMode parameter'); } request.origin = _cnv_DirectionsRequestLocation(request.origin); From 7ea6cf975517393b288615fc35cc4aeaf2390d1a Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Mon, 11 May 2020 22:57:55 -0700 Subject: [PATCH 17/50] still working on DirectionsRenderer --- package.json | 2 +- plugin.xml | 2 +- www/DirectionsRenderer.js | 148 +++++++++++++++++++++++++++----------- www/Map.js | 15 ++-- www/event.js | 5 +- 5 files changed, 118 insertions(+), 54 deletions(-) diff --git a/package.json b/package.json index f922302fe..caf0ec805 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-googlemaps", - "version": "2.8.0-20200510-1209", + "version": "2.8.0-20200511-2257", "description": "Google Maps native SDK for Android and iOS, and Google Maps JavaScript API v3 for browser.", "cordova": { "id": "cordova-plugin-googlemaps", diff --git a/plugin.xml b/plugin.xml index 15f1adff3..34fa0a4e2 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - + cordova-plugin-googlemaps diff --git a/www/DirectionsRenderer.js b/www/DirectionsRenderer.js index 33a3314d7..c3be732bd 100644 --- a/www/DirectionsRenderer.js +++ b/www/DirectionsRenderer.js @@ -1,5 +1,6 @@ + var utils = require('cordova/utils'), event = require('./event'), BaseClass = require('./BaseClass'), @@ -13,6 +14,8 @@ var _decodePolyline = function(property) { return encoding.decodePath(property.points); } else if (typeof property === 'string') { return encoding.decodePath(property); + } else if (utils.isArray(property)) { + return property; } }; @@ -63,7 +66,13 @@ var DirectionsRenderer = function(map, exec, options) { value: new BaseArrayClass(), writable: false }); + options = options || {}; self.set('options', options); + self.set('markerOptions', options.markerOptions); + + self.set('directions', options.directions || { + 'routes': [] + }); self.set('draggable', options.draggable || false); self.set('requestingFlag', false); self.set('routeIndex', options.routeIndex || 0, false); @@ -88,6 +97,13 @@ DirectionsRenderer.prototype.getId = function () { return this.__pgmId; }; +DirectionsRenderer.prototype.getRouteIndex = function () { + return this.get('routeIndex') || 0; +}; +DirectionsRenderer.prototype.getDirections = function () { + return this.get('directions') || []; +}; + DirectionsRenderer.prototype._panel_changed = function(oldDivId, newDivId) { var self = this; if (oldDivId) { @@ -97,10 +113,10 @@ DirectionsRenderer.prototype._panel_changed = function(oldDivId, newDivId) { } } if (newDivId) { - var options = self.get('options'); + var directions = self.get('directions'); var newDiv = document.getElementById(newDivId); - if (newDiv && options.directions.routes.length) { + if (newDiv && directions.routes.length) { var routeIndex = self.get('routeIndex'); @@ -147,12 +163,12 @@ DirectionsRenderer.prototype._panel_changed = function(oldDivId, newDivId) { var summary1 = document.createElement('div'); summary1.classList.add('summary1'); summary1.innerHTML = [ - options.directions.routes[routeIndex].legs[0].duration.text, - options.directions.routes[routeIndex].legs[0].distance.text + directions.routes[routeIndex].legs[0].duration.text, + directions.routes[routeIndex].legs[0].distance.text ].join(' / '); summary.appendChild(summary1); - var eta = new Date(Date.now() + options.directions.routes[routeIndex].legs[0].duration.value); + var eta = new Date(Date.now() + directions.routes[routeIndex].legs[0].duration.value); var summary2 = document.createElement('div'); summary2.classList.add('summary2'); summary2.innerHTML = eta; @@ -163,7 +179,7 @@ DirectionsRenderer.prototype._panel_changed = function(oldDivId, newDivId) { var ul = document.createElement('ul'); ul.classList.add('steps'); - options.directions.routes[routeIndex].legs[0].steps.forEach(function(step) { + directions.routes[routeIndex].legs[0].steps.forEach(function(step) { var stepLi = document.createElement('li'); stepLi.classList.add('step'); @@ -191,11 +207,15 @@ DirectionsRenderer.prototype._panel_changed = function(oldDivId, newDivId) { DirectionsRenderer.prototype._pathList_created = function(index) { var self = this; var path = self.pathList.getAt(index); - var polyline = self.map.addPolyline({ - 'points': path, - 'color': '#AA00FF', - 'width': 10 - }); + + var polylineOpts = Object.create(self.get('polylineOptions') || {}); + delete polylineOpts.points; + + polylineOpts.color = polylineOpts.color || '#0000FF'; + polylineOpts.width = ('width' in polylineOpts) ? polylineOpts.width : 10; + polylineOpts.points = path; + + var polyline = self.map.addPolyline(polylineOpts); self.pathCollection.push(polyline); }; @@ -204,6 +224,8 @@ DirectionsRenderer.prototype._pathList_updated = function(index) { var polyline = self.pathCollection.getAt(index); var path = self.pathList.getAt(index); polyline.setPoints(path); + polyline.setStrokeColor(`rgb(${index * 63}, ${index * 63}, ${index * 63})`); + }; DirectionsRenderer.prototype._pathList_removed = function(index) { @@ -215,11 +237,11 @@ DirectionsRenderer.prototype._pathList_removed = function(index) { DirectionsRenderer.prototype._waypoint_created = function(index) { var self = this; var position = self.waypoints.getAt(index); - var marker = self.map.addMarker({ - 'position': position, - 'idx': index, - 'title': `idx=${index}` - }); + var markerOpts = Object.create(self.get('markerOptions') || {}); + delete markerOpts.position; + markerOpts.idx = index; + + var marker = self.map.addMarker(markerOpts); self.bindTo('draggable', marker); marker.on('marker_drag_end', self._onWaypointMoved.bind(self, marker)); self.markers.push(marker); @@ -244,7 +266,7 @@ DirectionsRenderer.prototype._onWaypointMoved = function(marker) { var n = self.waypoints.getLength(); var routeIndex = self.get('routeIndex'); - var options = self.get('options'); + var directions = self.get('directions'); var points = []; if (index == 0) { points.push(self.waypoints.getAt(0)); @@ -258,46 +280,81 @@ DirectionsRenderer.prototype._onWaypointMoved = function(marker) { points.push(self.waypoints.getAt(index + 1)); } + directions = directions || { + request: { + travelMod: 'DRIVING' + } + }; plugin.google.maps.DirectionsService.route({ 'origin': points.shift(), 'destination': points.pop(), - 'travelMode': options.directions.request.travelMode || 'DRIVING', + 'travelMode': directions.request.travelMode || 'DRIVING', 'waypoints': points }, function(result) { // Redraw the polyline - options.directions.routes = result.routes; - var route = options.directions.routes[routeIndex]; + self.set('directions', result.directions); + var route = result.routes[routeIndex]; var leg = route.legs[0]; - var currentPath = []; - console.log(`index = ${index}`); + // var currentPath = []; + // leg.steps.forEach(function(step) { + // currentPath = currentPath.concat(_decodePolyline(step.polyline)); + // }); + var currentPath = _decodePolyline(route.overview_polyline); + if (index == 0) { - leg.steps.forEach(function(step) { - currentPath = currentPath.concat(_decodePolyline(step.polyline)); - }); self.pathList.setAt(0, currentPath); } else if (index == n - 1) { - leg.steps.forEach(function(step) { - currentPath = currentPath.concat(_decodePolyline(step.polyline)); - }); self.pathList.setAt(index - 1, currentPath); } else { - var i; - for (i = 0; i < leg.steps.length; i++) { - currentPath = currentPath.concat(_decodePolyline(leg.steps[i].polyline)); - if (spherical.computeDistanceBetween(position, leg.steps[i].end_location) < 5) { + + // Find the middle point (= marker point) + var closestDist = Math.pow(2, 32) - 1; + var closestIdx = 0; + var left = 0; + var right = currentPath.length; + while (left < right) { + var idx = Math.floor((left + right) / 2); + var howFar = spherical.computeDistanceBetween(position, currentPath[idx]); + if (howFar < closestDist) { + closestDist = howFar; + closestIdx = idx; + var howFarLeft = spherical.computeDistanceBetween(position, currentPath[Math.floor((left + idx) / 2)]); + var howFarRight = spherical.computeDistanceBetween(position, currentPath[Math.floor((right + idx) / 2)]); + if (howFarLeft < howFarRight && howFarLeft < closestDist) { + right = idx; + } else if (howFarLeft > howFarRight && howFarRight < closestDist) { + left = idx; + } else { + + // The middle point should be in the range of left and right. + idx = left; + while (idx < right) { + var howFar = spherical.computeDistanceBetween(position, currentPath[idx]); + if (howFar < closestDist) { + closestDist = howFar; + closestIdx = idx; + } + idx++; + } + + break; + } + } else { break; } } - self.pathList.setAt(index - 1, currentPath); - currentPath = []; - while (i < leg.steps.length) { - currentPath = currentPath.concat(_decodePolyline(leg.steps[i++].polyline)); - } - self.pathList.setAt(index, currentPath); + var twoPath = [ + currentPath.slice(0, closestIdx), + currentPath.slice(closestIdx) + ]; + twoPath[0].push(position); + twoPath[1].unshift(position); + self.pathList.setAt(index - 1, twoPath[0]); + self.pathList.setAt(index, twoPath[1]); } @@ -309,6 +366,17 @@ DirectionsRenderer.prototype._onWaypointMoved = function(marker) { }); }; +DirectionsRenderer.prototype.setOptions = function (options) { + var self = this; + options = options || {}; + self.set('options', options); + self.set('routeIndex', options.routeIndex || 0); + self.set('directions', options.directions || { + 'routes': [], + 'request': 'DRIVING' + }); + +}; DirectionsRenderer.prototype.setRouteIndex = function(index) { var self = this; self.set('routeIndex', index); @@ -317,14 +385,14 @@ DirectionsRenderer.prototype.setRouteIndex = function(index) { DirectionsRenderer.prototype._redrawRoute = function(oldIdx, newIdx) { var self = this; var options = self.get('options'); - var n = options.directions.routes.length; + var n = self.get('directions').routes.length; var routeIndex = self.get('routeIndex'); if (newIdx < 0 || newIdx > n - 1) { return; } var stepOverlays = new BaseArrayClass(); - var route = options.directions.routes[routeIndex]; + var route = self.get('directions').routes[routeIndex]; var waypointsRef = self.waypoints; waypointsRef.empty(); diff --git a/www/Map.js b/www/Map.js index 17091b43b..dc6ff3d0d 100644 --- a/www/Map.js +++ b/www/Map.js @@ -1184,23 +1184,16 @@ Map.prototype.addKmlOverlay = function(kmlOverlayOptions, callback) { }; -Map.prototype.addDirectionsRenderer = function(directionsRendererOptions, callback) { +Map.prototype.addDirectionsRenderer = function(directionsRendererOptions) { var self = this; directionsRendererOptions = directionsRendererOptions || {}; if (directionsRendererOptions.directions) { - var resolver = function(resolve, reject) { - var renderer = new DirectionsRenderer(self, self.exec, directionsRendererOptions); - renderer.setRouteIndex(0); - resolve(renderer); - }; + var renderer = new DirectionsRenderer(self, self.exec, directionsRendererOptions); + renderer.setRouteIndex(0); - if (typeof callback === 'function') { - resolver(callback, self.errorHandler); - } else { - return new Promise(resolver); - } + return renderer; } else { if (typeof callback === 'function') { diff --git a/www/event.js b/www/event.js index 1b232a2d7..03885d0ce 100644 --- a/www/event.js +++ b/www/event.js @@ -1,3 +1,5 @@ + + module.exports = { MAP_READY: 'map_ready', MAP_CLICK: 'map_click', @@ -31,5 +33,6 @@ module.exports = { PANORAMA_READY: 'panorama_ready', PANORAMA_CAMERA_CHANGE: 'panorama_camera_change', PANORAMA_LOCATION_CHANGE: 'panorama_location_change', - PANORAMA_CLICK: 'panorama_click' + PANORAMA_CLICK: 'panorama_click', + DIRECTIONS_CHANGED: 'directions_changed' }; From f51c21a85bd4f3adeae54cfe9c32aca5d31ec432 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Wed, 13 May 2020 21:44:28 -0700 Subject: [PATCH 18/50] Fix: #2774 (browser) --- src/browser/PluginMarkerCluster.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/browser/PluginMarkerCluster.js b/src/browser/PluginMarkerCluster.js index 68b304a2d..68d1e430d 100644 --- a/src/browser/PluginMarkerCluster.js +++ b/src/browser/PluginMarkerCluster.js @@ -550,6 +550,9 @@ function ClusterIconClass(options) { console.error(e); }; img.src = iconUrl; + + // Load icon image at once. The marker of Google Maps JavaScript v3 fails to load after img.onload frequently. + iconMarker.setIcon(icon.url); }); //debug From 8773ab3632f90e3565652f5a820d3aa9402dc26b Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Mon, 18 May 2020 22:13:05 -0700 Subject: [PATCH 19/50] still working on DirectionsRenderer --- package.json | 2 +- plugin.xml | 2 +- src/browser/PluginDirectionsService.js | 2 +- www/DirectionsRenderer.js | 6 ++++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index caf0ec805..1941217d0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-googlemaps", - "version": "2.8.0-20200511-2257", + "version": "2.8.0-20200518-2212", "description": "Google Maps native SDK for Android and iOS, and Google Maps JavaScript API v3 for browser.", "cordova": { "id": "cordova-plugin-googlemaps", diff --git a/plugin.xml b/plugin.xml index 34fa0a4e2..a13dafaa2 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - + cordova-plugin-googlemaps diff --git a/src/browser/PluginDirectionsService.js b/src/browser/PluginDirectionsService.js index 34b1b065b..e3682ba45 100644 --- a/src/browser/PluginDirectionsService.js +++ b/src/browser/PluginDirectionsService.js @@ -174,7 +174,7 @@ QUEUE.on('next', function() { return; case google.maps.DirectionsStatus.REQUEST_DENIED: self._executing = false; - cmd.onError('[directions] Google denited your elevation request.'); + cmd.onError('[directions] Google denited your directions request.'); return; case google.maps.DirectionsStatus.UNKNOWN_ERROR: self._executing = false; diff --git a/www/DirectionsRenderer.js b/www/DirectionsRenderer.js index c3be732bd..44621fff5 100644 --- a/www/DirectionsRenderer.js +++ b/www/DirectionsRenderer.js @@ -224,7 +224,9 @@ DirectionsRenderer.prototype._pathList_updated = function(index) { var polyline = self.pathCollection.getAt(index); var path = self.pathList.getAt(index); polyline.setPoints(path); - polyline.setStrokeColor(`rgb(${index * 63}, ${index * 63}, ${index * 63})`); + + // for test + //polyline.setStrokeColor(`rgb(${index * 63}, ${index * 63}, ${index * 63})`); }; @@ -238,7 +240,7 @@ DirectionsRenderer.prototype._waypoint_created = function(index) { var self = this; var position = self.waypoints.getAt(index); var markerOpts = Object.create(self.get('markerOptions') || {}); - delete markerOpts.position; + markerOpts.position = position; markerOpts.idx = index; var marker = self.map.addMarker(markerOpts); From 77ec241d7ba1b4cb25fbc7e64c9ff28b386022ec Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Mon, 18 May 2020 22:47:52 -0700 Subject: [PATCH 20/50] still working on DirectionsRenderer --- www/DirectionsRenderer.js | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/www/DirectionsRenderer.js b/www/DirectionsRenderer.js index 44621fff5..756353a4a 100644 --- a/www/DirectionsRenderer.js +++ b/www/DirectionsRenderer.js @@ -1,6 +1,5 @@ - var utils = require('cordova/utils'), event = require('./event'), BaseClass = require('./BaseClass'), @@ -77,6 +76,7 @@ var DirectionsRenderer = function(map, exec, options) { self.set('requestingFlag', false); self.set('routeIndex', options.routeIndex || 0, false); + self.on('directions_changed', self._redraw_panel.bind(self)); self.on('panel_changed', self._panel_changed.bind(self)); self.set('panel', options.panel); @@ -112,15 +112,31 @@ DirectionsRenderer.prototype._panel_changed = function(oldDivId, newDivId) { oldDivId.innerHTML = ''; } } + self._redraw_panel(); +}; + +DirectionsRenderer.prototype._redraw_panel = function() { + var self = this; + + var newDivId = self.get('panel'); if (newDivId) { var directions = self.get('directions'); var newDiv = document.getElementById(newDivId); if (newDiv && directions.routes.length) { + newDiv.style.position = 'relative'; var routeIndex = self.get('routeIndex'); - var shadowRoot = newDiv.attachShadow({mode: 'open'}); + var frame = document.createElement('div'); + frame.style.position = 'absolute'; + frame.style.left = '0px'; + frame.style.top = '0px'; + frame.style.bottom = '0px'; + frame.style.right = '0px'; + frame.style.width = '100%'; + frame.style.height = '100%'; + var shadowRoot = frame.attachShadow({mode: 'open'}); var style = document.createElement('style'); shadowRoot.appendChild(style); @@ -198,8 +214,9 @@ DirectionsRenderer.prototype._panel_changed = function(oldDivId, newDivId) { ul.appendChild(stepLi); }); - newDiv.innerHTML = ''; container.appendChild(ul); + newDiv.innerHTML = ''; + newDiv.appendChild(frame); } } }; @@ -212,7 +229,7 @@ DirectionsRenderer.prototype._pathList_created = function(index) { delete polylineOpts.points; polylineOpts.color = polylineOpts.color || '#0000FF'; - polylineOpts.width = ('width' in polylineOpts) ? polylineOpts.width : 10; + polylineOpts.width = ('width' in polylineOpts) ? polylineOpts.width : 5; polylineOpts.points = path; var polyline = self.map.addPolyline(polylineOpts); @@ -242,6 +259,15 @@ DirectionsRenderer.prototype._waypoint_created = function(index) { var markerOpts = Object.create(self.get('markerOptions') || {}); markerOpts.position = position; markerOpts.idx = index; + markerOpts.icon = markerOpts.icon || {}; + // if (typeof markerOpts.icon === 'object' && !markerOpts.icon.url) { + // markerOpts.icon.url = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAHdElNRQfkBRMFExpRC/42AAACY0lEQVRIx6WVv0tbYRSGny80BpWYQTBLO7Q4pAXlWqzU3UDjov+B7VSSdknc/AMcdG2HdjKboy5NwWC3WlooRdFmkBbiEBXkkpgovQm+HfwRr97EK55vuXz3vs85F855jxF3i8Ad9dxr/cpRhWOgkx46TKuvjNcv1PSdPBscUAeC9DLAGCN0Gx+Auj7xkX2e8px+IkCZbb7xkz5ekyB4FSLXKSkpS/PakRAVlVRSRULsaF6WkirJrXBV8EdvCTHLY7OnHCsUqAA9xIiTIGp+a4Z/vOOR8aygpIReyVZDC7IUcCUKyNKCGrL1UglXFRcPjpKalK2q0goJjxNSRlXZmlRSjq4BlmRpSw2lZTzlCBll1NCmLC1fBVQ1rnmJbIvszSqyEnMaV1UuwKqGtaNdWW3lCFnaVVHDWj0DnLVyniHumxzrN7buOjkemCHyl2fB0QajQJ6TGwEn5IFRNnB0AahwQD+HKvganwKH6ueASrOCI+pEqFH2BShTI0Kd4ybA+BJ6RwCgkyBluon4kkTopkyQriagh162CZuYL0CMsNmml3AT0GEGWAPiPgwqQBxYY/DcZJqNVLxVI31xN9IIfSwSNWlCbfOHSBM1i/Tx7PzqHL0sS5tqKNN2mKZbDZNwlNKEbFWVaTnO06rJ1oRSXuN8aihTstVQ1tNQsmrI1tQVQ3FZ2l+9oYNZnpg9fWaFAmUgQow4L4iaLc3g8J6H3pZ2WkVKluZUvGaqRc3JUqq9qQLUleMD+wwxesnWv/Krha23WCw/yLN+abEMMsYIXX4WSzMcHXIEdBG+7Wq7Tdx5O/8H1JclvcjQgdMAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjAtMDUtMTlUMDU6MTk6MjArMDA6MDAKWm6xAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIwLTA1LTE5VDA1OjE5OjIwKzAwOjAwewfWDQAAAABJRU5ErkJggg=='; + // markerOpts.icon.size = { + // 'width': 24, + // 'height': 24 + // }; + // markerOpts.icon.anchor = [12, 12]; + // } var marker = self.map.addMarker(markerOpts); self.bindTo('draggable', marker); @@ -296,7 +322,7 @@ DirectionsRenderer.prototype._onWaypointMoved = function(marker) { }, function(result) { // Redraw the polyline - self.set('directions', result.directions); + self.set('directions', result); var route = result.routes[routeIndex]; var leg = route.legs[0]; From 162521f94c7bd55b2b0bd9347ced43675f2f1baf Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Mon, 18 May 2020 23:16:09 -0700 Subject: [PATCH 21/50] No longer ANDROID_SUPPORT_V4_VERSION option is necessary --- README.md | 5 ----- src/android/frameworks/pgm-custom.gradle | 6 +----- www/DirectionsRenderer.js | 2 +- 3 files changed, 2 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index fdda8161b..e4966703a 100644 --- a/README.md +++ b/README.md @@ -90,11 +90,6 @@ For browser platform, _You need to specify the same version number with all other plugins._ Check out the latest version [here](https://developers.google.com/android/guides/releases). - - ![](https://raw.githubusercontent.com/mapsplugin/cordova-plugin-googlemaps/master/images/icon-android.png) **ANDROID_SUPPORT_V4_VERSION = (27.1.1)**
- This plugin requires the Android support library v4. - _The minimum version is 24.1.0._ - Check out the latest version [here](https://developer.android.com/topic/libraries/support-library/revisions.html). - - ![](https://raw.githubusercontent.com/mapsplugin/cordova-plugin-googlemaps/master/images/icon-android.png) **GOOGLE_MAPS_ANDROID_SDK = ()**
The Google Maps SDK for Android version. `i.e. GOOGLE_MAPS_ANDROID_SDK=maps-sdk-3.0.0-beta`. diff --git a/src/android/frameworks/pgm-custom.gradle b/src/android/frameworks/pgm-custom.gradle index 75d9c18ef..a3945df17 100644 --- a/src/android/frameworks/pgm-custom.gradle +++ b/src/android/frameworks/pgm-custom.gradle @@ -51,8 +51,7 @@ android { isKeyFound = 1 props.setProperty(name, value) } - if (name == "GOOGLE_MAPS_PLAY_SERVICES_VERSION" || - name == "ANDROID_SUPPORT_V4_VERSION") { + if (name == "GOOGLE_MAPS_PLAY_SERVICES_VERSION") { props.setProperty(name, value) } if (name == "GOOGLE_MAPS_ANDROID_SDK") { @@ -85,13 +84,10 @@ android { } def PLAY_SERVICES_VERSION = props.get("GOOGLE_MAPS_PLAY_SERVICES_VERSION") - def ANDROID_SUPPORT_V4_VERSION = props.get("ANDROID_SUPPORT_V4_VERSION") println("---->PLAY_SERVICES_VERSION = ${PLAY_SERVICES_VERSION}") - println("---->ANDROID_SUPPORT_V4_VERSION = ${ANDROID_SUPPORT_V4_VERSION}") dependencies { implementation "com.google.android.gms:play-services-maps:${PLAY_SERVICES_VERSION}" implementation "com.google.android.gms:play-services-location:${PLAY_SERVICES_VERSION}" - implementation "com.android.support:support-core-utils:${ANDROID_SUPPORT_V4_VERSION}" } diff --git a/www/DirectionsRenderer.js b/www/DirectionsRenderer.js index 756353a4a..d5683061b 100644 --- a/www/DirectionsRenderer.js +++ b/www/DirectionsRenderer.js @@ -101,7 +101,7 @@ DirectionsRenderer.prototype.getRouteIndex = function () { return this.get('routeIndex') || 0; }; DirectionsRenderer.prototype.getDirections = function () { - return this.get('directions') || []; + return this.get('directions') || {}; }; DirectionsRenderer.prototype._panel_changed = function(oldDivId, newDivId) { From 7242938fe4e3637bcc89723e3d7bb4e9ea3a695a Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Tue, 19 May 2020 12:17:38 -0700 Subject: [PATCH 22/50] still working on DirectionsRenderer --- www/DirectionsRenderer.js | 8 ++++++++ www/DirectionsService.js | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/www/DirectionsRenderer.js b/www/DirectionsRenderer.js index d5683061b..ab4954bcd 100644 --- a/www/DirectionsRenderer.js +++ b/www/DirectionsRenderer.js @@ -190,6 +190,14 @@ DirectionsRenderer.prototype._redraw_panel = function() { summary2.innerHTML = eta; summary.appendChild(summary2); + var copyrights = document.createElement('div'); + copyrights.style.fontSize = '0.8em'; + copyrights.style.color = 'white'; + copyrights.style.padding = '0.5em 0em'; + copyrights.style.textAlign = 'right'; + copyrights.innerHTML = directions.routes[routeIndex].copyrights; + summary.appendChild(copyrights); + container.appendChild(summary); var ul = document.createElement('ul'); diff --git a/www/DirectionsService.js b/www/DirectionsService.js index 91ccb463a..c8e35aa79 100644 --- a/www/DirectionsService.js +++ b/www/DirectionsService.js @@ -19,6 +19,10 @@ function _cnv_DirectionsLeg(leg) { if (leg.departure_time) { leg.departure_time.value = new Date(leg.departure_time.value); } + if (!step.instructions && step.html_instructions) { + step.instructions = step.html_instructions; + delete step.html_instructions; + } if (leg.steps) { leg.steps = leg.steps.map(function(step) { return _cnv_DirectionsStep(step); From 9a5490c53e43c74b260baa5659c2ba1d9459e63f Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Tue, 19 May 2020 12:17:58 -0700 Subject: [PATCH 23/50] Fix: mapOptions.preferences --- src/browser/PluginMap.js | 58 ++++++++++++++++++++------- www/Map.js | 87 +++++++++++++++++++++------------------- 2 files changed, 89 insertions(+), 56 deletions(-) diff --git a/src/browser/PluginMap.js b/src/browser/PluginMap.js index 2dcfd5c02..8c64190ea 100644 --- a/src/browser/PluginMap.js +++ b/src/browser/PluginMap.js @@ -273,34 +273,61 @@ PluginMap.prototype.setOptions = function(onSuccess, onError, args) { if (options.controls) { if (options.controls.zoom !== undefined) { - mapInitOptions.zoomControl = options.controls.zoom == true; + mapInitOptions.zoomControl = options.controls.zoom === true; } } if (options.gestures) { - mapInitOptions.draggable = options.gestures.scroll; - mapInitOptions.gestureHandling = options.gestures.scroll; - mapInitOptions.disableDoubleClickZoom = !options.gestures.zoom; + mapInitOptions.draggable = options.gestures.scroll === true; + mapInitOptions.gestureHandling = options.gestures.scroll === true; + mapInitOptions.disableDoubleClickZoom = !(options.gestures.zoom === true); } if (options.preferences) { - if (options.preferences.zoom) { - mapInitOptions.minZoom = Math.max(options.preferences.zoom || 2, 2); - if (options.preferences.zoom.maxZoom) { - mapInitOptions.maxZoom = options.preferences.zoom.maxZoom; + if ('zoom' in options.preferences) { + if (options.preferences.zoom) { + if ('minZoom' in options.preferences.zoom) { + mapInitOptions.minZoom = Math.max(options.preferences.zoom.minZoom, 2); + } else { + mapInitOptions.minZoom = undefined; + } + if ('maxZoom' in options.preferences.zoom) { + mapInitOptions.maxZoom = Math.min(options.preferences.zoom.maxZoom, 23); + } else { + mapInitOptions.maxZoom = undefined; + } + } else { + mapInitOptions.zoom = undefined; } } if ('gestureBounds' in options.preferences) { - var boundsLimit = null; - if (options.preferences.gestureBounds && options.preferences.gestureBounds.length > 0) { - boundsLimit = new google.maps.LatLngBounds(); - options.preferences.gestureBounds.forEach(function(pos) { - boundsLimit.extend(pos); - }); + if (options.preferences.gestureBounds) { + mapInitOptions.restriction = { + latLngBounds: { + south: options.preferences.gestureBounds.south, + west: options.preferences.gestureBounds.west, + north: options.preferences.gestureBounds.north, + east: options.preferences.gestureBounds.east + }, + strictBounds: false + }; + } else { + mapInitOptions.restriction = undefined; } - map.set('boundsLimit', boundsLimit); } + console.log(mapInitOptions); + // if ('gestureBounds' in options.preferences) { + // var boundsLimit = null; + // if (options.preferences.gestureBounds && options.preferences.gestureBounds.length > 0) { + // boundsLimit = new google.maps.LatLngBounds(); + // options.preferences.gestureBounds.forEach(function(pos) { + // boundsLimit.extend(pos); + // }); + // } + // map.set('boundsLimit', boundsLimit); + // } + } } map.setOptions(mapInitOptions); @@ -338,6 +365,7 @@ PluginMap.prototype.setOptions = function(onSuccess, onError, args) { onSuccess(); }; + PluginMap.prototype.setActiveMarkerId = function(onSuccess, onError, args) { var self = this, markerId = args[0]; diff --git a/www/Map.js b/www/Map.js index dc6ff3d0d..b300232f9 100644 --- a/www/Map.js +++ b/www/Map.js @@ -343,50 +343,54 @@ Map.prototype.setOptions = function(options) { // options.camera.target = cameraBounds.getCenter(); // options.camera.zoom = spherical.computeBoundsZoom(cameraBounds, div.offsetWidth, div.offsetHeight, 256); // } - if (options.preferences && options.preferences.gestureBounds) { - - var bounds = new LatLngBounds(); - if (utils.isArray(options.preferences.gestureBounds)) { - options.preferences.gestureBounds.forEach(function(ele) { - if (ele.lat && ele.lng) { - bounds.extend(ele); - } - }); - } else if (options.preferences.gestureBounds.type === 'LatLngBounds' || - options.preferences.gestureBounds.northeast && options.preferences.gestureBounds.southwest) { - bounds.extend(options.preferences.gestureBounds.southwest); - bounds.extend(options.preferences.gestureBounds.northeast); - } + if (options.preferences) { + if (options.preferences.gestureBounds) { + + var bounds = new LatLngBounds(); + if (utils.isArray(options.preferences.gestureBounds)) { + options.preferences.gestureBounds.forEach(function(ele) { + if (ele.lat && ele.lng) { + bounds.extend(ele); + } + }); + } else if (options.preferences.gestureBounds.type === 'LatLngBounds' || + options.preferences.gestureBounds.northeast && options.preferences.gestureBounds.southwest) { + bounds.extend(options.preferences.gestureBounds.southwest); + bounds.extend(options.preferences.gestureBounds.northeast); + } - if (!bounds.southwest || !bounds.northeast) { - console.warn('(setOptions) options.preferences.gestureBounds is invalid.'); - delete options.preferences.gestureBounds; - } else { - var minZoom = !div ? 0 : spherical.computeBoundsZoom(bounds, div.offsetWidth, div.offsetHeight, 256); - var maxZoom = 23; - var prefMinZoom = 0; - var prefMaxZoom = 23; - if (options.preferences.zoom) { - if (options.preferences.zoom.minZoom) { - minZoom = options.preferences.zoom.minZoom; - prefMinZoom = minZoom; - } - if (options.preferences.zoom.maxZoom) { - maxZoom = options.preferences.zoom.maxZoom; - maxZoom = minZoom; + if (!bounds.southwest || !bounds.northeast) { + console.warn('(setOptions) options.preferences.gestureBounds is invalid.'); + delete options.preferences.gestureBounds; + } else { + var minZoom = !div ? 0 : spherical.computeBoundsZoom(bounds, div.offsetWidth, div.offsetHeight, 256); + var maxZoom = 23; + var prefMinZoom = 0; + var prefMaxZoom = 23; + if (options.preferences.zoom) { + if (options.preferences.zoom.minZoom) { + minZoom = options.preferences.zoom.minZoom; + prefMinZoom = minZoom; + } + if (options.preferences.zoom.maxZoom) { + maxZoom = options.preferences.zoom.maxZoom; + maxZoom = minZoom; + } } + options.preferences.gestureBounds = { + 'south': bounds.southwest.lat, + 'west': bounds.southwest.lng, + 'north': bounds.northeast.lat, + 'east': bounds.northeast.lng, + 'prefMinZoom': prefMinZoom, + 'prefMaxZoom': prefMaxZoom, + 'minZoom': minZoom, + 'maxZoom': maxZoom + }; + self.set('restriction', options.preferences.gestureBounds); } - options.preferences.gestureBounds = { - 'south': bounds.southwest.lat, - 'west': bounds.southwest.lng, - 'north': bounds.northeast.lat, - 'east': bounds.northeast.lng, - 'prefMinZoom': prefMinZoom, - 'prefMaxZoom': prefMaxZoom, - 'minZoom': minZoom, - 'maxZoom': maxZoom - }; - self.set('restriction', options.preferences.gestureBounds); + } else { + self.set('restriction', undefined); } } @@ -399,6 +403,7 @@ Map.prototype.setOptions = function(options) { })); }; + Map.prototype.getMyLocation = function(params, success_callback, error_callback) { return window.plugin.google.maps.LocationService.getMyLocation.call(this, params, success_callback, error_callback); }; From 12fb9cf2393657f1be3544772fbb4099c0fec49a Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Tue, 19 May 2020 13:07:30 -0700 Subject: [PATCH 24/50] still working on --- README.md | 2 +- src/android/plugin/google/maps/PluginMap.java | 18 ++++---- src/browser/PluginMap.js | 39 ++++++++-------- src/ios/GoogleMaps/PluginMap.m | 6 +-- www/DirectionsService.js | 8 ++-- www/Map.js | 44 +++++++++---------- 6 files changed, 60 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index e4966703a..ec8745667 100644 --- a/README.md +++ b/README.md @@ -113,7 +113,7 @@ For browser platform, ## Release Notes - **v2.8.0** - - Add: (Android/iOS/Browser) `mapOptions.preferences.gestureBounds` + - Add: (Android/iOS/Browser) `mapOptions.preferences.restriction` - Add: (Android/iOS/Browser) ElevationService diff --git a/src/android/plugin/google/maps/PluginMap.java b/src/android/plugin/google/maps/PluginMap.java index b7133c2ec..0d17c213a 100644 --- a/src/android/plugin/google/maps/PluginMap.java +++ b/src/android/plugin/google/maps/PluginMap.java @@ -388,16 +388,16 @@ public void onClick(View v) { } - if (preferences.has("gestureBounds")) { - JSONObject gestureBounds = preferences.getJSONObject("gestureBounds"); - LatLng sw = new LatLng(gestureBounds.getDouble("south"), gestureBounds.getDouble("west")); - LatLng ne = new LatLng(gestureBounds.getDouble("north"), gestureBounds.getDouble("east")); + if (preferences.has("restriction")) { + JSONObject restriction = preferences.getJSONObject("restriction"); + LatLng sw = new LatLng(restriction.getDouble("south"), restriction.getDouble("west")); + LatLng ne = new LatLng(restriction.getDouble("north"), restriction.getDouble("east")); LatLngBounds bounds = new LatLngBounds(sw, ne); map.setLatLngBoundsForCameraTarget(bounds); - map.setMinZoomPreference((float)gestureBounds.getDouble("minZoom")); - map.setMaxZoomPreference((float)gestureBounds.getDouble("maxZoom")); + map.setMinZoomPreference((float)restriction.getDouble("minZoom")); + map.setMaxZoomPreference((float)restriction.getDouble("maxZoom")); } @@ -1340,12 +1340,12 @@ public void run() { } - if (preferences.has("gestureBounds")) { - Object target = preferences.get("gestureBounds"); + if (preferences.has("restriction")) { + Object target = preferences.get("restriction"); @SuppressWarnings("rawtypes") Class targetClass = target.getClass(); if ("org.json.JSONArray".equals(targetClass.getName())) { - JSONArray points = preferences.getJSONArray("gestureBounds"); + JSONArray points = preferences.getJSONArray("restriction"); if (points.length() > 0) { LatLngBounds bounds = PluginUtil.JSONArray2LatLngBounds(points); map.setLatLngBoundsForCameraTarget(bounds); diff --git a/src/browser/PluginMap.js b/src/browser/PluginMap.js index 8c64190ea..46b7ff919 100644 --- a/src/browser/PluginMap.js +++ b/src/browser/PluginMap.js @@ -149,13 +149,13 @@ function PluginMap(mapId, options) { } if (options.preferences) { - if (options.preferences && options.preferences.gestureBounds) { + if (options.preferences && options.preferences.restriction) { mapInitOptions.restriction = { latLngBounds: { - south: options.preferences.gestureBounds.south, - west: options.preferences.gestureBounds.west, - north: options.preferences.gestureBounds.north, - east: options.preferences.gestureBounds.east + south: options.preferences.restriction.south, + west: options.preferences.restriction.west, + north: options.preferences.restriction.north, + east: options.preferences.restriction.east }, strictBounds: false }; @@ -300,14 +300,14 @@ PluginMap.prototype.setOptions = function(onSuccess, onError, args) { } } - if ('gestureBounds' in options.preferences) { - if (options.preferences.gestureBounds) { + if ('restriction' in options.preferences) { + if (options.preferences.restriction) { mapInitOptions.restriction = { latLngBounds: { - south: options.preferences.gestureBounds.south, - west: options.preferences.gestureBounds.west, - north: options.preferences.gestureBounds.north, - east: options.preferences.gestureBounds.east + south: options.preferences.restriction.south, + west: options.preferences.restriction.west, + north: options.preferences.restriction.north, + east: options.preferences.restriction.east }, strictBounds: false }; @@ -317,11 +317,11 @@ PluginMap.prototype.setOptions = function(onSuccess, onError, args) { } console.log(mapInitOptions); - // if ('gestureBounds' in options.preferences) { + // if ('restriction' in options.preferences) { // var boundsLimit = null; - // if (options.preferences.gestureBounds && options.preferences.gestureBounds.length > 0) { + // if (options.preferences.restriction && options.preferences.restriction.length > 0) { // boundsLimit = new google.maps.LatLngBounds(); - // options.preferences.gestureBounds.forEach(function(pos) { + // options.preferences.restriction.forEach(function(pos) { // boundsLimit.extend(pos); // }); // } @@ -389,21 +389,24 @@ PluginMap.prototype.setDiv = function(onSuccess, onError, args) { // shadowRoot = self.get('shadowRoot'); if (args.length === 0) { - if (container.parentNode) { - container.parentNode.removeChild(container); + if (container.parentNode && container.parentNode.parentNode) { + container.parentNode.parentNode.removeChild(container.parentNode); } onSuccess(); } else { - if (!container.parentNode) { + // if (!container.parentNode) { var domId = args[0]; var actualMapDiv = document.querySelector('[__pluginDomId=\'' + domId + '\']'); actualMapDiv.setAttribute('__pluginMapId', self.__pgmId); actualMapDiv.style.position = 'relative'; actualMapDiv.appendChild(container); - } + container.style.width = '99%'; + // } setTimeout(function() { + container.style.width = '100%'; + google.maps.event.trigger(map, 'resize'); onSuccess(); }, 1000); } diff --git a/src/ios/GoogleMaps/PluginMap.m b/src/ios/GoogleMaps/PluginMap.m index 597e99be0..c2a3597b8 100644 --- a/src/ios/GoogleMaps/PluginMap.m +++ b/src/ios/GoogleMaps/PluginMap.m @@ -856,9 +856,9 @@ - (void)_setOptions:(NSDictionary *)initOptions requestMethod:(NSString *)reques [self.mapCtrl.map setMinZoom:minZoom maxZoom:maxZoom]; } - // gestureBounds - if ([preferences valueForKey:@"gestureBounds"]) { - NSDictionary *restriction = [preferences objectForKey:@"gestureBounds"]; + // restriction + if ([preferences valueForKey:@"restriction"]) { + NSDictionary *restriction = [preferences objectForKey:@"restriction"]; [self _setCameraRestriction:restriction]; } else { [self _setCameraRestriction:nil]; diff --git a/www/DirectionsService.js b/www/DirectionsService.js index c8e35aa79..c6a0f32cd 100644 --- a/www/DirectionsService.js +++ b/www/DirectionsService.js @@ -19,10 +19,6 @@ function _cnv_DirectionsLeg(leg) { if (leg.departure_time) { leg.departure_time.value = new Date(leg.departure_time.value); } - if (!step.instructions && step.html_instructions) { - step.instructions = step.html_instructions; - delete step.html_instructions; - } if (leg.steps) { leg.steps = leg.steps.map(function(step) { return _cnv_DirectionsStep(step); @@ -37,6 +33,10 @@ function _cnv_DirectionsStep(step) { return _cnv_DirectionsStep(s); }); } + if (!step.instructions && step.html_instructions) { + step.instructions = step.html_instructions; + delete step.html_instructions; + } if (step.transit) { if (step.transit.arrival_time) { step.transit.arrival_time.value = new Date(step.transit.arrival_time.value); diff --git a/www/Map.js b/www/Map.js index b300232f9..ff303b146 100644 --- a/www/Map.js +++ b/www/Map.js @@ -118,24 +118,24 @@ Map.prototype.getMap = function(meta, div, options) { this.set('myLocationButton', options.controls.myLocationButton === true); } - if (options.preferences && options.preferences.gestureBounds) { + if (options.preferences && options.preferences.restriction) { var bounds = new LatLngBounds(); - if (utils.isArray(options.preferences.gestureBounds)) { - options.preferences.gestureBounds.forEach(function(ele) { + if (utils.isArray(options.preferences.restriction)) { + options.preferences.restriction.forEach(function(ele) { if (ele.lat && ele.lng) { bounds.extend(ele); } }); - } else if (options.preferences.gestureBounds.type === 'LatLngBounds' || - options.preferences.gestureBounds.northeast && options.preferences.gestureBounds.southwest) { - bounds.extend(options.preferences.gestureBounds.southwest); - bounds.extend(options.preferences.gestureBounds.northeast); + } else if (options.preferences.restriction.type === 'LatLngBounds' || + options.preferences.restriction.northeast && options.preferences.restriction.southwest) { + bounds.extend(options.preferences.restriction.southwest); + bounds.extend(options.preferences.restriction.northeast); } if (!bounds.southwest || !bounds.northeast) { - console.warn('(getMap) options.preferences.gestureBounds is invalid.'); - delete options.preferences.gestureBounds; + console.warn('(getMap) options.preferences.restriction is invalid.'); + delete options.preferences.restriction; } else { var minZoom = !div ? 0 : spherical.computeBoundsZoom(bounds, div.offsetWidth, div.offsetHeight, 256); var maxZoom = 23; @@ -151,7 +151,7 @@ Map.prototype.getMap = function(meta, div, options) { maxZoom = minZoom; } } - options.preferences.gestureBounds = { + options.preferences.restriction = { 'south': bounds.southwest.lat, 'west': bounds.southwest.lng, 'north': bounds.northeast.lat, @@ -161,7 +161,7 @@ Map.prototype.getMap = function(meta, div, options) { 'minZoom': minZoom, 'maxZoom': maxZoom }; - self.set('restriction', options.preferences.gestureBounds); + self.set('restriction', options.preferences.restriction); } } @@ -344,24 +344,24 @@ Map.prototype.setOptions = function(options) { // options.camera.zoom = spherical.computeBoundsZoom(cameraBounds, div.offsetWidth, div.offsetHeight, 256); // } if (options.preferences) { - if (options.preferences.gestureBounds) { + if (options.preferences.restriction) { var bounds = new LatLngBounds(); - if (utils.isArray(options.preferences.gestureBounds)) { - options.preferences.gestureBounds.forEach(function(ele) { + if (utils.isArray(options.preferences.restriction)) { + options.preferences.restriction.forEach(function(ele) { if (ele.lat && ele.lng) { bounds.extend(ele); } }); - } else if (options.preferences.gestureBounds.type === 'LatLngBounds' || - options.preferences.gestureBounds.northeast && options.preferences.gestureBounds.southwest) { - bounds.extend(options.preferences.gestureBounds.southwest); - bounds.extend(options.preferences.gestureBounds.northeast); + } else if (options.preferences.restriction.type === 'LatLngBounds' || + options.preferences.restriction.northeast && options.preferences.restriction.southwest) { + bounds.extend(options.preferences.restriction.southwest); + bounds.extend(options.preferences.restriction.northeast); } if (!bounds.southwest || !bounds.northeast) { - console.warn('(setOptions) options.preferences.gestureBounds is invalid.'); - delete options.preferences.gestureBounds; + console.warn('(setOptions) options.preferences.restriction is invalid.'); + delete options.preferences.restriction; } else { var minZoom = !div ? 0 : spherical.computeBoundsZoom(bounds, div.offsetWidth, div.offsetHeight, 256); var maxZoom = 23; @@ -377,7 +377,7 @@ Map.prototype.setOptions = function(options) { maxZoom = minZoom; } } - options.preferences.gestureBounds = { + options.preferences.restriction = { 'south': bounds.southwest.lat, 'west': bounds.southwest.lng, 'north': bounds.northeast.lat, @@ -387,7 +387,7 @@ Map.prototype.setOptions = function(options) { 'minZoom': minZoom, 'maxZoom': maxZoom }; - self.set('restriction', options.preferences.gestureBounds); + self.set('restriction', options.preferences.restriction); } } else { self.set('restriction', undefined); From a75dac21097d9e81dc60b17d17430754d6c5b2d4 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Tue, 19 May 2020 13:58:52 -0700 Subject: [PATCH 25/50] Fix: map.preferences.restriction --- src/android/plugin/google/maps/PluginMap.java | 32 +++++++++++++++---- src/ios/GoogleMaps/PluginMap.m | 9 +++--- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/android/plugin/google/maps/PluginMap.java b/src/android/plugin/google/maps/PluginMap.java index 0d17c213a..f6c3c5cf7 100644 --- a/src/android/plugin/google/maps/PluginMap.java +++ b/src/android/plugin/google/maps/PluginMap.java @@ -1344,14 +1344,34 @@ public void run() { Object target = preferences.get("restriction"); @SuppressWarnings("rawtypes") Class targetClass = target.getClass(); - if ("org.json.JSONArray".equals(targetClass.getName())) { - JSONArray points = preferences.getJSONArray("restriction"); - if (points.length() > 0) { - LatLngBounds bounds = PluginUtil.JSONArray2LatLngBounds(points); - map.setLatLngBoundsForCameraTarget(bounds); + if ("org.json.JSONObject".equals(targetClass.getName()) && target != null) { + JSONObject restriction = preferences.getJSONObject("restriction"); + LatLngBounds.Builder builder = new LatLngBounds.Builder(); + builder.include(new LatLng(restriction.getDouble("south"), restriction.getDouble("west"))); + builder.include(new LatLng(restriction.getDouble("north"), restriction.getDouble("east"))); + map.setLatLngBoundsForCameraTarget(builder.build()); + + map.setMaxZoomPreference((float)restriction.getDouble("maxZoom")); + map.setMinZoomPreference((float)restriction.getDouble("minZoom")); + } else { + + if (preferences.has("zoom")) { + JSONObject zoom = preferences.getJSONObject("zoom"); + if (zoom.has("minZoom")) { + map.setMinZoomPreference((float)zoom.getDouble("minZoom")); + } else { + map.setMinZoomPreference(0); + } + if (zoom.has("maxZoom")) { + map.setMaxZoomPreference((float) zoom.getDouble("maxZoom")); + } else { + map.setMaxZoomPreference(23); + } } else { - map.setLatLngBoundsForCameraTarget(null); + map.setMinZoomPreference(0); + map.setMaxZoomPreference(23); } + map.setLatLngBoundsForCameraTarget(null); } } diff --git a/src/ios/GoogleMaps/PluginMap.m b/src/ios/GoogleMaps/PluginMap.m index c2a3597b8..3fd3a6b7a 100644 --- a/src/ios/GoogleMaps/PluginMap.m +++ b/src/ios/GoogleMaps/PluginMap.m @@ -857,11 +857,12 @@ - (void)_setOptions:(NSDictionary *)initOptions requestMethod:(NSString *)reques } // restriction - if ([preferences valueForKey:@"restriction"]) { + NSDictionary *restriction = [preferences valueForKey:@"restriction"]; + if (restriction == (id)[NSNull null]) { + [self _setCameraRestriction:nil]; + } else { NSDictionary *restriction = [preferences objectForKey:@"restriction"]; [self _setCameraRestriction:restriction]; - } else { - [self _setCameraRestriction:nil]; } } @@ -922,7 +923,7 @@ - (void)_setOptions:(NSDictionary *)initOptions requestMethod:(NSString *)reques }; - (void)_setCameraRestriction:(NSDictionary *)params { - if (params == (id)[NSNull null]) { + if (params == (id)[NSNull null] || params == nil) { self.mapCtrl.map.cameraTargetBounds = nil; double minZoom = 0; double maxZoom = 23; From 73adf5a314e463c39fae88e32260d35558ae25c1 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Tue, 19 May 2020 20:01:01 -0700 Subject: [PATCH 26/50] (Android / iOS / browser) Add: Ability to change clickability of POI #2779 --- src/android/plugin/google/maps/PluginMap.java | 26 +++++++++++++++++-- src/browser/PluginMap.js | 21 +++++++-------- src/ios/GoogleMaps/PluginMap.m | 5 ++++ 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/src/android/plugin/google/maps/PluginMap.java b/src/android/plugin/google/maps/PluginMap.java index f6c3c5cf7..d55362e42 100644 --- a/src/android/plugin/google/maps/PluginMap.java +++ b/src/android/plugin/google/maps/PluginMap.java @@ -99,6 +99,7 @@ public class PluginMap extends MyPlugin implements OnMarkerClickListener, private String mapId; private boolean isVisible = true; private boolean isClickable = true; + private boolean clickableIcons = true; private final String TAG = mapId; private String mapDivId; public Map plugins = new ConcurrentHashMap(); @@ -412,6 +413,15 @@ public void onClick(View v) { } + if (preferences.has("clickableIcons")) { + clickableIcons = preferences.getBoolean("clickableIcons"); + } + + + if (preferences.has("building")) { + map.setBuildingsEnabled(preferences.getBoolean("building")); + } + } // Set event listener @@ -1339,6 +1349,13 @@ public void run() { } } + if (preferences.has("building")) { + map.setBuildingsEnabled(preferences.getBoolean("building")); + } + + if (preferences.has("clickableIcons")) { + clickableIcons = preferences.getBoolean("clickableIcons"); + } if (preferences.has("restriction")) { Object target = preferences.get("restriction"); @@ -1360,7 +1377,7 @@ public void run() { if (zoom.has("minZoom")) { map.setMinZoomPreference((float)zoom.getDouble("minZoom")); } else { - map.setMinZoomPreference(0); + map.setMinZoomPreference(2); } if (zoom.has("maxZoom")) { map.setMaxZoomPreference((float) zoom.getDouble("maxZoom")); @@ -1368,7 +1385,7 @@ public void run() { map.setMaxZoomPreference(23); } } else { - map.setMinZoomPreference(0); + map.setMinZoomPreference(2); map.setMaxZoomPreference(23); } map.setLatLngBoundsForCameraTarget(null); @@ -2961,6 +2978,11 @@ public void onIndoorLevelActivated(IndoorBuilding building) { } @Override public void onPoiClick(PointOfInterest pointOfInterest) { + if (!this.clickableIcons) { + this.onMapClick(pointOfInterest.latLng); + return; + } + String js = String.format(Locale.ENGLISH, "javascript:if('%s' in plugin.google.maps){plugin.google.maps['%s']({evtName: '%s', callback:'_onMapEvent', args:['%s', \"%s\", new plugin.google.maps.LatLng(%f, %f)]});}", mapId, mapId, "poi_click", pointOfInterest.placeId, pointOfInterest.name, pointOfInterest.latLng.latitude, pointOfInterest.latLng.longitude); jsCallback(js); diff --git a/src/browser/PluginMap.js b/src/browser/PluginMap.js index 46b7ff919..fe9bdbc56 100644 --- a/src/browser/PluginMap.js +++ b/src/browser/PluginMap.js @@ -125,7 +125,8 @@ function PluginMap(mapId, options) { minZoom: 2, disableDefaultUI: true, zoomControl: true, - center: {lat: 0, lng: 0} + center: {lat: 0, lng: 0}, + clickableIcons: true }; if (options) { @@ -167,6 +168,10 @@ function PluginMap(mapId, options) { mapInitOptions.maxZoom = options.preferences.zoom.maxZoom; } } + + if ('clickableIcons' in options.preferences) { + mapInitOptions.clickableIcons = options.preferences.clickableIcons === true; + } } } @@ -316,17 +321,9 @@ PluginMap.prototype.setOptions = function(onSuccess, onError, args) { } } - console.log(mapInitOptions); - // if ('restriction' in options.preferences) { - // var boundsLimit = null; - // if (options.preferences.restriction && options.preferences.restriction.length > 0) { - // boundsLimit = new google.maps.LatLngBounds(); - // options.preferences.restriction.forEach(function(pos) { - // boundsLimit.extend(pos); - // }); - // } - // map.set('boundsLimit', boundsLimit); - // } + if ('clickableIcons' in options.preferences) { + mapInitOptions.clickableIcons = options.preferences.clickableIcons === true; + } } } diff --git a/src/ios/GoogleMaps/PluginMap.m b/src/ios/GoogleMaps/PluginMap.m index 3fd3a6b7a..8ae19a165 100644 --- a/src/ios/GoogleMaps/PluginMap.m +++ b/src/ios/GoogleMaps/PluginMap.m @@ -864,6 +864,11 @@ - (void)_setOptions:(NSDictionary *)initOptions requestMethod:(NSString *)reques NSDictionary *restriction = [preferences objectForKey:@"restriction"]; [self _setCameraRestriction:restriction]; } + + // building + if ([preferences valueForKey:@"building"] != nil) { + self.mapCtrl.map.buildingsEnabled = [[preferences valueForKey:@"building"] boolValue]; + } } //styles From aee5f5b82277485023f23fbfc2878741d049bc98 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Tue, 19 May 2020 20:08:39 -0700 Subject: [PATCH 27/50] Update: README.md --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ec8745667..613c8ae9b 100644 --- a/README.md +++ b/README.md @@ -113,9 +113,13 @@ For browser platform, ## Release Notes - **v2.8.0** - - Add: (Android/iOS/Browser) `mapOptions.preferences.restriction` + - Add: (Android/iOS/Browser) `mapOptions.preferences.restriction` which is able to set the camera bounds. + - Add: (Android/iOS/Browser) `mapOptions.preferences.clickableIcons` which is able to be disable clicking on POI icons. + - Bug fix: (Android/iOS/Browser) `mapOptions.preferences.building` does not work. - Add: (Android/iOS/Browser) ElevationService - + - Add: (Android/iOS/Browser) DirectionsService + - Add: (Android/iOS/Browser) `map.addDirectionsRenderer()` + - Change: (Android/iOS/Browser) `map.setDiv()`, `map.setOptions()` returns `Promise`. --------------------------------------------------------------------------------------------------------- From a2bab103eda47cbfca63d91a3e9591da4b1e6252 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Tue, 19 May 2020 20:25:48 -0700 Subject: [PATCH 28/50] (Android) Fix: some property remains #2778 --- src/android/plugin/google/maps/PluginCircle.java | 10 +++++++--- .../plugin/google/maps/PluginGroundOverlay.java | 1 + src/android/plugin/google/maps/PluginMarker.java | 3 +++ src/android/plugin/google/maps/PluginPolyline.java | 4 ++++ 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/android/plugin/google/maps/PluginCircle.java b/src/android/plugin/google/maps/PluginCircle.java index 8b53685a1..58b888a78 100644 --- a/src/android/plugin/google/maps/PluginCircle.java +++ b/src/android/plugin/google/maps/PluginCircle.java @@ -253,13 +253,17 @@ public void remove(final JSONArray args, final CallbackContext callbackContext) callbackContext.success(); return; } + + if (pluginMap.objects != null) { + pluginMap.objects.remove("circle_" + circleHashCode); + pluginMap.objects.remove("circle_property_" + circleHashCode); + pluginMap.objects.remove("circle_property_" + circleHashCode); + } + cordova.getActivity().runOnUiThread(new Runnable() { @Override public void run() { circle.remove(); - if (pluginMap.objects != null) { - pluginMap.objects.remove(id); - } callbackContext.success(); } }); diff --git a/src/android/plugin/google/maps/PluginGroundOverlay.java b/src/android/plugin/google/maps/PluginGroundOverlay.java index e5ba35e4d..229bf5694 100644 --- a/src/android/plugin/google/maps/PluginGroundOverlay.java +++ b/src/android/plugin/google/maps/PluginGroundOverlay.java @@ -207,6 +207,7 @@ public void remove(JSONArray args, final CallbackContext callbackContext) throws } synchronized (pluginMap.objects) { + pluginMap.objects.remove(id); pluginMap.objects.remove(id.replace("groundoverlay_", "groundoverlay_property_")); pluginMap.objects.remove(id.replace("groundoverlay_", "groundoverlay_initOpts_")); pluginMap.objects.remove(id.replace("groundoverlay_", "groundoverlay_bounds_")); diff --git a/src/android/plugin/google/maps/PluginMarker.java b/src/android/plugin/google/maps/PluginMarker.java index 0c9f6f7a8..cb9338f15 100644 --- a/src/android/plugin/google/maps/PluginMarker.java +++ b/src/android/plugin/google/maps/PluginMarker.java @@ -855,6 +855,9 @@ public void remove(final JSONArray args, final CallbackContext callbackContext) String propertyId = "marker_property_" + id; pluginMap.objects.remove(propertyId); + String imageSizeKey = "marker_imageSize_" + id; + pluginMap.objects.remove(imageSizeKey); + cordova.getActivity().runOnUiThread(new Runnable() { @Override public void run() { diff --git a/src/android/plugin/google/maps/PluginPolyline.java b/src/android/plugin/google/maps/PluginPolyline.java index 7c86918fb..95643eb8d 100644 --- a/src/android/plugin/google/maps/PluginPolyline.java +++ b/src/android/plugin/google/maps/PluginPolyline.java @@ -166,6 +166,10 @@ public void remove(final JSONArray args, final CallbackContext callbackContext) id = "polyline_bounds_" + polylineHashCode; pluginMap.objects.remove(id); + String propertyKey = "polyline_property_" + polylineHashCode; + pluginMap.objects.remove(propertyKey); + + cordova.getActivity().runOnUiThread(new Runnable() { @Override public void run() { From 31116c435442704347eb824bbb20fd9330b4f0a5 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Tue, 19 May 2020 20:47:36 -0700 Subject: [PATCH 29/50] Remove debug code --- src/browser/PluginGroundOverlay.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/browser/PluginGroundOverlay.js b/src/browser/PluginGroundOverlay.js index 4ea07f715..1b20f83c3 100644 --- a/src/browser/PluginGroundOverlay.js +++ b/src/browser/PluginGroundOverlay.js @@ -257,14 +257,14 @@ function CustomGroundOverlay(url, bounds, options) { }); self.set('touchPolygon', touchPolygon); - var markers = []; - for (var i = 0; i < 4; i++) { - markers.push(new google.maps.Marker({ - 'position': {'lat': 0, 'lng': 0}, - 'map': options.map - })); - } - self.set('markers', markers); + // var markers = []; + // for (var i = 0; i < 4; i++) { + // markers.push(new google.maps.Marker({ + // 'position': {'lat': 0, 'lng': 0}, + // 'map': options.map + // })); + // } + // self.set('markers', markers); //--------------------------------------------------------- From 210b68fa2ad0a5f912d6f8d4a7082ab5bc25aeb9 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Wed, 20 May 2020 00:05:50 -0700 Subject: [PATCH 30/50] (Android / iOS) Bug fix: Can not interactive with map after `map.off()` --- www/BaseClass.js | 36 +++++++++++++++---- www/Map.js | 17 ++++++--- www/js_CordovaGoogleMaps-for-android_ios.js | 39 ++++++++++++++++++--- 3 files changed, 77 insertions(+), 15 deletions(-) diff --git a/www/BaseClass.js b/www/BaseClass.js index 94c908332..8065bbe70 100644 --- a/www/BaseClass.js +++ b/www/BaseClass.js @@ -1,3 +1,4 @@ + var VARS_FIELD = typeof Symbol === 'undefined' ? '__vars' + Date.now() : Symbol('vars'); var SUBSCRIPTIONS_FIELD = typeof Symbol === 'undefined' ? '__subs' + Date.now() : Symbol('subscriptions'); @@ -136,21 +137,42 @@ BaseClass.prototype = { }, off: function (eventName, listener) { + var self = this; if (!eventName && !listener) { - this[SUBSCRIPTIONS_FIELD] = {}; - return this; + var eventNames = Object.keys(self[SUBSCRIPTIONS_FIELD]); + eventNames.forEach(function(evtName) { + var keys = Object.keys(self[SUBSCRIPTIONS_FIELD][evtName]); + keys.forEach(function(_hashCode) { + var info = self[SUBSCRIPTIONS_FIELD][evtName][_hashCode]; + if (!info.listener._protect) { + delete self[SUBSCRIPTIONS_FIELD][evtName][_hashCode]; + } + }); + }); + return self; } if (eventName && !listener) { - this[SUBSCRIPTIONS_FIELD][eventName] = null; - delete this[SUBSCRIPTIONS_FIELD][eventName]; - } else if (this[SUBSCRIPTIONS_FIELD][eventName] && listener._hashCode) { - delete this[SUBSCRIPTIONS_FIELD][eventName][listener._hashCode]; + var keys = Object.keys(self[SUBSCRIPTIONS_FIELD][eventName]); + keys.forEach(function(_hashCode) { + var info = self[SUBSCRIPTIONS_FIELD][eventName][_hashCode]; + if (!info.listener._protect) { + delete self[SUBSCRIPTIONS_FIELD][eventName][_hashCode]; + } + }); + if (self[SUBSCRIPTIONS_FIELD][eventName].length === 0) { + delete self[SUBSCRIPTIONS_FIELD][eventName]; + } + } else if (self[SUBSCRIPTIONS_FIELD][eventName] && listener._hashCode) { + if (!self[SUBSCRIPTIONS_FIELD][eventName][listener._hashCode].listener._protect) { + delete self[SUBSCRIPTIONS_FIELD][eventName][listener._hashCode]; + } } - return this; + return self; }, + one: function (eventName, listener) { if (!listener || typeof listener !== 'function') { throw Error('Listener for one()/addEventListenerOnce() method is not a function'); diff --git a/www/Map.js b/www/Map.js index ff303b146..df10f2724 100644 --- a/www/Map.js +++ b/www/Map.js @@ -28,6 +28,14 @@ var utils = require('cordova/utils'), * Google Maps model. */ var exec; +var _protect = function(listener) { + Object.defineProperty(listener, '_protect', { + enumerable: false, + value: true, + writable: false + }); + return listener; +} var Map = function(__pgmId, _exec) { var self = this; exec = _exec; @@ -75,17 +83,17 @@ var Map = function(__pgmId, _exec) { writable: false }); - self.on(event.MAP_CLICK, function() { + self.on(event.MAP_CLICK, _protect(function() { self.set('active_marker', undefined); - }); + })); - self.on('active_marker_changed', function(prevMarker, newMarker) { + self.on('active_marker_changed', _protect(function(prevMarker, newMarker) { var newMarkerId = newMarker ? newMarker.getId() : null; if (prevMarker) { prevMarker.hideInfoWindow.call(prevMarker); } self.exec.call(self, null, null, self.__pgmId, 'setActiveMarkerId', [newMarkerId]); - }); + })); }; utils.extend(Map, Overlay); @@ -844,6 +852,7 @@ Map.prototype.remove = function(callback) { clearObj(self.OVERLAYS); clearObj(self.MARKERS); + self[SUBSCRIPTIONS_FIELD] = null; var resolver = function(resolve, reject) { diff --git a/www/js_CordovaGoogleMaps-for-android_ios.js b/www/js_CordovaGoogleMaps-for-android_ios.js index a3c40ae9a..15bd154cb 100644 --- a/www/js_CordovaGoogleMaps-for-android_ios.js +++ b/www/js_CordovaGoogleMaps-for-android_ios.js @@ -700,17 +700,23 @@ CordovaGoogleMaps.prototype.getMap = function(div, mapOptions) { // (Don't execute this native callback from your code) window.plugin.google.maps[mapId] = nativeCallback.bind(map); - map.on('__isAttached_changed', function(oldValue, newValue) { + var __isAttached_changed_callback = function(oldValue, newValue) { if (newValue) { cordova_exec(null, null, map.__pgmId, 'attachToWebView', []); } else { cordova_exec(null, null, map.__pgmId, 'detachFromWebView', []); } + }; + Object.defineProperty(__isAttached_changed_callback, '_protect', { + enumerable: false, + value: true, + writable: false }); + map.on('__isAttached_changed', __isAttached_changed_callback); // If the mapDiv is changed, clean up the information for old map div, // then add new information for new map div. - map.on('div_changed', function(oldDiv, newDiv) { + var onDivChanged = function(oldDiv, newDiv) { var elemId, ele; if (common.isDom(oldDiv)) { @@ -770,10 +776,26 @@ CordovaGoogleMaps.prototype.getMap = function(div, mapOptions) { elemId = common.getPluginDomId(newDiv); self.domPositions[elemId].isMap = true; } + }; + + Object.defineProperty(onDivChanged, '_protect', { + enumerable: false, + value: true, + writable: false }); + map.on('div_changed', onDivChanged); // If the map is removed, clean up the information. - map.one('remove', self._remove.bind(self, mapId)); + var onRemove = function(mapId) { + self._remove.call(self, mapId); + }; + + Object.defineProperty(onRemove, '_protect', { + enumerable: false, + value: true, + writable: false + }); + map.one('remove', onRemove); self.MAP_CNT++; self.isThereAnyChange = true; @@ -807,7 +829,16 @@ CordovaGoogleMaps.prototype.getPanorama = function(div, streetViewOptions) { self.MAP_CNT++; - panorama.one('remove', self._remove.bind(self, mapId)); + var onRemove = function(mapId) { + self._remove.call(self, mapId) + }; + Object.defineProperty(onRemove, '_protect', { + enumerable: false, + value: true, + writable: false + }); + + panorama.one('remove', onRemove); if (div instanceof Promise) { // This hack code for @ionic-native/google-maps From 93e3e5322397bced5e11b1a812cf09c0c8286368 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Wed, 20 May 2020 00:06:39 -0700 Subject: [PATCH 31/50] (Android) bug fix: can not reset the `zoom` and `restriction` parameters of `mapOptions.preferences`. --- package.json | 2 +- plugin.xml | 2 +- .../plugin/google/maps/CordovaGoogleMaps.java | 2 +- src/android/plugin/google/maps/PluginMap.java | 27 ++++++++++--------- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 1941217d0..5f82bbe18 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-googlemaps", - "version": "2.8.0-20200518-2212", + "version": "2.8.0-20200520-0004", "description": "Google Maps native SDK for Android and iOS, and Google Maps JavaScript API v3 for browser.", "cordova": { "id": "cordova-plugin-googlemaps", diff --git a/plugin.xml b/plugin.xml index a13dafaa2..dcb9b953d 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - + cordova-plugin-googlemaps diff --git a/src/android/plugin/google/maps/CordovaGoogleMaps.java b/src/android/plugin/google/maps/CordovaGoogleMaps.java index 7e965dcee..0b26f29b2 100644 --- a/src/android/plugin/google/maps/CordovaGoogleMaps.java +++ b/src/android/plugin/google/maps/CordovaGoogleMaps.java @@ -60,7 +60,7 @@ public void initialize(final CordovaInterface cordova, final CordovaWebView webV if (root != null) { return; } - LOG.setLogLevel(LOG.ERROR); + LOG.setLogLevel(LOG.DEBUG); activity = cordova.getActivity(); final View view = webView.getView(); diff --git a/src/android/plugin/google/maps/PluginMap.java b/src/android/plugin/google/maps/PluginMap.java index d55362e42..b7e95e05f 100644 --- a/src/android/plugin/google/maps/PluginMap.java +++ b/src/android/plugin/google/maps/PluginMap.java @@ -1340,12 +1340,17 @@ public void run() { } if (preferences.has("zoom")) { - JSONObject zoom = preferences.getJSONObject("zoom"); - if (zoom.has("minZoom")) { - map.setMinZoomPreference((float)zoom.getDouble("minZoom")); - } - if (zoom.has("maxZoom")) { - map.setMaxZoomPreference((float)zoom.getDouble("maxZoom")); + if (!"null".equals(preferences.getString("zoom"))) { + JSONObject zoom = preferences.getJSONObject("zoom"); + if (zoom.has("minZoom")) { + map.setMinZoomPreference((float) zoom.getDouble("minZoom")); + } + if (zoom.has("maxZoom")) { + map.setMaxZoomPreference((float) zoom.getDouble("maxZoom")); + } + } else { + map.setMinZoomPreference(2); + map.setMaxZoomPreference(23); } } @@ -1358,10 +1363,8 @@ public void run() { } if (preferences.has("restriction")) { - Object target = preferences.get("restriction"); - @SuppressWarnings("rawtypes") - Class targetClass = target.getClass(); - if ("org.json.JSONObject".equals(targetClass.getName()) && target != null) { + if (!"null".equals(preferences.getString("restriction"))) { + JSONObject restriction = preferences.getJSONObject("restriction"); LatLngBounds.Builder builder = new LatLngBounds.Builder(); builder.include(new LatLng(restriction.getDouble("south"), restriction.getDouble("west"))); @@ -1372,10 +1375,10 @@ public void run() { map.setMinZoomPreference((float)restriction.getDouble("minZoom")); } else { - if (preferences.has("zoom")) { + if (preferences.has("zoom") && !"null".equals(preferences.getString("zoom"))) { JSONObject zoom = preferences.getJSONObject("zoom"); if (zoom.has("minZoom")) { - map.setMinZoomPreference((float)zoom.getDouble("minZoom")); + map.setMinZoomPreference((float) zoom.getDouble("minZoom")); } else { map.setMinZoomPreference(2); } From e6342dd422d4e15302efe802f72d000f82ae077b Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Thu, 21 May 2020 20:51:33 -0700 Subject: [PATCH 32/50] Hide `__pluginDomId` and `__pluginMapId` --- README.md | 4 +- package.json | 2 +- plugin.xml | 2 +- src/browser/CordovaGoogleMaps.js | 30 ++++---- src/browser/PluginMap.js | 50 +++++++++---- src/browser/PluginStreetViewPanorama.js | 6 +- www/Common.js | 11 +-- www/Map.js | 10 ++- www/js_CordovaGoogleMaps-for-android_ios.js | 78 +++++++++++++++------ www/js_CordovaGoogleMaps-for-browser.js | 44 +++++++++--- 10 files changed, 166 insertions(+), 71 deletions(-) diff --git a/README.md b/README.md index 613c8ae9b..95ee79660 100644 --- a/README.md +++ b/README.md @@ -117,9 +117,9 @@ For browser platform, - Add: (Android/iOS/Browser) `mapOptions.preferences.clickableIcons` which is able to be disable clicking on POI icons. - Bug fix: (Android/iOS/Browser) `mapOptions.preferences.building` does not work. - Add: (Android/iOS/Browser) ElevationService - - Add: (Android/iOS/Browser) DirectionsService - - Add: (Android/iOS/Browser) `map.addDirectionsRenderer()` + - Add: (Android/iOS/Browser) DirectionsService and `map.addDirectionsRenderer()` - Change: (Android/iOS/Browser) `map.setDiv()`, `map.setOptions()` returns `Promise`. + - Change: (Android/iOS/Browser) Hides `__pluginDomId` and `__pluginMapId` properties. --------------------------------------------------------------------------------------------------------- diff --git a/package.json b/package.json index 5f82bbe18..27eee6fd4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-googlemaps", - "version": "2.8.0-20200520-0004", + "version": "2.8.0-20200521-2050", "description": "Google Maps native SDK for Android and iOS, and Google Maps JavaScript API v3 for browser.", "cordova": { "id": "cordova-plugin-googlemaps", diff --git a/plugin.xml b/plugin.xml index dcb9b953d..03ae6f7c8 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - + cordova-plugin-googlemaps diff --git a/src/browser/CordovaGoogleMaps.js b/src/browser/CordovaGoogleMaps.js index 399393039..51dbdb302 100644 --- a/src/browser/CordovaGoogleMaps.js +++ b/src/browser/CordovaGoogleMaps.js @@ -71,13 +71,16 @@ var CordovaGoogleMaps = { // memory cleanup var mapIDs = Object.keys(MAPS); mapIDs.forEach(function(mapId) { - var mapDivId = document.querySelector('[__pluginmapid=\'' + mapId + '\']'); - if (!mapDivId) { - if (MAPS[mapDivId]) { - MAPS[mapDivId].destroy(); + var eles = Array.from(document.querySelectorAll('*')); + eles = eles.filter(function(e) { + return e.__pluginMapId === mapId; + }); + if (eles.length === 0) { + if (MAPS[mapId]) { + MAPS[mapId].destroy(); } - MAPS[mapDivId] = undefined; - delete MAPS[mapDivId]; + MAPS[mapId] = undefined; + delete MAPS[mapId]; } }); @@ -135,13 +138,16 @@ var CordovaGoogleMaps = { // memory cleanup var mapIDs = Object.keys(MAPS); mapIDs.forEach(function(mapId) { - var mapDivId = document.querySelector('[__pluginmapid=\'' + mapId + '\']'); - if (!mapDivId) { - if (MAPS[mapDivId]) { - MAPS[mapDivId].destroy(); + var eles = Array.from(document.querySelectorAll('*')); + eles = eles.filter(function(e) { + return e.__pluginMapId === mapId; + }); + if (eles.length === 0) { + if (MAPS[mapId]) { + MAPS[mapId].destroy(); } - MAPS[mapDivId] = undefined; - delete MAPS[mapDivId]; + MAPS[mapId] = undefined; + delete MAPS[mapId]; } }); diff --git a/src/browser/PluginMap.js b/src/browser/PluginMap.js index fe9bdbc56..fb7a0fbd7 100644 --- a/src/browser/PluginMap.js +++ b/src/browser/PluginMap.js @@ -42,7 +42,14 @@ function displayGrayMap(container) { function PluginMap(mapId, options) { var self = this; BaseClass.apply(this); - var actualMapDiv = document.querySelector('[__pluginMapId=\'' + mapId + '\']'); + var eles = Array.from(document.querySelectorAll('*')); + eles = eles.filter(function(e) { + return e.__pluginMapId === mapId; + }); + var actualMapDiv = null; + if (eles.length === 1) { + actualMapDiv = eles[0]; + } var container = document.createElement('div'); container.style.userSelect='none'; @@ -54,7 +61,7 @@ function PluginMap(mapId, options) { container.style.bottom = 0; container.style.right = 0; container.style.left = 0; - actualMapDiv.appendChild(container); + actualMapDiv.insertBefore(container, actualMapDiv.firstElementChild); var shadowRoot = container.attachShadow({mode: 'open'}); @@ -228,7 +235,7 @@ function PluginMap(mapId, options) { options.camera.target.forEach(function(pos) { bounds.extend(pos); }); - map.fitBounds(bounds, 5); + map.fitBounds(bounds, 'padding' in options.camera ? options.camera.padding || 0 : 5); } else { map.setCenter(options.camera.target); } @@ -384,6 +391,10 @@ PluginMap.prototype.setDiv = function(onSuccess, onError, args) { map = self.get('map'), container = self.get('container'); // shadowRoot = self.get('shadowRoot'); + if (!container) { + onError('[map.setDiv] container is undefined'); + return; + } if (args.length === 0) { if (container.parentNode && container.parentNode.parentNode) { @@ -392,20 +403,29 @@ PluginMap.prototype.setDiv = function(onSuccess, onError, args) { onSuccess(); } else { - // if (!container.parentNode) { + if (container.parentNode && !container.parentNode.parentNode) { var domId = args[0]; - var actualMapDiv = document.querySelector('[__pluginDomId=\'' + domId + '\']'); - actualMapDiv.setAttribute('__pluginMapId', self.__pgmId); + var eles = Array.from(document.querySelectorAll('*')); + eles = eles.filter(function(e) { + return e.__pluginDomId === domId; + }); + var actualMapDiv = eles[0]; + Object.defineProperty(actualMapDiv, '__pluginMapId', { + enumerable: false, + value: self.__pgmId + }); actualMapDiv.style.position = 'relative'; - actualMapDiv.appendChild(container); - container.style.width = '99%'; - // } - - setTimeout(function() { - container.style.width = '100%'; - google.maps.event.trigger(map, 'resize'); - onSuccess(); - }, 1000); + actualMapDiv.insertBefore(container, actualMapDiv.firstElementChild); + + var offsetHeight = container.offsetHeight; + container.offsetHeight = offsetHeight - 1; + setTimeout(function() { + container.offsetHeight = offsetHeight; + google.maps.event.trigger(map, 'resize'); + }, 1000); + } + + onSuccess(); } }; diff --git a/src/browser/PluginStreetViewPanorama.js b/src/browser/PluginStreetViewPanorama.js index c5d45350f..33d3644a1 100644 --- a/src/browser/PluginStreetViewPanorama.js +++ b/src/browser/PluginStreetViewPanorama.js @@ -21,7 +21,11 @@ function displayGrayMap(container) { function PluginStreetViewPanorama(panoramaId, options) { var self = this; BaseClass.apply(this); - var panoramaDiv = document.querySelector('[__pluginMapId=\'' + panoramaId + '\']'); + var eles = Array.from(document.querySelectorAll('*')); + eles = eles.filter(function(e) { + return e.__pluginMapId === panoramaId; + }); + var panoramaDiv = eles[0]; panoramaDiv.style.backgroundColor = 'rgb(229, 227, 223)'; var container = document.createElement('div'); container.style.userSelect='none'; diff --git a/www/Common.js b/www/Common.js index 4788a5d59..8fe8a8cf1 100644 --- a/www/Common.js +++ b/www/Common.js @@ -302,11 +302,11 @@ function getZIndex(dom) { if (dom.currentStyle) { z = dom.currentStyle['z-index']; } - var elemId = dom.getAttribute('__pluginDomId'); + var elemId = dom.__pluginDomId; var parentNode = dom.parentNode; var parentZIndex = 0; if (parentNode && parentNode.nodeType === Node.ELEMENT_NODE) { - var parentElemId = parentNode.getAttribute('__pluginDomId'); + var parentElemId = parentNode.__pluginDomId; if (parentElemId in internalCache) { parentZIndex = internalCache[parentElemId]; } else { @@ -684,14 +684,17 @@ function getPluginDomId(element) { if (!element || !shouldWatchByNative(element)) { return; } - var elemId = element.getAttribute('__pluginDomId'); + var elemId = element.__pluginDomId; if (!elemId) { if (element === document.body) { elemId = 'root'; } else { elemId = 'pgm' + Math.floor(Math.random() * Date.now()); } - element.setAttribute('__pluginDomId', elemId); + Object.defineProperty(element, '__pluginDomId', { + enumerable: false, + value: elemId + }); } return elemId; } diff --git a/www/Map.js b/www/Map.js index df10f2724..2bc786cae 100644 --- a/www/Map.js +++ b/www/Map.js @@ -917,11 +917,17 @@ Map.prototype.setDiv = function(div) { if (!common.isDom(div)) { div = self.get('div'); if (common.isDom(div)) { - div.removeAttribute('__pluginMapId'); + Object.defineProperty(div, '__pluginMapId', { + enumerable: false, + value: undefined + }); } self.set('div', null); } else { - div.setAttribute('__pluginMapId', self.__pgmId); + Object.defineProperty(div, '__pluginMapId', { + enumerable: false, + value: self.__pgmId + }); // Insert the infoWindow layer if (self._layers.info.parentNode) { diff --git a/www/js_CordovaGoogleMaps-for-android_ios.js b/www/js_CordovaGoogleMaps-for-android_ios.js index 15bd154cb..e839d9e11 100644 --- a/www/js_CordovaGoogleMaps-for-android_ios.js +++ b/www/js_CordovaGoogleMaps-for-android_ios.js @@ -75,7 +75,7 @@ function CordovaGoogleMaps(execCmd) { // If some elements are removed from the DOM tree, remove their information. if (mutation.removedNodes) { Array.prototype.slice.call(mutation.removedNodes, 0).forEach(function(node) { - if (node.nodeType !== Node.ELEMENT_NODE || !node.hasAttribute('__pluginDomId')) { + if (node.nodeType !== Node.ELEMENT_NODE || !node.__pluginDomId) { return; } node._isRemoved = true; @@ -88,7 +88,7 @@ function CordovaGoogleMaps(execCmd) { if (mutation.target.nodeType !== Node.ELEMENT_NODE) { return; } - if (mutation.target.hasAttribute('__pluginDomId')) { + if (mutation.target.__pluginDomId) { // elemId = mutation.target.getAttribute('__pluginDomId'); var transformCSS = common.getStyle(mutation.target, 'transform') || common.getStyle(mutation.target, '-webkit-transform') || @@ -157,7 +157,7 @@ CordovaGoogleMaps.prototype.traceDomTree = function(element, elemId, isMapChild) pointerEvents: common.getStyle(element, 'pointer-events'), // Only true if element is mapDiv - isMap: element.hasAttribute('__pluginMapId'), + isMap: element.__pluginMapId !== undefined, // Calculate dom clickable region size: common.getDivRect(element), @@ -304,7 +304,7 @@ CordovaGoogleMaps.prototype.putHtmlElements = function() { } // Does this dom is really existed? - var elemId = div.getAttribute('__pluginDomId'); + var elemId = div.__pluginDomId; if (!elemId) { // The map div is removed if (mapId in self.MAPS) { @@ -316,8 +316,11 @@ CordovaGoogleMaps.prototype.putHtmlElements = function() { if (!(elemId in self.domPositions)) { // Is the map div removed? - var ele = document.querySelector('[__pluginMapId="' + mapId + '"]'); - if (!ele) { + var eles = Array.from(document.querySelectorAll('*')); + eles = eles.filter(function(e) { + return e.__pluginMapId === mapId; + }); + if (eles.length === 0) { // If no div element, remove the map. if (mapId in self.MAPS) { self.MAPS[mapId].remove(); @@ -417,7 +420,7 @@ CordovaGoogleMaps.prototype.onTransitionEnd = function(evt) { target = document.body; } target = target.getAttribute === 'function' ? target : document.body; - var elemId = target.getAttribute('__pluginDomId'); + var elemId = target.__pluginDomId; self.transformTargets[elemId] = {left: -1, top: -1, right: -1, bottom: -1, finish: false, target: target}; if (!self.transitionEndTimer) { self.transitionEndTimer = setTimeout(self.detectTransitionFinish.bind(self), 100); @@ -503,7 +506,10 @@ CordovaGoogleMaps.prototype.removeDomTree = function(node) { // Remove the information of children // which have the `__pluginDomId` attribute. - var nodeList = node.querySelectorAll('[__pluginDomId]'); + var nodeList = Array.from(node.querySelectorAll('*')); + nodeList = nodeList.filter(function(child) { + return child.__pluginDomId !== undefined; + }); var children = []; for (var i = 0; i < nodeList.length; i++) { children.push(nodeList[i]); @@ -512,17 +518,22 @@ CordovaGoogleMaps.prototype.removeDomTree = function(node) { var isRemoved = node._isRemoved; children.forEach(function(child) { - var elemId = child.getAttribute('__pluginDomId'); + var elemId = child.__pluginDomId; // If the DOM is removed from the DOM tree, // remove the attribute. // (Note that the `_isRemoved` flag is set in MutationObserver.) if (isRemoved) { - child.removeAttribute('__pluginDomId'); + + + Object.defineProperty(child, '__pluginDomId', { + enumerable: false, + value: undefined + }); // If map div, remove the map also. - if (child.hasAttribute('__pluginMapId')) { - var mapId = child.getAttribute('__pluginMapId'); + if (child.__pluginMapId) { + var mapId = child.__pluginMapId; if (mapId in self.MAPS) { self.MAPS[mapId].remove(); } @@ -573,13 +584,13 @@ CordovaGoogleMaps.prototype.followMapDivPositionOnly = function(opts) { // Obtain only minimum information var mapDiv = map.getDiv(); - var divId = mapDiv.getAttribute('__pluginDomId'); + var divId = mapDiv.__pluginDomId; if (!divId) { changed = true; map.remove(); return; } - var divId = mapDiv.getAttribute('__pluginDomId'); + var divId = mapDiv.__pluginDomId; mapRects[divId] = { size: common.getDivRect(mapDiv), zIndex: common.getZIndex(mapDiv) @@ -659,7 +670,7 @@ CordovaGoogleMaps.prototype.getMap = function(div, mapOptions) { mapId, elem, elemId; if (common.isDom(div)) { - mapId = div.getAttribute('__pluginMapId'); + mapId = div.__pluginMapId; // Wow, the app specifies the map div that has already another map, // but the app try to create new map. @@ -667,7 +678,7 @@ CordovaGoogleMaps.prototype.getMap = function(div, mapOptions) { if (mapId && self.MAPS[mapId].getDiv() !== div) { elem = self.MAPS[mapId].getDiv(); while(elem && elem.nodeType === Node.ELEMENT_NODE) { - elemId = elem.getAttribute('__pluginDomId'); + elemId = elem.__pluginDomId; if (elemId && elemId in self.domPositions) { self.domPositions[elemId].containMapIDs = self.domPositions[elemId].containMapIDs || {}; delete self.domPositions[elemId].containMapIDs[mapId]; @@ -720,10 +731,13 @@ CordovaGoogleMaps.prototype.getMap = function(div, mapOptions) { var elemId, ele; if (common.isDom(oldDiv)) { - oldDiv.removeAttribute('__pluginMapId'); + Object.defineProperty(oldDiv, '__pluginMapId', { + enumerable: false, + value: undefined + }); ele = oldDiv; while(ele && ele != document.body.parentNode) { - elemId = ele.getAttribute('__pluginDomId'); + elemId = ele.__pluginDomId; if (elemId) { self.domPositions[elemId].containMapIDs = self.domPositions[elemId].containMapIDs || {}; delete self.domPositions[elemId].containMapIDs[mapId]; @@ -731,7 +745,10 @@ CordovaGoogleMaps.prototype.getMap = function(div, mapOptions) { delete self.domPositions[elemId]; } } - ele.removeAttribute('__pluginDomId'); + Object.defineProperty(ele, '__pluginDomId', { + enumerable: false, + value: undefined + }); if (ele.classList) { ele.classList.remove('_gmaps_cdv_'); } else if (ele.className) { @@ -864,10 +881,19 @@ CordovaGoogleMaps.prototype._remove = function(mapId) { if (map) { var div = map.getDiv(); if (!div) { - div = document.querySelector('[__pluginMapId="' + mapId + '"]'); + var allEle = Array.from(document.querySelectorAll('*')); + allEle = allEle.filter(function(ele) { + return ele.__pluginMapId === mapId; + }); + if (allEle.length === 1) { + div = allEle[0]; + } } if (div) { - div.removeAttribute('__pluginMapId'); + Object.defineProperty(div, '__pluginMapId', { + enumerable: false, + value: undefined + }); } var keys = Object.keys(self.domPositions); @@ -921,7 +947,10 @@ function postPanoramaInit(panorama, div, options) { // If the mapDiv is specified, // the native side needs to know the map div position // before creating the map view. - div.setAttribute('__pluginMapId', mapId); + Object.defineProperty(div, '__pluginMapId', { + enumerable: false, + value: mapId + }); var elemId = common.getPluginDomId(div); var elem = div; @@ -994,7 +1023,10 @@ function postMapInit(map, div, options) { // If the mapDiv is specified, // the native side needs to know the map div position // before creating the map view. - div.setAttribute('__pluginMapId', mapId); + Object.defineProperty(div, '__pluginMapId', { + enumerable: false, + value: mapId + }); var elemId = common.getPluginDomId(div); var elem = div; diff --git a/www/js_CordovaGoogleMaps-for-browser.js b/www/js_CordovaGoogleMaps-for-browser.js index bf4d83bc1..7665a1925 100644 --- a/www/js_CordovaGoogleMaps-for-browser.js +++ b/www/js_CordovaGoogleMaps-for-browser.js @@ -29,8 +29,8 @@ function CordovaGoogleMaps(execCmd) { self.MAP_CNT = 0; var removeMapDiv = function(node) { - if (node.hasAttribute('__pluginmapid') && !node.parentNode) { - var mapId = node.getAttribute('__pluginmapid'); + if (node.__pluginMapId !== undefined && !node.parentNode) { + var mapId = node.__pluginMapId; var map = self.MAPS[mapId]; if (map) { map.remove(); @@ -39,9 +39,12 @@ function CordovaGoogleMaps(execCmd) { } else { var childNodes = Array.prototype.slice.call(node.childNodes); childNodes.forEach(function(child) { - if (child.outerHTML && child.outerHTML.indexOf('__pluginmapid') > -1) { + if (child.outerHTML && child.__pluginMapId) { removeMapDiv(child); } + // if (child.outerHTML && child.outerHTML.indexOf('__pluginmapid') > -1) { + // removeMapDiv(child); + // } }); } }; @@ -56,9 +59,12 @@ function CordovaGoogleMaps(execCmd) { if (record.removedNodes.length > 0) { record.removeNodes = Array.prototype.slice.call(record.removedNodes, 0); record.removeNodes.forEach(function(node) { - if (node.outerHTML && node.outerHTML.indexOf('__pluginmapid') > -1) { + if (node.outerHTML && node.__pluginMapId) { removeMapDiv(node); } + // if (node.outerHTML && node.outerHTML.indexOf('__pluginmapid') > -1) { + // removeMapDiv(node); + // } }); } }); @@ -89,7 +95,7 @@ CordovaGoogleMaps.prototype.getMap = function(div, mapOptions) { mapId; if (common.isDom(div)) { - mapId = div.getAttribute('__pluginMapId'); + mapId = div.__pluginMapId; // Wow, the app specifies the map div that has already another map, // but the app try to create new map. @@ -179,10 +185,19 @@ CordovaGoogleMaps.prototype._remove = function(mapId) { var div = map.getDiv(); if (!div) { - div = document.querySelector('[__pluginMapId="' + mapId + '"]'); + var eles = Array.from(document.querySelectorAll('*')); + eles = eles.filter(function(e) { + return e.__pluginMapId === mapId; + }); + if (eles.length === 1) { + div = eles[0]; + } } if (div) { - div.removeAttribute('__pluginMapId'); + Object.defineProperty(div, '__pluginMapId', { + enumerable: false, + value: undefined + }); } self.MAPS[mapId].destroy(); @@ -215,7 +230,10 @@ function postPanoramaInit(panorama, div, options) { // If the mapDiv is specified, // the native side needs to know the map div position // before creating the map view. - div.setAttribute('__pluginMapId', mapId); + Object.defineProperty(div, '__pluginMapId', { + enumerable: false, + value: mapId + }); if (div.offsetWidth < 100 || div.offsetHeight < 100) { console.error('[GoogleMaps] Minimum container dimention is 100x100 in pixels.', div); @@ -229,7 +247,10 @@ function postPanoramaInit(panorama, div, options) { // If the mapDiv is specified, // the native side needs to know the map div position // before creating the map view. - div.setAttribute('__pluginMapId', mapId); + Object.defineProperty(div, '__pluginMapId', { + enumerable: false, + value: mapId + }); panorama.getPanorama.apply(panorama, args); } @@ -254,7 +275,10 @@ function postMapInit(map, div, options) { // If the mapDiv is specified, // the native side needs to know the map div position // before creating the map view. - div.setAttribute('__pluginMapId', mapId); + Object.defineProperty(div, '__pluginMapId', { + enumerable: false, + value: mapId + }); args.push({ __pgmId: mapId, From f722b9ec8023cd2a28a9b5f73b414f970e42e565 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Fri, 22 May 2020 19:13:45 -0700 Subject: [PATCH 33/50] Remove tile aggressively. --- src/browser/PluginTileOverlay.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/browser/PluginTileOverlay.js b/src/browser/PluginTileOverlay.js index 48c08dc1a..a28e6273c 100644 --- a/src/browser/PluginTileOverlay.js +++ b/src/browser/PluginTileOverlay.js @@ -77,7 +77,13 @@ function TileOverlay(mapId, hashCode, options) { releaseTile: function(div) { var cacheId = div.getAttribute('cacheId'); - delete tileCaches[cacheId]; + var div = tileCaches[cacheId]; + if (div) { + if (div.parentNode) { + div.parentNode.removeChild(div); + } + delete tileCaches[cacheId]; + } }, remove: function() { From ae9f15f4e05065f8c2895ed07cc397458c9d2671 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Fri, 22 May 2020 19:16:28 -0700 Subject: [PATCH 34/50] revert the commit --- src/browser/PluginTileOverlay.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/browser/PluginTileOverlay.js b/src/browser/PluginTileOverlay.js index a28e6273c..48c08dc1a 100644 --- a/src/browser/PluginTileOverlay.js +++ b/src/browser/PluginTileOverlay.js @@ -77,13 +77,7 @@ function TileOverlay(mapId, hashCode, options) { releaseTile: function(div) { var cacheId = div.getAttribute('cacheId'); - var div = tileCaches[cacheId]; - if (div) { - if (div.parentNode) { - div.parentNode.removeChild(div); - } - delete tileCaches[cacheId]; - } + delete tileCaches[cacheId]; }, remove: function() { From be85b941aa326b64af18aed1404d2670ddc90c4d Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Thu, 28 May 2020 23:59:34 -0700 Subject: [PATCH 35/50] Use `Maps SDK for Android v.3` instead of Google Play Services --- README.md | 17 +- package.json | 2 +- plugin.xml | 2 +- src/android/frameworks/pgm-custom.gradle | 84 ++++++--- src/android/frameworks/tbxml-android.gradle | 2 +- .../plugin/google/maps/BitmapCache.java | 2 +- .../plugin/google/maps/CordovaGoogleMaps.java | 162 +++++++++--------- src/android/plugin/google/maps/MyPlugin.java | 16 +- .../plugin/google/maps/ObjectCache.java | 2 +- .../plugin/google/maps/PluginCircle.java | 8 +- .../google/maps/PluginDirectionsService.java | 2 +- .../google/maps/PluginElevationService.java | 2 +- .../plugin/google/maps/PluginEnvironment.java | 2 +- .../plugin/google/maps/PluginGeocoder.java | 2 +- .../google/maps/PluginGroundOverlay.java | 10 +- src/android/plugin/google/maps/PluginMap.java | 62 +++---- .../plugin/google/maps/PluginMarker.java | 12 +- .../google/maps/PluginMarkerCluster.java | 8 +- .../plugin/google/maps/PluginPolygon.java | 8 +- .../plugin/google/maps/PluginPolyline.java | 12 +- .../google/maps/PluginStreetViewPanorama.java | 20 +-- .../plugin/google/maps/PluginTileOverlay.java | 4 +- .../google/maps/PluginTileProvider.java | 4 +- .../plugin/google/maps/PluginUtil.java | 10 +- www/DirectionsRenderer.js | 26 +++ 25 files changed, 268 insertions(+), 213 deletions(-) diff --git a/README.md b/README.md index 95ee79660..57f93d48a 100644 --- a/README.md +++ b/README.md @@ -85,14 +85,13 @@ For browser platform, ## Install optional variables (config.xml) - - ![](https://raw.githubusercontent.com/mapsplugin/cordova-plugin-googlemaps/master/images/icon-android.png) **PLAY_SERVICES_VERSION = (17.0.0)**
- The Google Play Services SDK version. - _You need to specify the same version number with all other plugins._ - Check out the latest version [here](https://developers.google.com/android/guides/releases). - - - ![](https://raw.githubusercontent.com/mapsplugin/cordova-plugin-googlemaps/master/images/icon-android.png) **GOOGLE_MAPS_ANDROID_SDK = ()**
- The Google Maps SDK for Android version. - `i.e. GOOGLE_MAPS_ANDROID_SDK=maps-sdk-3.0.0-beta`. + - ![](https://raw.githubusercontent.com/mapsplugin/cordova-plugin-googlemaps/master/images/icon-android.png) **APP_COMPAT_VERSION = (1.1.0)**
+ **PLAY_SERVICES_BASEMENT_VERSION = (17.2.1)**
+ **PLAY_SERVICES_BASE_VERSION = (17.2.1)**
+ **PLAY_SERVICES_GCM_VERSION = (17.0.0)**
+ **PLAY_SERVICES_LOCATION_VERSION = (17.0.0)**
+ **GOOGLE_MAPS_ANDROID_SDK = (maps-sdk-3.0.0-beta)**
+ cordova-plugin-googlemaps version 2.8.0 or later uses [Maps SDK for Android v.3](https://developers.google.com/maps/documentation/android-sdk/v3-client-migration). - ![](https://raw.githubusercontent.com/mapsplugin/cordova-plugin-googlemaps/master/images/icon-ios.png) **LOCATION_WHEN_IN_USE_DESCRIPTION**
This message is displayed when your application requests **LOCATION PERMISSION for only necessary times**. @@ -113,6 +112,8 @@ For browser platform, ## Release Notes - **v2.8.0** + - Important Change: (Android) This plugin uses [Maps SDK for Android v.3.0.0 BETA](https://developers.google.com/maps/documentation/android-sdk/v3-client-migration). **No longer use `com.google.android.gms:play-services-maps` library.** + Because of this, this plugin uses `Androidx`. - Add: (Android/iOS/Browser) `mapOptions.preferences.restriction` which is able to set the camera bounds. - Add: (Android/iOS/Browser) `mapOptions.preferences.clickableIcons` which is able to be disable clicking on POI icons. - Bug fix: (Android/iOS/Browser) `mapOptions.preferences.building` does not work. diff --git a/package.json b/package.json index 27eee6fd4..3a6e20d1b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-googlemaps", - "version": "2.8.0-20200521-2050", + "version": "2.8.0-20200528-2358", "description": "Google Maps native SDK for Android and iOS, and Google Maps JavaScript API v3 for browser.", "cordova": { "id": "cordova-plugin-googlemaps", diff --git a/plugin.xml b/plugin.xml index 03ae6f7c8..89801d7a8 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - + cordova-plugin-googlemaps diff --git a/src/android/frameworks/pgm-custom.gradle b/src/android/frameworks/pgm-custom.gradle index a3945df17..e6209178d 100644 --- a/src/android/frameworks/pgm-custom.gradle +++ b/src/android/frameworks/pgm-custom.gradle @@ -12,7 +12,14 @@ def searchFileInParents(target) { return null; } +ext { + android { + useAndroidX=true + enableJetifier=true + } +} android { + // #1. Find (project)/config.xml file, // because ionic capacitor does not copy nodes def configXmlFile = searchFileInParents("config.xml") @@ -38,10 +45,14 @@ android { println("preference = " + widget.preference.size()) Properties props = new Properties() def isKeyFound = 0 - def useBetaSdk = 0 - props.setProperty("GOOGLE_MAPS_PLAY_SERVICES_VERSION", "17.0.0"); - // props.setProperty("ANDROID_SUPPORT_V4_VERSION", "27.1.1"); - props.setProperty("GOOGLE_MAPS_ANDROID_SDK", ""); + + props.setProperty("GOOGLE_MAPS_ANDROID_SDK", "maps-sdk-3.0.0-beta"); + props.setProperty("APP_COMPAT_VERSION", "1.1.0"); + props.setProperty("PLAY_SERVICES_BASEMENT_VERSION", "17.2.1"); + props.setProperty("PLAY_SERVICES_BASE_VERSION", "17.2.1"); + props.setProperty("PLAY_SERVICES_GCM_VERSION", "17.0.0"); + props.setProperty("PLAY_SERVICES_LOCATION_VERSION", "17.0.0"); + widget.preference.each { pref -> def name = pref.attributes().name @@ -51,13 +62,14 @@ android { isKeyFound = 1 props.setProperty(name, value) } - if (name == "GOOGLE_MAPS_PLAY_SERVICES_VERSION") { + if (name == "GOOGLE_MAPS_ANDROID_SDK" || + name == "APP_COMPAT_VERSION" || + name == "PLAY_SERVICES_BASEMENT_VERSION" || + name == "PLAY_SERVICES_BASE_VERSION" || + name == "PLAY_SERVICES_GCM_VERSION" || + name == "PLAY_SERVICES_LOCATION_VERSION") { props.setProperty(name, value) } - if (name == "GOOGLE_MAPS_ANDROID_SDK") { - useBetaSdk = 1 - props.setProperty("GOOGLE_MAPS_ANDROID_SDK", value) - } } @@ -65,29 +77,45 @@ android { throw new GradleException("Please add '' to the config.xml file.") } - if (useBetaSdk == 1) { - def libsDirPath = System.getProperty("user.dir") - def libsDir = new File("${libsDirPath}/libs/") - if (!libsDir.exists()) { - libsDir.mkdirs() - } + //---------- + // maps SDK + //---------- + def libsDirPath = System.getProperty("user.dir") + def libsDir = new File("${libsDirPath}/libs/") + if (!libsDir.exists()) { + libsDir.mkdirs() + } - def mapsSDK = props.getProperty("GOOGLE_MAPS_ANDROID_SDK") - def f = new File("${libsDir.absolutePath}/${mapsSDK}.aar") - println("---->lib = " + f.absolutePath); - if (!f.exists()) { - new URL("https://dl.google.com/dl/geosdk/${mapsSDK}.aar").withInputStream{ i -> f.withOutputStream{ it << i }} - } - dependencies { - implementation name: mapsSDK, ext:'aar' - } + def mapsSDK = props.getProperty("GOOGLE_MAPS_ANDROID_SDK") + def f = new File("${libsDir.absolutePath}/${mapsSDK}.aar") + println("---->GOOGLE_MAPS_ANDROID_SDK = " + f.absolutePath); + if (!f.exists()) { + new URL("https://dl.google.com/dl/geosdk/${mapsSDK}.aar").withInputStream{ i -> f.withOutputStream{ it << i }} } + dependencies { + implementation name: mapsSDK, ext:'aar' + } + + //------------- + // dependencies + //------------- + def APP_COMPAT_VERSION = props.getProperty("APP_COMPAT_VERSION") + def PLAY_SERVICES_BASEMENT_VERSION = props.getProperty("PLAY_SERVICES_BASEMENT_VERSION") + def PLAY_SERVICES_BASE_VERSION = props.getProperty("PLAY_SERVICES_BASE_VERSION") + def PLAY_SERVICES_GCM_VERSION = props.getProperty("PLAY_SERVICES_GCM_VERSION") + def PLAY_SERVICES_LOCATION_VERSION = props.getProperty("PLAY_SERVICES_LOCATION_VERSION") - def PLAY_SERVICES_VERSION = props.get("GOOGLE_MAPS_PLAY_SERVICES_VERSION") - println("---->PLAY_SERVICES_VERSION = ${PLAY_SERVICES_VERSION}") + println("---->APP_COMPAT_VERSION = ${APP_COMPAT_VERSION}") + println("---->PLAY_SERVICES_BASEMENT_VERSION = ${PLAY_SERVICES_BASEMENT_VERSION}") + println("---->PLAY_SERVICES_BASE_VERSION = ${PLAY_SERVICES_BASE_VERSION}") + println("---->PLAY_SERVICES_GCM_VERSION = ${PLAY_SERVICES_GCM_VERSION}") + println("---->PLAY_SERVICES_LOCATION_VERSION = ${PLAY_SERVICES_LOCATION_VERSION}") dependencies { - implementation "com.google.android.gms:play-services-maps:${PLAY_SERVICES_VERSION}" - implementation "com.google.android.gms:play-services-location:${PLAY_SERVICES_VERSION}" + implementation "androidx.appcompat:appcompat:${APP_COMPAT_VERSION}" + implementation "com.google.android.gms:play-services-basement:${PLAY_SERVICES_BASEMENT_VERSION}" + implementation "com.google.android.gms:play-services-base:${PLAY_SERVICES_BASE_VERSION}" + implementation "com.google.android.gms:play-services-gcm:${PLAY_SERVICES_GCM_VERSION}" + implementation "com.google.android.gms:play-services-location:${PLAY_SERVICES_LOCATION_VERSION}" } diff --git a/src/android/frameworks/tbxml-android.gradle b/src/android/frameworks/tbxml-android.gradle index d329088e1..4c4edcefc 100644 --- a/src/android/frameworks/tbxml-android.gradle +++ b/src/android/frameworks/tbxml-android.gradle @@ -13,7 +13,7 @@ dependencies { } android { - compileSdkVersion 26 + compileSdkVersion 28 packagingOptions { exclude 'README' diff --git a/src/android/plugin/google/maps/BitmapCache.java b/src/android/plugin/google/maps/BitmapCache.java index fe3a7f401..1ee9365a4 100644 --- a/src/android/plugin/google/maps/BitmapCache.java +++ b/src/android/plugin/google/maps/BitmapCache.java @@ -1,7 +1,7 @@ package plugin.google.maps; import android.graphics.Bitmap; -import android.util.LruCache; +import androidx.collection.LruCache; public class BitmapCache extends LruCache { diff --git a/src/android/plugin/google/maps/CordovaGoogleMaps.java b/src/android/plugin/google/maps/CordovaGoogleMaps.java index 0b26f29b2..f120e490c 100644 --- a/src/android/plugin/google/maps/CordovaGoogleMaps.java +++ b/src/android/plugin/google/maps/CordovaGoogleMaps.java @@ -24,7 +24,7 @@ import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; -import com.google.android.gms.maps.MapsInitializer; +import com.google.android.libraries.maps.MapsInitializer; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; @@ -84,86 +84,86 @@ public void run() { // ------------------------------ // Check of Google Play Services // ------------------------------ - int checkGooglePlayServices = GooglePlayServicesUtil.isGooglePlayServicesAvailable(activity); - - Log.d(TAG, "----> checkGooglePlayServices = " + (ConnectionResult.SUCCESS == checkGooglePlayServices)); - - if (checkGooglePlayServices != ConnectionResult.SUCCESS) { - // google play services is missing!!!! - /* - * Returns status code indicating whether there was an error. Can be one - * of following in ConnectionResult: SUCCESS, SERVICE_MISSING, - * SERVICE_VERSION_UPDATE_REQUIRED, SERVICE_DISABLED, SERVICE_INVALID. - */ - Log.e(TAG, "---Google Play Services is not available: " + GooglePlayServicesUtil.getErrorString(checkGooglePlayServices)); - - boolean isNeedToUpdate = false; - - String errorMsg = PluginUtil.getPgmStrings(activity, "pgm_google_play_error"); - switch (checkGooglePlayServices) { - case ConnectionResult.DEVELOPER_ERROR: - errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_developer_error"); - break; - case ConnectionResult.INTERNAL_ERROR: - errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_internal_error"); - break; - case ConnectionResult.INVALID_ACCOUNT: - errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_invalid_account"); - break; - case ConnectionResult.LICENSE_CHECK_FAILED: - errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_license_check_failed"); - break; - case ConnectionResult.NETWORK_ERROR: - errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_network_error"); - break; - case ConnectionResult.SERVICE_DISABLED: - errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_disabled"); - break; - case ConnectionResult.SERVICE_INVALID: - errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_invalid"); - isNeedToUpdate = true; - break; - case ConnectionResult.SERVICE_MISSING: - errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_missing"); - isNeedToUpdate = true; - break; - case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED: - errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_update_required"); - isNeedToUpdate = true; - break; - case ConnectionResult.SIGN_IN_REQUIRED: - errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_sign_in_required"); - break; - default: - isNeedToUpdate = true; - break; - } - - final boolean finalIsNeedToUpdate = isNeedToUpdate; - AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(activity); - alertDialogBuilder - .setMessage(errorMsg) - .setCancelable(false) - .setPositiveButton(PluginUtil.getPgmStrings(activity,"pgm_google_close_button"), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog,int id) { - dialog.dismiss(); - if (finalIsNeedToUpdate) { - try { - activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.google.android.gms"))); - } catch (android.content.ActivityNotFoundException anfe) { - activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=com.google.android.gms"))); - } - } - } - }); - AlertDialog alertDialog = alertDialogBuilder.create(); - - // show it - alertDialog.show(); - - Log.e(TAG, "Google Play Services is not available."); - return; - } +// int checkGooglePlayServices = GooglePlayServicesUtil.isGooglePlayServicesAvailable(activity); +// +// Log.d(TAG, "----> checkGooglePlayServices = " + (ConnectionResult.SUCCESS == checkGooglePlayServices)); +// +// if (checkGooglePlayServices != ConnectionResult.SUCCESS) { +// // google play services is missing!!!! +// /* +// * Returns status code indicating whether there was an error. Can be one +// * of following in ConnectionResult: SUCCESS, SERVICE_MISSING, +// * SERVICE_VERSION_UPDATE_REQUIRED, SERVICE_DISABLED, SERVICE_INVALID. +// */ +// Log.e(TAG, "---Google Play Services is not available: " + GooglePlayServicesUtil.getErrorString(checkGooglePlayServices)); +// +// boolean isNeedToUpdate = false; +// +// String errorMsg = PluginUtil.getPgmStrings(activity, "pgm_google_play_error"); +// switch (checkGooglePlayServices) { +// case ConnectionResult.DEVELOPER_ERROR: +// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_developer_error"); +// break; +// case ConnectionResult.INTERNAL_ERROR: +// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_internal_error"); +// break; +// case ConnectionResult.INVALID_ACCOUNT: +// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_invalid_account"); +// break; +// case ConnectionResult.LICENSE_CHECK_FAILED: +// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_license_check_failed"); +// break; +// case ConnectionResult.NETWORK_ERROR: +// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_network_error"); +// break; +// case ConnectionResult.SERVICE_DISABLED: +// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_disabled"); +// break; +// case ConnectionResult.SERVICE_INVALID: +// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_invalid"); +// isNeedToUpdate = true; +// break; +// case ConnectionResult.SERVICE_MISSING: +// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_missing"); +// isNeedToUpdate = true; +// break; +// case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED: +// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_update_required"); +// isNeedToUpdate = true; +// break; +// case ConnectionResult.SIGN_IN_REQUIRED: +// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_sign_in_required"); +// break; +// default: +// isNeedToUpdate = true; +// break; +// } +// +// final boolean finalIsNeedToUpdate = isNeedToUpdate; +// AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(activity); +// alertDialogBuilder +// .setMessage(errorMsg) +// .setCancelable(false) +// .setPositiveButton(PluginUtil.getPgmStrings(activity,"pgm_google_close_button"), new DialogInterface.OnClickListener() { +// public void onClick(DialogInterface dialog,int id) { +// dialog.dismiss(); +// if (finalIsNeedToUpdate) { +// try { +// activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.google.android.gms"))); +// } catch (android.content.ActivityNotFoundException anfe) { +// activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=com.google.android.gms"))); +// } +// } +// } +// }); +// AlertDialog alertDialog = alertDialogBuilder.create(); +// +// // show it +// alertDialog.show(); +// +// Log.e(TAG, "Google Play Services is not available."); +// return; +// } webView.getView().setBackgroundColor(Color.TRANSPARENT); webView.getView().setOverScrollMode(View.OVER_SCROLL_NEVER); diff --git a/src/android/plugin/google/maps/MyPlugin.java b/src/android/plugin/google/maps/MyPlugin.java index 9af3faab6..1b3cf41b0 100644 --- a/src/android/plugin/google/maps/MyPlugin.java +++ b/src/android/plugin/google/maps/MyPlugin.java @@ -4,14 +4,14 @@ import android.content.res.Resources; import android.util.Log; -import com.google.android.gms.maps.GoogleMap; -import com.google.android.gms.maps.model.Circle; -import com.google.android.gms.maps.model.GroundOverlay; -import com.google.android.gms.maps.model.LatLng; -import com.google.android.gms.maps.model.Marker; -import com.google.android.gms.maps.model.Polygon; -import com.google.android.gms.maps.model.Polyline; -import com.google.android.gms.maps.model.TileOverlay; +import com.google.android.libraries.maps.GoogleMap; +import com.google.android.libraries.maps.model.Circle; +import com.google.android.libraries.maps.model.GroundOverlay; +import com.google.android.libraries.maps.model.LatLng; +import com.google.android.libraries.maps.model.Marker; +import com.google.android.libraries.maps.model.Polygon; +import com.google.android.libraries.maps.model.Polyline; +import com.google.android.libraries.maps.model.TileOverlay; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/ObjectCache.java b/src/android/plugin/google/maps/ObjectCache.java index 12df5d247..32a407f9f 100644 --- a/src/android/plugin/google/maps/ObjectCache.java +++ b/src/android/plugin/google/maps/ObjectCache.java @@ -1,6 +1,6 @@ package plugin.google.maps; -import android.util.LruCache; +import androidx.collection.LruCache; import java.util.HashSet; diff --git a/src/android/plugin/google/maps/PluginCircle.java b/src/android/plugin/google/maps/PluginCircle.java index 58b888a78..8e51a58a8 100644 --- a/src/android/plugin/google/maps/PluginCircle.java +++ b/src/android/plugin/google/maps/PluginCircle.java @@ -1,9 +1,9 @@ package plugin.google.maps; -import com.google.android.gms.maps.model.Circle; -import com.google.android.gms.maps.model.CircleOptions; -import com.google.android.gms.maps.model.LatLng; -import com.google.android.gms.maps.model.LatLngBounds; +import com.google.android.libraries.maps.model.Circle; +import com.google.android.libraries.maps.model.CircleOptions; +import com.google.android.libraries.maps.model.LatLng; +import com.google.android.libraries.maps.model.LatLngBounds; import org.apache.cordova.CallbackContext; import org.json.JSONArray; diff --git a/src/android/plugin/google/maps/PluginDirectionsService.java b/src/android/plugin/google/maps/PluginDirectionsService.java index 4b98f30bc..f84c2985a 100644 --- a/src/android/plugin/google/maps/PluginDirectionsService.java +++ b/src/android/plugin/google/maps/PluginDirectionsService.java @@ -5,7 +5,7 @@ import android.content.pm.PackageManager; import android.util.Log; -import com.google.android.gms.maps.model.LatLng; +import com.google.android.libraries.maps.model.LatLng; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginElevationService.java b/src/android/plugin/google/maps/PluginElevationService.java index b2c679ff9..9c1afceb6 100644 --- a/src/android/plugin/google/maps/PluginElevationService.java +++ b/src/android/plugin/google/maps/PluginElevationService.java @@ -5,7 +5,7 @@ import android.content.pm.PackageManager; import android.util.Log; -import com.google.android.gms.maps.model.LatLng; +import com.google.android.libraries.maps.model.LatLng; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginEnvironment.java b/src/android/plugin/google/maps/PluginEnvironment.java index df8eb98d7..02a1fb724 100644 --- a/src/android/plugin/google/maps/PluginEnvironment.java +++ b/src/android/plugin/google/maps/PluginEnvironment.java @@ -78,7 +78,7 @@ public void isAvailable(final JSONArray args, final CallbackContext callbackCont // ------------------------------ try { @SuppressWarnings({ "rawtypes" }) - Class GoogleMapsClass = Class.forName("com.google.android.gms.maps.GoogleMap"); + Class GoogleMapsClass = Class.forName("com.google.android.libraries.maps.GoogleMap"); } catch (Exception e) { Log.e("GoogleMaps", "Error", e); callbackContext.error(e.getMessage()); diff --git a/src/android/plugin/google/maps/PluginGeocoder.java b/src/android/plugin/google/maps/PluginGeocoder.java index c2cda4687..1024cf72c 100644 --- a/src/android/plugin/google/maps/PluginGeocoder.java +++ b/src/android/plugin/google/maps/PluginGeocoder.java @@ -4,7 +4,7 @@ import android.location.Geocoder; import android.os.Bundle; -import com.google.android.gms.maps.model.LatLngBounds; +import com.google.android.libraries.maps.model.LatLngBounds; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginGroundOverlay.java b/src/android/plugin/google/maps/PluginGroundOverlay.java index 229bf5694..ae2166dc4 100644 --- a/src/android/plugin/google/maps/PluginGroundOverlay.java +++ b/src/android/plugin/google/maps/PluginGroundOverlay.java @@ -3,11 +3,11 @@ import android.graphics.Bitmap; import android.os.AsyncTask; -import com.google.android.gms.maps.model.BitmapDescriptor; -import com.google.android.gms.maps.model.BitmapDescriptorFactory; -import com.google.android.gms.maps.model.GroundOverlay; -import com.google.android.gms.maps.model.GroundOverlayOptions; -import com.google.android.gms.maps.model.LatLngBounds; +import com.google.android.libraries.maps.model.BitmapDescriptor; +import com.google.android.libraries.maps.model.BitmapDescriptorFactory; +import com.google.android.libraries.maps.model.GroundOverlay; +import com.google.android.libraries.maps.model.GroundOverlayOptions; +import com.google.android.libraries.maps.model.LatLngBounds; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginMap.java b/src/android/plugin/google/maps/PluginMap.java index b7e95e05f..fe6858cb1 100644 --- a/src/android/plugin/google/maps/PluginMap.java +++ b/src/android/plugin/google/maps/PluginMap.java @@ -28,37 +28,37 @@ import android.widget.LinearLayout; import android.widget.TextView; -import com.google.android.gms.maps.CameraUpdate; -import com.google.android.gms.maps.CameraUpdateFactory; -import com.google.android.gms.maps.GoogleMap; -import com.google.android.gms.maps.GoogleMap.InfoWindowAdapter; -import com.google.android.gms.maps.GoogleMap.OnIndoorStateChangeListener; -import com.google.android.gms.maps.GoogleMap.OnInfoWindowClickListener; -import com.google.android.gms.maps.GoogleMap.OnMapClickListener; -import com.google.android.gms.maps.GoogleMap.OnMapLongClickListener; -import com.google.android.gms.maps.GoogleMap.OnMarkerClickListener; -import com.google.android.gms.maps.GoogleMap.OnMarkerDragListener; -import com.google.android.gms.maps.GoogleMap.OnMyLocationButtonClickListener; -import com.google.android.gms.maps.GoogleMapOptions; -import com.google.android.gms.maps.MapView; -import com.google.android.gms.maps.OnMapReadyCallback; -import com.google.android.gms.maps.Projection; -import com.google.android.gms.maps.UiSettings; -import com.google.android.gms.maps.model.CameraPosition; -import com.google.android.gms.maps.model.CameraPosition.Builder; -import com.google.android.gms.maps.model.Circle; -import com.google.android.gms.maps.model.GroundOverlay; -import com.google.android.gms.maps.model.IndoorBuilding; -import com.google.android.gms.maps.model.LatLng; -import com.google.android.gms.maps.model.LatLngBounds; -import com.google.android.gms.maps.model.MapStyleOptions; -import com.google.android.gms.maps.model.Marker; -import com.google.android.gms.maps.model.MarkerOptions; -import com.google.android.gms.maps.model.PointOfInterest; -import com.google.android.gms.maps.model.Polygon; -import com.google.android.gms.maps.model.Polyline; -import com.google.android.gms.maps.model.PolylineOptions; -import com.google.android.gms.maps.model.VisibleRegion; +import com.google.android.libraries.maps.CameraUpdate; +import com.google.android.libraries.maps.CameraUpdateFactory; +import com.google.android.libraries.maps.GoogleMap; +import com.google.android.libraries.maps.GoogleMap.InfoWindowAdapter; +import com.google.android.libraries.maps.GoogleMap.OnIndoorStateChangeListener; +import com.google.android.libraries.maps.GoogleMap.OnInfoWindowClickListener; +import com.google.android.libraries.maps.GoogleMap.OnMapClickListener; +import com.google.android.libraries.maps.GoogleMap.OnMapLongClickListener; +import com.google.android.libraries.maps.GoogleMap.OnMarkerClickListener; +import com.google.android.libraries.maps.GoogleMap.OnMarkerDragListener; +import com.google.android.libraries.maps.GoogleMap.OnMyLocationButtonClickListener; +import com.google.android.libraries.maps.GoogleMapOptions; +import com.google.android.libraries.maps.MapView; +import com.google.android.libraries.maps.OnMapReadyCallback; +import com.google.android.libraries.maps.Projection; +import com.google.android.libraries.maps.UiSettings; +import com.google.android.libraries.maps.model.CameraPosition; +import com.google.android.libraries.maps.model.CameraPosition.Builder; +import com.google.android.libraries.maps.model.Circle; +import com.google.android.libraries.maps.model.GroundOverlay; +import com.google.android.libraries.maps.model.IndoorBuilding; +import com.google.android.libraries.maps.model.LatLng; +import com.google.android.libraries.maps.model.LatLngBounds; +import com.google.android.libraries.maps.model.MapStyleOptions; +import com.google.android.libraries.maps.model.Marker; +import com.google.android.libraries.maps.model.MarkerOptions; +import com.google.android.libraries.maps.model.PointOfInterest; +import com.google.android.libraries.maps.model.Polygon; +import com.google.android.libraries.maps.model.Polyline; +import com.google.android.libraries.maps.model.PolylineOptions; +import com.google.android.libraries.maps.model.VisibleRegion; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginMarker.java b/src/android/plugin/google/maps/PluginMarker.java index cb9338f15..7c5238689 100644 --- a/src/android/plugin/google/maps/PluginMarker.java +++ b/src/android/plugin/google/maps/PluginMarker.java @@ -16,12 +16,12 @@ import android.view.animation.Interpolator; import android.view.animation.LinearInterpolator; -import com.google.android.gms.maps.Projection; -import com.google.android.gms.maps.model.BitmapDescriptor; -import com.google.android.gms.maps.model.BitmapDescriptorFactory; -import com.google.android.gms.maps.model.LatLng; -import com.google.android.gms.maps.model.Marker; -import com.google.android.gms.maps.model.MarkerOptions; +import com.google.android.libraries.maps.Projection; +import com.google.android.libraries.maps.model.BitmapDescriptor; +import com.google.android.libraries.maps.model.BitmapDescriptorFactory; +import com.google.android.libraries.maps.model.LatLng; +import com.google.android.libraries.maps.model.Marker; +import com.google.android.libraries.maps.model.MarkerOptions; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginMarkerCluster.java b/src/android/plugin/google/maps/PluginMarkerCluster.java index f9a220e9e..247738af7 100644 --- a/src/android/plugin/google/maps/PluginMarkerCluster.java +++ b/src/android/plugin/google/maps/PluginMarkerCluster.java @@ -4,10 +4,10 @@ import android.os.Bundle; import android.util.Log; -import com.google.android.gms.maps.model.LatLng; -import com.google.android.gms.maps.model.LatLngBounds; -import com.google.android.gms.maps.model.Marker; -import com.google.android.gms.maps.model.MarkerOptions; +import com.google.android.libraries.maps.model.LatLng; +import com.google.android.libraries.maps.model.LatLngBounds; +import com.google.android.libraries.maps.model.Marker; +import com.google.android.libraries.maps.model.MarkerOptions; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginPolygon.java b/src/android/plugin/google/maps/PluginPolygon.java index 231cd5884..0a6692581 100644 --- a/src/android/plugin/google/maps/PluginPolygon.java +++ b/src/android/plugin/google/maps/PluginPolygon.java @@ -1,9 +1,9 @@ package plugin.google.maps; -import com.google.android.gms.maps.model.LatLng; -import com.google.android.gms.maps.model.LatLngBounds; -import com.google.android.gms.maps.model.Polygon; -import com.google.android.gms.maps.model.PolygonOptions; +import com.google.android.libraries.maps.model.LatLng; +import com.google.android.libraries.maps.model.LatLngBounds; +import com.google.android.libraries.maps.model.Polygon; +import com.google.android.libraries.maps.model.PolygonOptions; import org.apache.cordova.CallbackContext; import org.json.JSONArray; diff --git a/src/android/plugin/google/maps/PluginPolyline.java b/src/android/plugin/google/maps/PluginPolyline.java index 95643eb8d..70ad049c0 100644 --- a/src/android/plugin/google/maps/PluginPolyline.java +++ b/src/android/plugin/google/maps/PluginPolyline.java @@ -3,12 +3,12 @@ import android.graphics.Color; import android.util.Log; -import com.google.android.gms.maps.model.CircleOptions; -import com.google.android.gms.maps.model.LatLng; -import com.google.android.gms.maps.model.LatLngBounds; -import com.google.android.gms.maps.model.MarkerOptions; -import com.google.android.gms.maps.model.Polyline; -import com.google.android.gms.maps.model.PolylineOptions; +import com.google.android.libraries.maps.model.CircleOptions; +import com.google.android.libraries.maps.model.LatLng; +import com.google.android.libraries.maps.model.LatLngBounds; +import com.google.android.libraries.maps.model.MarkerOptions; +import com.google.android.libraries.maps.model.Polyline; +import com.google.android.libraries.maps.model.PolylineOptions; import org.apache.cordova.CallbackContext; import org.json.JSONArray; diff --git a/src/android/plugin/google/maps/PluginStreetViewPanorama.java b/src/android/plugin/google/maps/PluginStreetViewPanorama.java index b85a51e47..0131069e3 100644 --- a/src/android/plugin/google/maps/PluginStreetViewPanorama.java +++ b/src/android/plugin/google/maps/PluginStreetViewPanorama.java @@ -5,16 +5,16 @@ import android.view.View; import android.view.ViewGroup; -import com.google.android.gms.maps.OnStreetViewPanoramaReadyCallback; -import com.google.android.gms.maps.StreetViewPanorama; -import com.google.android.gms.maps.StreetViewPanoramaOptions; -import com.google.android.gms.maps.StreetViewPanoramaView; -import com.google.android.gms.maps.model.LatLng; -import com.google.android.gms.maps.model.StreetViewPanoramaCamera; -import com.google.android.gms.maps.model.StreetViewPanoramaLink; -import com.google.android.gms.maps.model.StreetViewPanoramaLocation; -import com.google.android.gms.maps.model.StreetViewPanoramaOrientation; -import com.google.android.gms.maps.model.StreetViewSource; +import com.google.android.libraries.maps.OnStreetViewPanoramaReadyCallback; +import com.google.android.libraries.maps.StreetViewPanorama; +import com.google.android.libraries.maps.StreetViewPanoramaOptions; +import com.google.android.libraries.maps.StreetViewPanoramaView; +import com.google.android.libraries.maps.model.LatLng; +import com.google.android.libraries.maps.model.StreetViewPanoramaCamera; +import com.google.android.libraries.maps.model.StreetViewPanoramaLink; +import com.google.android.libraries.maps.model.StreetViewPanoramaLocation; +import com.google.android.libraries.maps.model.StreetViewPanoramaOrientation; +import com.google.android.libraries.maps.model.StreetViewSource; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginTileOverlay.java b/src/android/plugin/google/maps/PluginTileOverlay.java index 05ca806cb..0f934e2b4 100644 --- a/src/android/plugin/google/maps/PluginTileOverlay.java +++ b/src/android/plugin/google/maps/PluginTileOverlay.java @@ -4,8 +4,8 @@ import android.view.View; import android.webkit.WebView; -import com.google.android.gms.maps.model.TileOverlay; -import com.google.android.gms.maps.model.TileOverlayOptions; +import com.google.android.libraries.maps.model.TileOverlay; +import com.google.android.libraries.maps.model.TileOverlayOptions; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaPreferences; diff --git a/src/android/plugin/google/maps/PluginTileProvider.java b/src/android/plugin/google/maps/PluginTileProvider.java index 1bbb3b824..5073981e1 100644 --- a/src/android/plugin/google/maps/PluginTileProvider.java +++ b/src/android/plugin/google/maps/PluginTileProvider.java @@ -16,8 +16,8 @@ import android.text.TextPaint; import android.util.Log; -import com.google.android.gms.maps.model.Tile; -import com.google.android.gms.maps.model.TileProvider; +import com.google.android.libraries.maps.model.Tile; +import com.google.android.libraries.maps.model.TileProvider; import org.apache.cordova.CordovaWebView; diff --git a/src/android/plugin/google/maps/PluginUtil.java b/src/android/plugin/google/maps/PluginUtil.java index 634362820..7c7a1fee0 100644 --- a/src/android/plugin/google/maps/PluginUtil.java +++ b/src/android/plugin/google/maps/PluginUtil.java @@ -17,11 +17,11 @@ import android.os.Bundle; import android.util.Base64; -import com.google.android.gms.maps.model.IndoorBuilding; -import com.google.android.gms.maps.model.IndoorLevel; -import com.google.android.gms.maps.model.LatLng; -import com.google.android.gms.maps.model.LatLngBounds; -import com.google.android.gms.maps.model.LatLngBounds.Builder; +import com.google.android.libraries.maps.model.IndoorBuilding; +import com.google.android.libraries.maps.model.IndoorLevel; +import com.google.android.libraries.maps.model.LatLng; +import com.google.android.libraries.maps.model.LatLngBounds; +import com.google.android.libraries.maps.model.LatLngBounds.Builder; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaResourceApi; diff --git a/www/DirectionsRenderer.js b/www/DirectionsRenderer.js index ab4954bcd..129f01e8b 100644 --- a/www/DirectionsRenderer.js +++ b/www/DirectionsRenderer.js @@ -418,6 +418,32 @@ DirectionsRenderer.prototype.setRouteIndex = function(index) { self.set('routeIndex', index); }; +DirectionsRenderer.prototype.remove = function(callback) { + var self = this; + if (self._isRemoved) { + if (typeof callback === 'function') { + return; + } else { + return Promise.resolve(); + } + } + Object.defineProperty(self, '_isRemoved', { + value: true, + writable: false + }); + + + var resolver = function(resolve) { + self.polyline.remove().then(resolve); + }; + + if (typeof callback === 'function') { + resolver.call(self, callback, null); + return; + } else { + return Promise.resolve(); + } +}; DirectionsRenderer.prototype._redrawRoute = function(oldIdx, newIdx) { var self = this; var options = self.get('options'); From 3f47931fa0b482c99bb818dc9d338770a8120d27 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Fri, 29 May 2020 00:05:41 -0700 Subject: [PATCH 36/50] Revert "Use `Maps SDK for Android v.3` instead of Google Play Services" This reverts commit be85b941aa326b64af18aed1404d2670ddc90c4d. --- README.md | 17 +- package.json | 2 +- plugin.xml | 2 +- src/android/frameworks/pgm-custom.gradle | 84 +++------ src/android/frameworks/tbxml-android.gradle | 2 +- .../plugin/google/maps/BitmapCache.java | 2 +- .../plugin/google/maps/CordovaGoogleMaps.java | 162 +++++++++--------- src/android/plugin/google/maps/MyPlugin.java | 16 +- .../plugin/google/maps/ObjectCache.java | 2 +- .../plugin/google/maps/PluginCircle.java | 8 +- .../google/maps/PluginDirectionsService.java | 2 +- .../google/maps/PluginElevationService.java | 2 +- .../plugin/google/maps/PluginEnvironment.java | 2 +- .../plugin/google/maps/PluginGeocoder.java | 2 +- .../google/maps/PluginGroundOverlay.java | 10 +- src/android/plugin/google/maps/PluginMap.java | 62 +++---- .../plugin/google/maps/PluginMarker.java | 12 +- .../google/maps/PluginMarkerCluster.java | 8 +- .../plugin/google/maps/PluginPolygon.java | 8 +- .../plugin/google/maps/PluginPolyline.java | 12 +- .../google/maps/PluginStreetViewPanorama.java | 20 +-- .../plugin/google/maps/PluginTileOverlay.java | 4 +- .../google/maps/PluginTileProvider.java | 4 +- .../plugin/google/maps/PluginUtil.java | 10 +- www/DirectionsRenderer.js | 26 --- 25 files changed, 213 insertions(+), 268 deletions(-) diff --git a/README.md b/README.md index 57f93d48a..95ee79660 100644 --- a/README.md +++ b/README.md @@ -85,13 +85,14 @@ For browser platform, ## Install optional variables (config.xml) - - ![](https://raw.githubusercontent.com/mapsplugin/cordova-plugin-googlemaps/master/images/icon-android.png) **APP_COMPAT_VERSION = (1.1.0)**
- **PLAY_SERVICES_BASEMENT_VERSION = (17.2.1)**
- **PLAY_SERVICES_BASE_VERSION = (17.2.1)**
- **PLAY_SERVICES_GCM_VERSION = (17.0.0)**
- **PLAY_SERVICES_LOCATION_VERSION = (17.0.0)**
- **GOOGLE_MAPS_ANDROID_SDK = (maps-sdk-3.0.0-beta)**
- cordova-plugin-googlemaps version 2.8.0 or later uses [Maps SDK for Android v.3](https://developers.google.com/maps/documentation/android-sdk/v3-client-migration). + - ![](https://raw.githubusercontent.com/mapsplugin/cordova-plugin-googlemaps/master/images/icon-android.png) **PLAY_SERVICES_VERSION = (17.0.0)**
+ The Google Play Services SDK version. + _You need to specify the same version number with all other plugins._ + Check out the latest version [here](https://developers.google.com/android/guides/releases). + + - ![](https://raw.githubusercontent.com/mapsplugin/cordova-plugin-googlemaps/master/images/icon-android.png) **GOOGLE_MAPS_ANDROID_SDK = ()**
+ The Google Maps SDK for Android version. + `i.e. GOOGLE_MAPS_ANDROID_SDK=maps-sdk-3.0.0-beta`. - ![](https://raw.githubusercontent.com/mapsplugin/cordova-plugin-googlemaps/master/images/icon-ios.png) **LOCATION_WHEN_IN_USE_DESCRIPTION**
This message is displayed when your application requests **LOCATION PERMISSION for only necessary times**. @@ -112,8 +113,6 @@ For browser platform, ## Release Notes - **v2.8.0** - - Important Change: (Android) This plugin uses [Maps SDK for Android v.3.0.0 BETA](https://developers.google.com/maps/documentation/android-sdk/v3-client-migration). **No longer use `com.google.android.gms:play-services-maps` library.** - Because of this, this plugin uses `Androidx`. - Add: (Android/iOS/Browser) `mapOptions.preferences.restriction` which is able to set the camera bounds. - Add: (Android/iOS/Browser) `mapOptions.preferences.clickableIcons` which is able to be disable clicking on POI icons. - Bug fix: (Android/iOS/Browser) `mapOptions.preferences.building` does not work. diff --git a/package.json b/package.json index 3a6e20d1b..27eee6fd4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-googlemaps", - "version": "2.8.0-20200528-2358", + "version": "2.8.0-20200521-2050", "description": "Google Maps native SDK for Android and iOS, and Google Maps JavaScript API v3 for browser.", "cordova": { "id": "cordova-plugin-googlemaps", diff --git a/plugin.xml b/plugin.xml index 89801d7a8..03ae6f7c8 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - + cordova-plugin-googlemaps diff --git a/src/android/frameworks/pgm-custom.gradle b/src/android/frameworks/pgm-custom.gradle index e6209178d..a3945df17 100644 --- a/src/android/frameworks/pgm-custom.gradle +++ b/src/android/frameworks/pgm-custom.gradle @@ -12,14 +12,7 @@ def searchFileInParents(target) { return null; } -ext { - android { - useAndroidX=true - enableJetifier=true - } -} android { - // #1. Find (project)/config.xml file, // because ionic capacitor does not copy nodes def configXmlFile = searchFileInParents("config.xml") @@ -45,14 +38,10 @@ android { println("preference = " + widget.preference.size()) Properties props = new Properties() def isKeyFound = 0 - - props.setProperty("GOOGLE_MAPS_ANDROID_SDK", "maps-sdk-3.0.0-beta"); - props.setProperty("APP_COMPAT_VERSION", "1.1.0"); - props.setProperty("PLAY_SERVICES_BASEMENT_VERSION", "17.2.1"); - props.setProperty("PLAY_SERVICES_BASE_VERSION", "17.2.1"); - props.setProperty("PLAY_SERVICES_GCM_VERSION", "17.0.0"); - props.setProperty("PLAY_SERVICES_LOCATION_VERSION", "17.0.0"); - + def useBetaSdk = 0 + props.setProperty("GOOGLE_MAPS_PLAY_SERVICES_VERSION", "17.0.0"); + // props.setProperty("ANDROID_SUPPORT_V4_VERSION", "27.1.1"); + props.setProperty("GOOGLE_MAPS_ANDROID_SDK", ""); widget.preference.each { pref -> def name = pref.attributes().name @@ -62,14 +51,13 @@ android { isKeyFound = 1 props.setProperty(name, value) } - if (name == "GOOGLE_MAPS_ANDROID_SDK" || - name == "APP_COMPAT_VERSION" || - name == "PLAY_SERVICES_BASEMENT_VERSION" || - name == "PLAY_SERVICES_BASE_VERSION" || - name == "PLAY_SERVICES_GCM_VERSION" || - name == "PLAY_SERVICES_LOCATION_VERSION") { + if (name == "GOOGLE_MAPS_PLAY_SERVICES_VERSION") { props.setProperty(name, value) } + if (name == "GOOGLE_MAPS_ANDROID_SDK") { + useBetaSdk = 1 + props.setProperty("GOOGLE_MAPS_ANDROID_SDK", value) + } } @@ -77,45 +65,29 @@ android { throw new GradleException("Please add '' to the config.xml file.") } - //---------- - // maps SDK - //---------- - def libsDirPath = System.getProperty("user.dir") - def libsDir = new File("${libsDirPath}/libs/") - if (!libsDir.exists()) { - libsDir.mkdirs() - } + if (useBetaSdk == 1) { + def libsDirPath = System.getProperty("user.dir") + def libsDir = new File("${libsDirPath}/libs/") + if (!libsDir.exists()) { + libsDir.mkdirs() + } - def mapsSDK = props.getProperty("GOOGLE_MAPS_ANDROID_SDK") - def f = new File("${libsDir.absolutePath}/${mapsSDK}.aar") - println("---->GOOGLE_MAPS_ANDROID_SDK = " + f.absolutePath); - if (!f.exists()) { - new URL("https://dl.google.com/dl/geosdk/${mapsSDK}.aar").withInputStream{ i -> f.withOutputStream{ it << i }} - } - dependencies { - implementation name: mapsSDK, ext:'aar' + def mapsSDK = props.getProperty("GOOGLE_MAPS_ANDROID_SDK") + def f = new File("${libsDir.absolutePath}/${mapsSDK}.aar") + println("---->lib = " + f.absolutePath); + if (!f.exists()) { + new URL("https://dl.google.com/dl/geosdk/${mapsSDK}.aar").withInputStream{ i -> f.withOutputStream{ it << i }} + } + dependencies { + implementation name: mapsSDK, ext:'aar' + } } - //------------- - // dependencies - //------------- - def APP_COMPAT_VERSION = props.getProperty("APP_COMPAT_VERSION") - def PLAY_SERVICES_BASEMENT_VERSION = props.getProperty("PLAY_SERVICES_BASEMENT_VERSION") - def PLAY_SERVICES_BASE_VERSION = props.getProperty("PLAY_SERVICES_BASE_VERSION") - def PLAY_SERVICES_GCM_VERSION = props.getProperty("PLAY_SERVICES_GCM_VERSION") - def PLAY_SERVICES_LOCATION_VERSION = props.getProperty("PLAY_SERVICES_LOCATION_VERSION") - - println("---->APP_COMPAT_VERSION = ${APP_COMPAT_VERSION}") - println("---->PLAY_SERVICES_BASEMENT_VERSION = ${PLAY_SERVICES_BASEMENT_VERSION}") - println("---->PLAY_SERVICES_BASE_VERSION = ${PLAY_SERVICES_BASE_VERSION}") - println("---->PLAY_SERVICES_GCM_VERSION = ${PLAY_SERVICES_GCM_VERSION}") - println("---->PLAY_SERVICES_LOCATION_VERSION = ${PLAY_SERVICES_LOCATION_VERSION}") + def PLAY_SERVICES_VERSION = props.get("GOOGLE_MAPS_PLAY_SERVICES_VERSION") + println("---->PLAY_SERVICES_VERSION = ${PLAY_SERVICES_VERSION}") dependencies { - implementation "androidx.appcompat:appcompat:${APP_COMPAT_VERSION}" - implementation "com.google.android.gms:play-services-basement:${PLAY_SERVICES_BASEMENT_VERSION}" - implementation "com.google.android.gms:play-services-base:${PLAY_SERVICES_BASE_VERSION}" - implementation "com.google.android.gms:play-services-gcm:${PLAY_SERVICES_GCM_VERSION}" - implementation "com.google.android.gms:play-services-location:${PLAY_SERVICES_LOCATION_VERSION}" + implementation "com.google.android.gms:play-services-maps:${PLAY_SERVICES_VERSION}" + implementation "com.google.android.gms:play-services-location:${PLAY_SERVICES_VERSION}" } diff --git a/src/android/frameworks/tbxml-android.gradle b/src/android/frameworks/tbxml-android.gradle index 4c4edcefc..d329088e1 100644 --- a/src/android/frameworks/tbxml-android.gradle +++ b/src/android/frameworks/tbxml-android.gradle @@ -13,7 +13,7 @@ dependencies { } android { - compileSdkVersion 28 + compileSdkVersion 26 packagingOptions { exclude 'README' diff --git a/src/android/plugin/google/maps/BitmapCache.java b/src/android/plugin/google/maps/BitmapCache.java index 1ee9365a4..fe3a7f401 100644 --- a/src/android/plugin/google/maps/BitmapCache.java +++ b/src/android/plugin/google/maps/BitmapCache.java @@ -1,7 +1,7 @@ package plugin.google.maps; import android.graphics.Bitmap; -import androidx.collection.LruCache; +import android.util.LruCache; public class BitmapCache extends LruCache { diff --git a/src/android/plugin/google/maps/CordovaGoogleMaps.java b/src/android/plugin/google/maps/CordovaGoogleMaps.java index f120e490c..0b26f29b2 100644 --- a/src/android/plugin/google/maps/CordovaGoogleMaps.java +++ b/src/android/plugin/google/maps/CordovaGoogleMaps.java @@ -24,7 +24,7 @@ import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; -import com.google.android.libraries.maps.MapsInitializer; +import com.google.android.gms.maps.MapsInitializer; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; @@ -84,86 +84,86 @@ public void run() { // ------------------------------ // Check of Google Play Services // ------------------------------ -// int checkGooglePlayServices = GooglePlayServicesUtil.isGooglePlayServicesAvailable(activity); -// -// Log.d(TAG, "----> checkGooglePlayServices = " + (ConnectionResult.SUCCESS == checkGooglePlayServices)); -// -// if (checkGooglePlayServices != ConnectionResult.SUCCESS) { -// // google play services is missing!!!! -// /* -// * Returns status code indicating whether there was an error. Can be one -// * of following in ConnectionResult: SUCCESS, SERVICE_MISSING, -// * SERVICE_VERSION_UPDATE_REQUIRED, SERVICE_DISABLED, SERVICE_INVALID. -// */ -// Log.e(TAG, "---Google Play Services is not available: " + GooglePlayServicesUtil.getErrorString(checkGooglePlayServices)); -// -// boolean isNeedToUpdate = false; -// -// String errorMsg = PluginUtil.getPgmStrings(activity, "pgm_google_play_error"); -// switch (checkGooglePlayServices) { -// case ConnectionResult.DEVELOPER_ERROR: -// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_developer_error"); -// break; -// case ConnectionResult.INTERNAL_ERROR: -// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_internal_error"); -// break; -// case ConnectionResult.INVALID_ACCOUNT: -// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_invalid_account"); -// break; -// case ConnectionResult.LICENSE_CHECK_FAILED: -// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_license_check_failed"); -// break; -// case ConnectionResult.NETWORK_ERROR: -// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_network_error"); -// break; -// case ConnectionResult.SERVICE_DISABLED: -// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_disabled"); -// break; -// case ConnectionResult.SERVICE_INVALID: -// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_invalid"); -// isNeedToUpdate = true; -// break; -// case ConnectionResult.SERVICE_MISSING: -// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_missing"); -// isNeedToUpdate = true; -// break; -// case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED: -// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_update_required"); -// isNeedToUpdate = true; -// break; -// case ConnectionResult.SIGN_IN_REQUIRED: -// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_sign_in_required"); -// break; -// default: -// isNeedToUpdate = true; -// break; -// } -// -// final boolean finalIsNeedToUpdate = isNeedToUpdate; -// AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(activity); -// alertDialogBuilder -// .setMessage(errorMsg) -// .setCancelable(false) -// .setPositiveButton(PluginUtil.getPgmStrings(activity,"pgm_google_close_button"), new DialogInterface.OnClickListener() { -// public void onClick(DialogInterface dialog,int id) { -// dialog.dismiss(); -// if (finalIsNeedToUpdate) { -// try { -// activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.google.android.gms"))); -// } catch (android.content.ActivityNotFoundException anfe) { -// activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=com.google.android.gms"))); -// } -// } -// } -// }); -// AlertDialog alertDialog = alertDialogBuilder.create(); -// -// // show it -// alertDialog.show(); -// -// Log.e(TAG, "Google Play Services is not available."); -// return; -// } + int checkGooglePlayServices = GooglePlayServicesUtil.isGooglePlayServicesAvailable(activity); + + Log.d(TAG, "----> checkGooglePlayServices = " + (ConnectionResult.SUCCESS == checkGooglePlayServices)); + + if (checkGooglePlayServices != ConnectionResult.SUCCESS) { + // google play services is missing!!!! + /* + * Returns status code indicating whether there was an error. Can be one + * of following in ConnectionResult: SUCCESS, SERVICE_MISSING, + * SERVICE_VERSION_UPDATE_REQUIRED, SERVICE_DISABLED, SERVICE_INVALID. + */ + Log.e(TAG, "---Google Play Services is not available: " + GooglePlayServicesUtil.getErrorString(checkGooglePlayServices)); + + boolean isNeedToUpdate = false; + + String errorMsg = PluginUtil.getPgmStrings(activity, "pgm_google_play_error"); + switch (checkGooglePlayServices) { + case ConnectionResult.DEVELOPER_ERROR: + errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_developer_error"); + break; + case ConnectionResult.INTERNAL_ERROR: + errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_internal_error"); + break; + case ConnectionResult.INVALID_ACCOUNT: + errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_invalid_account"); + break; + case ConnectionResult.LICENSE_CHECK_FAILED: + errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_license_check_failed"); + break; + case ConnectionResult.NETWORK_ERROR: + errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_network_error"); + break; + case ConnectionResult.SERVICE_DISABLED: + errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_disabled"); + break; + case ConnectionResult.SERVICE_INVALID: + errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_invalid"); + isNeedToUpdate = true; + break; + case ConnectionResult.SERVICE_MISSING: + errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_missing"); + isNeedToUpdate = true; + break; + case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED: + errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_update_required"); + isNeedToUpdate = true; + break; + case ConnectionResult.SIGN_IN_REQUIRED: + errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_sign_in_required"); + break; + default: + isNeedToUpdate = true; + break; + } + + final boolean finalIsNeedToUpdate = isNeedToUpdate; + AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(activity); + alertDialogBuilder + .setMessage(errorMsg) + .setCancelable(false) + .setPositiveButton(PluginUtil.getPgmStrings(activity,"pgm_google_close_button"), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int id) { + dialog.dismiss(); + if (finalIsNeedToUpdate) { + try { + activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.google.android.gms"))); + } catch (android.content.ActivityNotFoundException anfe) { + activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=com.google.android.gms"))); + } + } + } + }); + AlertDialog alertDialog = alertDialogBuilder.create(); + + // show it + alertDialog.show(); + + Log.e(TAG, "Google Play Services is not available."); + return; + } webView.getView().setBackgroundColor(Color.TRANSPARENT); webView.getView().setOverScrollMode(View.OVER_SCROLL_NEVER); diff --git a/src/android/plugin/google/maps/MyPlugin.java b/src/android/plugin/google/maps/MyPlugin.java index 1b3cf41b0..9af3faab6 100644 --- a/src/android/plugin/google/maps/MyPlugin.java +++ b/src/android/plugin/google/maps/MyPlugin.java @@ -4,14 +4,14 @@ import android.content.res.Resources; import android.util.Log; -import com.google.android.libraries.maps.GoogleMap; -import com.google.android.libraries.maps.model.Circle; -import com.google.android.libraries.maps.model.GroundOverlay; -import com.google.android.libraries.maps.model.LatLng; -import com.google.android.libraries.maps.model.Marker; -import com.google.android.libraries.maps.model.Polygon; -import com.google.android.libraries.maps.model.Polyline; -import com.google.android.libraries.maps.model.TileOverlay; +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.model.Circle; +import com.google.android.gms.maps.model.GroundOverlay; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.Marker; +import com.google.android.gms.maps.model.Polygon; +import com.google.android.gms.maps.model.Polyline; +import com.google.android.gms.maps.model.TileOverlay; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/ObjectCache.java b/src/android/plugin/google/maps/ObjectCache.java index 32a407f9f..12df5d247 100644 --- a/src/android/plugin/google/maps/ObjectCache.java +++ b/src/android/plugin/google/maps/ObjectCache.java @@ -1,6 +1,6 @@ package plugin.google.maps; -import androidx.collection.LruCache; +import android.util.LruCache; import java.util.HashSet; diff --git a/src/android/plugin/google/maps/PluginCircle.java b/src/android/plugin/google/maps/PluginCircle.java index 8e51a58a8..58b888a78 100644 --- a/src/android/plugin/google/maps/PluginCircle.java +++ b/src/android/plugin/google/maps/PluginCircle.java @@ -1,9 +1,9 @@ package plugin.google.maps; -import com.google.android.libraries.maps.model.Circle; -import com.google.android.libraries.maps.model.CircleOptions; -import com.google.android.libraries.maps.model.LatLng; -import com.google.android.libraries.maps.model.LatLngBounds; +import com.google.android.gms.maps.model.Circle; +import com.google.android.gms.maps.model.CircleOptions; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLngBounds; import org.apache.cordova.CallbackContext; import org.json.JSONArray; diff --git a/src/android/plugin/google/maps/PluginDirectionsService.java b/src/android/plugin/google/maps/PluginDirectionsService.java index f84c2985a..4b98f30bc 100644 --- a/src/android/plugin/google/maps/PluginDirectionsService.java +++ b/src/android/plugin/google/maps/PluginDirectionsService.java @@ -5,7 +5,7 @@ import android.content.pm.PackageManager; import android.util.Log; -import com.google.android.libraries.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLng; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginElevationService.java b/src/android/plugin/google/maps/PluginElevationService.java index 9c1afceb6..b2c679ff9 100644 --- a/src/android/plugin/google/maps/PluginElevationService.java +++ b/src/android/plugin/google/maps/PluginElevationService.java @@ -5,7 +5,7 @@ import android.content.pm.PackageManager; import android.util.Log; -import com.google.android.libraries.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLng; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginEnvironment.java b/src/android/plugin/google/maps/PluginEnvironment.java index 02a1fb724..df8eb98d7 100644 --- a/src/android/plugin/google/maps/PluginEnvironment.java +++ b/src/android/plugin/google/maps/PluginEnvironment.java @@ -78,7 +78,7 @@ public void isAvailable(final JSONArray args, final CallbackContext callbackCont // ------------------------------ try { @SuppressWarnings({ "rawtypes" }) - Class GoogleMapsClass = Class.forName("com.google.android.libraries.maps.GoogleMap"); + Class GoogleMapsClass = Class.forName("com.google.android.gms.maps.GoogleMap"); } catch (Exception e) { Log.e("GoogleMaps", "Error", e); callbackContext.error(e.getMessage()); diff --git a/src/android/plugin/google/maps/PluginGeocoder.java b/src/android/plugin/google/maps/PluginGeocoder.java index 1024cf72c..c2cda4687 100644 --- a/src/android/plugin/google/maps/PluginGeocoder.java +++ b/src/android/plugin/google/maps/PluginGeocoder.java @@ -4,7 +4,7 @@ import android.location.Geocoder; import android.os.Bundle; -import com.google.android.libraries.maps.model.LatLngBounds; +import com.google.android.gms.maps.model.LatLngBounds; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginGroundOverlay.java b/src/android/plugin/google/maps/PluginGroundOverlay.java index ae2166dc4..229bf5694 100644 --- a/src/android/plugin/google/maps/PluginGroundOverlay.java +++ b/src/android/plugin/google/maps/PluginGroundOverlay.java @@ -3,11 +3,11 @@ import android.graphics.Bitmap; import android.os.AsyncTask; -import com.google.android.libraries.maps.model.BitmapDescriptor; -import com.google.android.libraries.maps.model.BitmapDescriptorFactory; -import com.google.android.libraries.maps.model.GroundOverlay; -import com.google.android.libraries.maps.model.GroundOverlayOptions; -import com.google.android.libraries.maps.model.LatLngBounds; +import com.google.android.gms.maps.model.BitmapDescriptor; +import com.google.android.gms.maps.model.BitmapDescriptorFactory; +import com.google.android.gms.maps.model.GroundOverlay; +import com.google.android.gms.maps.model.GroundOverlayOptions; +import com.google.android.gms.maps.model.LatLngBounds; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginMap.java b/src/android/plugin/google/maps/PluginMap.java index fe6858cb1..b7e95e05f 100644 --- a/src/android/plugin/google/maps/PluginMap.java +++ b/src/android/plugin/google/maps/PluginMap.java @@ -28,37 +28,37 @@ import android.widget.LinearLayout; import android.widget.TextView; -import com.google.android.libraries.maps.CameraUpdate; -import com.google.android.libraries.maps.CameraUpdateFactory; -import com.google.android.libraries.maps.GoogleMap; -import com.google.android.libraries.maps.GoogleMap.InfoWindowAdapter; -import com.google.android.libraries.maps.GoogleMap.OnIndoorStateChangeListener; -import com.google.android.libraries.maps.GoogleMap.OnInfoWindowClickListener; -import com.google.android.libraries.maps.GoogleMap.OnMapClickListener; -import com.google.android.libraries.maps.GoogleMap.OnMapLongClickListener; -import com.google.android.libraries.maps.GoogleMap.OnMarkerClickListener; -import com.google.android.libraries.maps.GoogleMap.OnMarkerDragListener; -import com.google.android.libraries.maps.GoogleMap.OnMyLocationButtonClickListener; -import com.google.android.libraries.maps.GoogleMapOptions; -import com.google.android.libraries.maps.MapView; -import com.google.android.libraries.maps.OnMapReadyCallback; -import com.google.android.libraries.maps.Projection; -import com.google.android.libraries.maps.UiSettings; -import com.google.android.libraries.maps.model.CameraPosition; -import com.google.android.libraries.maps.model.CameraPosition.Builder; -import com.google.android.libraries.maps.model.Circle; -import com.google.android.libraries.maps.model.GroundOverlay; -import com.google.android.libraries.maps.model.IndoorBuilding; -import com.google.android.libraries.maps.model.LatLng; -import com.google.android.libraries.maps.model.LatLngBounds; -import com.google.android.libraries.maps.model.MapStyleOptions; -import com.google.android.libraries.maps.model.Marker; -import com.google.android.libraries.maps.model.MarkerOptions; -import com.google.android.libraries.maps.model.PointOfInterest; -import com.google.android.libraries.maps.model.Polygon; -import com.google.android.libraries.maps.model.Polyline; -import com.google.android.libraries.maps.model.PolylineOptions; -import com.google.android.libraries.maps.model.VisibleRegion; +import com.google.android.gms.maps.CameraUpdate; +import com.google.android.gms.maps.CameraUpdateFactory; +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.GoogleMap.InfoWindowAdapter; +import com.google.android.gms.maps.GoogleMap.OnIndoorStateChangeListener; +import com.google.android.gms.maps.GoogleMap.OnInfoWindowClickListener; +import com.google.android.gms.maps.GoogleMap.OnMapClickListener; +import com.google.android.gms.maps.GoogleMap.OnMapLongClickListener; +import com.google.android.gms.maps.GoogleMap.OnMarkerClickListener; +import com.google.android.gms.maps.GoogleMap.OnMarkerDragListener; +import com.google.android.gms.maps.GoogleMap.OnMyLocationButtonClickListener; +import com.google.android.gms.maps.GoogleMapOptions; +import com.google.android.gms.maps.MapView; +import com.google.android.gms.maps.OnMapReadyCallback; +import com.google.android.gms.maps.Projection; +import com.google.android.gms.maps.UiSettings; +import com.google.android.gms.maps.model.CameraPosition; +import com.google.android.gms.maps.model.CameraPosition.Builder; +import com.google.android.gms.maps.model.Circle; +import com.google.android.gms.maps.model.GroundOverlay; +import com.google.android.gms.maps.model.IndoorBuilding; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLngBounds; +import com.google.android.gms.maps.model.MapStyleOptions; +import com.google.android.gms.maps.model.Marker; +import com.google.android.gms.maps.model.MarkerOptions; +import com.google.android.gms.maps.model.PointOfInterest; +import com.google.android.gms.maps.model.Polygon; +import com.google.android.gms.maps.model.Polyline; +import com.google.android.gms.maps.model.PolylineOptions; +import com.google.android.gms.maps.model.VisibleRegion; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginMarker.java b/src/android/plugin/google/maps/PluginMarker.java index 7c5238689..cb9338f15 100644 --- a/src/android/plugin/google/maps/PluginMarker.java +++ b/src/android/plugin/google/maps/PluginMarker.java @@ -16,12 +16,12 @@ import android.view.animation.Interpolator; import android.view.animation.LinearInterpolator; -import com.google.android.libraries.maps.Projection; -import com.google.android.libraries.maps.model.BitmapDescriptor; -import com.google.android.libraries.maps.model.BitmapDescriptorFactory; -import com.google.android.libraries.maps.model.LatLng; -import com.google.android.libraries.maps.model.Marker; -import com.google.android.libraries.maps.model.MarkerOptions; +import com.google.android.gms.maps.Projection; +import com.google.android.gms.maps.model.BitmapDescriptor; +import com.google.android.gms.maps.model.BitmapDescriptorFactory; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.Marker; +import com.google.android.gms.maps.model.MarkerOptions; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginMarkerCluster.java b/src/android/plugin/google/maps/PluginMarkerCluster.java index 247738af7..f9a220e9e 100644 --- a/src/android/plugin/google/maps/PluginMarkerCluster.java +++ b/src/android/plugin/google/maps/PluginMarkerCluster.java @@ -4,10 +4,10 @@ import android.os.Bundle; import android.util.Log; -import com.google.android.libraries.maps.model.LatLng; -import com.google.android.libraries.maps.model.LatLngBounds; -import com.google.android.libraries.maps.model.Marker; -import com.google.android.libraries.maps.model.MarkerOptions; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLngBounds; +import com.google.android.gms.maps.model.Marker; +import com.google.android.gms.maps.model.MarkerOptions; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginPolygon.java b/src/android/plugin/google/maps/PluginPolygon.java index 0a6692581..231cd5884 100644 --- a/src/android/plugin/google/maps/PluginPolygon.java +++ b/src/android/plugin/google/maps/PluginPolygon.java @@ -1,9 +1,9 @@ package plugin.google.maps; -import com.google.android.libraries.maps.model.LatLng; -import com.google.android.libraries.maps.model.LatLngBounds; -import com.google.android.libraries.maps.model.Polygon; -import com.google.android.libraries.maps.model.PolygonOptions; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLngBounds; +import com.google.android.gms.maps.model.Polygon; +import com.google.android.gms.maps.model.PolygonOptions; import org.apache.cordova.CallbackContext; import org.json.JSONArray; diff --git a/src/android/plugin/google/maps/PluginPolyline.java b/src/android/plugin/google/maps/PluginPolyline.java index 70ad049c0..95643eb8d 100644 --- a/src/android/plugin/google/maps/PluginPolyline.java +++ b/src/android/plugin/google/maps/PluginPolyline.java @@ -3,12 +3,12 @@ import android.graphics.Color; import android.util.Log; -import com.google.android.libraries.maps.model.CircleOptions; -import com.google.android.libraries.maps.model.LatLng; -import com.google.android.libraries.maps.model.LatLngBounds; -import com.google.android.libraries.maps.model.MarkerOptions; -import com.google.android.libraries.maps.model.Polyline; -import com.google.android.libraries.maps.model.PolylineOptions; +import com.google.android.gms.maps.model.CircleOptions; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLngBounds; +import com.google.android.gms.maps.model.MarkerOptions; +import com.google.android.gms.maps.model.Polyline; +import com.google.android.gms.maps.model.PolylineOptions; import org.apache.cordova.CallbackContext; import org.json.JSONArray; diff --git a/src/android/plugin/google/maps/PluginStreetViewPanorama.java b/src/android/plugin/google/maps/PluginStreetViewPanorama.java index 0131069e3..b85a51e47 100644 --- a/src/android/plugin/google/maps/PluginStreetViewPanorama.java +++ b/src/android/plugin/google/maps/PluginStreetViewPanorama.java @@ -5,16 +5,16 @@ import android.view.View; import android.view.ViewGroup; -import com.google.android.libraries.maps.OnStreetViewPanoramaReadyCallback; -import com.google.android.libraries.maps.StreetViewPanorama; -import com.google.android.libraries.maps.StreetViewPanoramaOptions; -import com.google.android.libraries.maps.StreetViewPanoramaView; -import com.google.android.libraries.maps.model.LatLng; -import com.google.android.libraries.maps.model.StreetViewPanoramaCamera; -import com.google.android.libraries.maps.model.StreetViewPanoramaLink; -import com.google.android.libraries.maps.model.StreetViewPanoramaLocation; -import com.google.android.libraries.maps.model.StreetViewPanoramaOrientation; -import com.google.android.libraries.maps.model.StreetViewSource; +import com.google.android.gms.maps.OnStreetViewPanoramaReadyCallback; +import com.google.android.gms.maps.StreetViewPanorama; +import com.google.android.gms.maps.StreetViewPanoramaOptions; +import com.google.android.gms.maps.StreetViewPanoramaView; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.StreetViewPanoramaCamera; +import com.google.android.gms.maps.model.StreetViewPanoramaLink; +import com.google.android.gms.maps.model.StreetViewPanoramaLocation; +import com.google.android.gms.maps.model.StreetViewPanoramaOrientation; +import com.google.android.gms.maps.model.StreetViewSource; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginTileOverlay.java b/src/android/plugin/google/maps/PluginTileOverlay.java index 0f934e2b4..05ca806cb 100644 --- a/src/android/plugin/google/maps/PluginTileOverlay.java +++ b/src/android/plugin/google/maps/PluginTileOverlay.java @@ -4,8 +4,8 @@ import android.view.View; import android.webkit.WebView; -import com.google.android.libraries.maps.model.TileOverlay; -import com.google.android.libraries.maps.model.TileOverlayOptions; +import com.google.android.gms.maps.model.TileOverlay; +import com.google.android.gms.maps.model.TileOverlayOptions; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaPreferences; diff --git a/src/android/plugin/google/maps/PluginTileProvider.java b/src/android/plugin/google/maps/PluginTileProvider.java index 5073981e1..1bbb3b824 100644 --- a/src/android/plugin/google/maps/PluginTileProvider.java +++ b/src/android/plugin/google/maps/PluginTileProvider.java @@ -16,8 +16,8 @@ import android.text.TextPaint; import android.util.Log; -import com.google.android.libraries.maps.model.Tile; -import com.google.android.libraries.maps.model.TileProvider; +import com.google.android.gms.maps.model.Tile; +import com.google.android.gms.maps.model.TileProvider; import org.apache.cordova.CordovaWebView; diff --git a/src/android/plugin/google/maps/PluginUtil.java b/src/android/plugin/google/maps/PluginUtil.java index 7c7a1fee0..634362820 100644 --- a/src/android/plugin/google/maps/PluginUtil.java +++ b/src/android/plugin/google/maps/PluginUtil.java @@ -17,11 +17,11 @@ import android.os.Bundle; import android.util.Base64; -import com.google.android.libraries.maps.model.IndoorBuilding; -import com.google.android.libraries.maps.model.IndoorLevel; -import com.google.android.libraries.maps.model.LatLng; -import com.google.android.libraries.maps.model.LatLngBounds; -import com.google.android.libraries.maps.model.LatLngBounds.Builder; +import com.google.android.gms.maps.model.IndoorBuilding; +import com.google.android.gms.maps.model.IndoorLevel; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLngBounds; +import com.google.android.gms.maps.model.LatLngBounds.Builder; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaResourceApi; diff --git a/www/DirectionsRenderer.js b/www/DirectionsRenderer.js index 129f01e8b..ab4954bcd 100644 --- a/www/DirectionsRenderer.js +++ b/www/DirectionsRenderer.js @@ -418,32 +418,6 @@ DirectionsRenderer.prototype.setRouteIndex = function(index) { self.set('routeIndex', index); }; -DirectionsRenderer.prototype.remove = function(callback) { - var self = this; - if (self._isRemoved) { - if (typeof callback === 'function') { - return; - } else { - return Promise.resolve(); - } - } - Object.defineProperty(self, '_isRemoved', { - value: true, - writable: false - }); - - - var resolver = function(resolve) { - self.polyline.remove().then(resolve); - }; - - if (typeof callback === 'function') { - resolver.call(self, callback, null); - return; - } else { - return Promise.resolve(); - } -}; DirectionsRenderer.prototype._redrawRoute = function(oldIdx, newIdx) { var self = this; var options = self.get('options'); From 885d8e58d743605a382ea54d7ed3743ac1072700 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Fri, 29 May 2020 10:23:29 -0700 Subject: [PATCH 37/50] Revert "Revert "Use `Maps SDK for Android v.3` instead of Google Play Services"" This reverts commit 3f47931fa0b482c99bb818dc9d338770a8120d27. --- README.md | 17 +- package.json | 2 +- plugin.xml | 2 +- src/android/frameworks/pgm-custom.gradle | 84 ++++++--- src/android/frameworks/tbxml-android.gradle | 2 +- .../plugin/google/maps/BitmapCache.java | 2 +- .../plugin/google/maps/CordovaGoogleMaps.java | 162 +++++++++--------- src/android/plugin/google/maps/MyPlugin.java | 16 +- .../plugin/google/maps/ObjectCache.java | 2 +- .../plugin/google/maps/PluginCircle.java | 8 +- .../google/maps/PluginDirectionsService.java | 2 +- .../google/maps/PluginElevationService.java | 2 +- .../plugin/google/maps/PluginEnvironment.java | 2 +- .../plugin/google/maps/PluginGeocoder.java | 2 +- .../google/maps/PluginGroundOverlay.java | 10 +- src/android/plugin/google/maps/PluginMap.java | 62 +++---- .../plugin/google/maps/PluginMarker.java | 12 +- .../google/maps/PluginMarkerCluster.java | 8 +- .../plugin/google/maps/PluginPolygon.java | 8 +- .../plugin/google/maps/PluginPolyline.java | 12 +- .../google/maps/PluginStreetViewPanorama.java | 20 +-- .../plugin/google/maps/PluginTileOverlay.java | 4 +- .../google/maps/PluginTileProvider.java | 4 +- .../plugin/google/maps/PluginUtil.java | 10 +- www/DirectionsRenderer.js | 26 +++ 25 files changed, 268 insertions(+), 213 deletions(-) diff --git a/README.md b/README.md index 95ee79660..57f93d48a 100644 --- a/README.md +++ b/README.md @@ -85,14 +85,13 @@ For browser platform, ## Install optional variables (config.xml) - - ![](https://raw.githubusercontent.com/mapsplugin/cordova-plugin-googlemaps/master/images/icon-android.png) **PLAY_SERVICES_VERSION = (17.0.0)**
- The Google Play Services SDK version. - _You need to specify the same version number with all other plugins._ - Check out the latest version [here](https://developers.google.com/android/guides/releases). - - - ![](https://raw.githubusercontent.com/mapsplugin/cordova-plugin-googlemaps/master/images/icon-android.png) **GOOGLE_MAPS_ANDROID_SDK = ()**
- The Google Maps SDK for Android version. - `i.e. GOOGLE_MAPS_ANDROID_SDK=maps-sdk-3.0.0-beta`. + - ![](https://raw.githubusercontent.com/mapsplugin/cordova-plugin-googlemaps/master/images/icon-android.png) **APP_COMPAT_VERSION = (1.1.0)**
+ **PLAY_SERVICES_BASEMENT_VERSION = (17.2.1)**
+ **PLAY_SERVICES_BASE_VERSION = (17.2.1)**
+ **PLAY_SERVICES_GCM_VERSION = (17.0.0)**
+ **PLAY_SERVICES_LOCATION_VERSION = (17.0.0)**
+ **GOOGLE_MAPS_ANDROID_SDK = (maps-sdk-3.0.0-beta)**
+ cordova-plugin-googlemaps version 2.8.0 or later uses [Maps SDK for Android v.3](https://developers.google.com/maps/documentation/android-sdk/v3-client-migration). - ![](https://raw.githubusercontent.com/mapsplugin/cordova-plugin-googlemaps/master/images/icon-ios.png) **LOCATION_WHEN_IN_USE_DESCRIPTION**
This message is displayed when your application requests **LOCATION PERMISSION for only necessary times**. @@ -113,6 +112,8 @@ For browser platform, ## Release Notes - **v2.8.0** + - Important Change: (Android) This plugin uses [Maps SDK for Android v.3.0.0 BETA](https://developers.google.com/maps/documentation/android-sdk/v3-client-migration). **No longer use `com.google.android.gms:play-services-maps` library.** + Because of this, this plugin uses `Androidx`. - Add: (Android/iOS/Browser) `mapOptions.preferences.restriction` which is able to set the camera bounds. - Add: (Android/iOS/Browser) `mapOptions.preferences.clickableIcons` which is able to be disable clicking on POI icons. - Bug fix: (Android/iOS/Browser) `mapOptions.preferences.building` does not work. diff --git a/package.json b/package.json index 27eee6fd4..3a6e20d1b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-googlemaps", - "version": "2.8.0-20200521-2050", + "version": "2.8.0-20200528-2358", "description": "Google Maps native SDK for Android and iOS, and Google Maps JavaScript API v3 for browser.", "cordova": { "id": "cordova-plugin-googlemaps", diff --git a/plugin.xml b/plugin.xml index 03ae6f7c8..89801d7a8 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - + cordova-plugin-googlemaps diff --git a/src/android/frameworks/pgm-custom.gradle b/src/android/frameworks/pgm-custom.gradle index a3945df17..e6209178d 100644 --- a/src/android/frameworks/pgm-custom.gradle +++ b/src/android/frameworks/pgm-custom.gradle @@ -12,7 +12,14 @@ def searchFileInParents(target) { return null; } +ext { + android { + useAndroidX=true + enableJetifier=true + } +} android { + // #1. Find (project)/config.xml file, // because ionic capacitor does not copy nodes def configXmlFile = searchFileInParents("config.xml") @@ -38,10 +45,14 @@ android { println("preference = " + widget.preference.size()) Properties props = new Properties() def isKeyFound = 0 - def useBetaSdk = 0 - props.setProperty("GOOGLE_MAPS_PLAY_SERVICES_VERSION", "17.0.0"); - // props.setProperty("ANDROID_SUPPORT_V4_VERSION", "27.1.1"); - props.setProperty("GOOGLE_MAPS_ANDROID_SDK", ""); + + props.setProperty("GOOGLE_MAPS_ANDROID_SDK", "maps-sdk-3.0.0-beta"); + props.setProperty("APP_COMPAT_VERSION", "1.1.0"); + props.setProperty("PLAY_SERVICES_BASEMENT_VERSION", "17.2.1"); + props.setProperty("PLAY_SERVICES_BASE_VERSION", "17.2.1"); + props.setProperty("PLAY_SERVICES_GCM_VERSION", "17.0.0"); + props.setProperty("PLAY_SERVICES_LOCATION_VERSION", "17.0.0"); + widget.preference.each { pref -> def name = pref.attributes().name @@ -51,13 +62,14 @@ android { isKeyFound = 1 props.setProperty(name, value) } - if (name == "GOOGLE_MAPS_PLAY_SERVICES_VERSION") { + if (name == "GOOGLE_MAPS_ANDROID_SDK" || + name == "APP_COMPAT_VERSION" || + name == "PLAY_SERVICES_BASEMENT_VERSION" || + name == "PLAY_SERVICES_BASE_VERSION" || + name == "PLAY_SERVICES_GCM_VERSION" || + name == "PLAY_SERVICES_LOCATION_VERSION") { props.setProperty(name, value) } - if (name == "GOOGLE_MAPS_ANDROID_SDK") { - useBetaSdk = 1 - props.setProperty("GOOGLE_MAPS_ANDROID_SDK", value) - } } @@ -65,29 +77,45 @@ android { throw new GradleException("Please add '' to the config.xml file.") } - if (useBetaSdk == 1) { - def libsDirPath = System.getProperty("user.dir") - def libsDir = new File("${libsDirPath}/libs/") - if (!libsDir.exists()) { - libsDir.mkdirs() - } + //---------- + // maps SDK + //---------- + def libsDirPath = System.getProperty("user.dir") + def libsDir = new File("${libsDirPath}/libs/") + if (!libsDir.exists()) { + libsDir.mkdirs() + } - def mapsSDK = props.getProperty("GOOGLE_MAPS_ANDROID_SDK") - def f = new File("${libsDir.absolutePath}/${mapsSDK}.aar") - println("---->lib = " + f.absolutePath); - if (!f.exists()) { - new URL("https://dl.google.com/dl/geosdk/${mapsSDK}.aar").withInputStream{ i -> f.withOutputStream{ it << i }} - } - dependencies { - implementation name: mapsSDK, ext:'aar' - } + def mapsSDK = props.getProperty("GOOGLE_MAPS_ANDROID_SDK") + def f = new File("${libsDir.absolutePath}/${mapsSDK}.aar") + println("---->GOOGLE_MAPS_ANDROID_SDK = " + f.absolutePath); + if (!f.exists()) { + new URL("https://dl.google.com/dl/geosdk/${mapsSDK}.aar").withInputStream{ i -> f.withOutputStream{ it << i }} } + dependencies { + implementation name: mapsSDK, ext:'aar' + } + + //------------- + // dependencies + //------------- + def APP_COMPAT_VERSION = props.getProperty("APP_COMPAT_VERSION") + def PLAY_SERVICES_BASEMENT_VERSION = props.getProperty("PLAY_SERVICES_BASEMENT_VERSION") + def PLAY_SERVICES_BASE_VERSION = props.getProperty("PLAY_SERVICES_BASE_VERSION") + def PLAY_SERVICES_GCM_VERSION = props.getProperty("PLAY_SERVICES_GCM_VERSION") + def PLAY_SERVICES_LOCATION_VERSION = props.getProperty("PLAY_SERVICES_LOCATION_VERSION") - def PLAY_SERVICES_VERSION = props.get("GOOGLE_MAPS_PLAY_SERVICES_VERSION") - println("---->PLAY_SERVICES_VERSION = ${PLAY_SERVICES_VERSION}") + println("---->APP_COMPAT_VERSION = ${APP_COMPAT_VERSION}") + println("---->PLAY_SERVICES_BASEMENT_VERSION = ${PLAY_SERVICES_BASEMENT_VERSION}") + println("---->PLAY_SERVICES_BASE_VERSION = ${PLAY_SERVICES_BASE_VERSION}") + println("---->PLAY_SERVICES_GCM_VERSION = ${PLAY_SERVICES_GCM_VERSION}") + println("---->PLAY_SERVICES_LOCATION_VERSION = ${PLAY_SERVICES_LOCATION_VERSION}") dependencies { - implementation "com.google.android.gms:play-services-maps:${PLAY_SERVICES_VERSION}" - implementation "com.google.android.gms:play-services-location:${PLAY_SERVICES_VERSION}" + implementation "androidx.appcompat:appcompat:${APP_COMPAT_VERSION}" + implementation "com.google.android.gms:play-services-basement:${PLAY_SERVICES_BASEMENT_VERSION}" + implementation "com.google.android.gms:play-services-base:${PLAY_SERVICES_BASE_VERSION}" + implementation "com.google.android.gms:play-services-gcm:${PLAY_SERVICES_GCM_VERSION}" + implementation "com.google.android.gms:play-services-location:${PLAY_SERVICES_LOCATION_VERSION}" } diff --git a/src/android/frameworks/tbxml-android.gradle b/src/android/frameworks/tbxml-android.gradle index d329088e1..4c4edcefc 100644 --- a/src/android/frameworks/tbxml-android.gradle +++ b/src/android/frameworks/tbxml-android.gradle @@ -13,7 +13,7 @@ dependencies { } android { - compileSdkVersion 26 + compileSdkVersion 28 packagingOptions { exclude 'README' diff --git a/src/android/plugin/google/maps/BitmapCache.java b/src/android/plugin/google/maps/BitmapCache.java index fe3a7f401..1ee9365a4 100644 --- a/src/android/plugin/google/maps/BitmapCache.java +++ b/src/android/plugin/google/maps/BitmapCache.java @@ -1,7 +1,7 @@ package plugin.google.maps; import android.graphics.Bitmap; -import android.util.LruCache; +import androidx.collection.LruCache; public class BitmapCache extends LruCache { diff --git a/src/android/plugin/google/maps/CordovaGoogleMaps.java b/src/android/plugin/google/maps/CordovaGoogleMaps.java index 0b26f29b2..f120e490c 100644 --- a/src/android/plugin/google/maps/CordovaGoogleMaps.java +++ b/src/android/plugin/google/maps/CordovaGoogleMaps.java @@ -24,7 +24,7 @@ import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; -import com.google.android.gms.maps.MapsInitializer; +import com.google.android.libraries.maps.MapsInitializer; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; @@ -84,86 +84,86 @@ public void run() { // ------------------------------ // Check of Google Play Services // ------------------------------ - int checkGooglePlayServices = GooglePlayServicesUtil.isGooglePlayServicesAvailable(activity); - - Log.d(TAG, "----> checkGooglePlayServices = " + (ConnectionResult.SUCCESS == checkGooglePlayServices)); - - if (checkGooglePlayServices != ConnectionResult.SUCCESS) { - // google play services is missing!!!! - /* - * Returns status code indicating whether there was an error. Can be one - * of following in ConnectionResult: SUCCESS, SERVICE_MISSING, - * SERVICE_VERSION_UPDATE_REQUIRED, SERVICE_DISABLED, SERVICE_INVALID. - */ - Log.e(TAG, "---Google Play Services is not available: " + GooglePlayServicesUtil.getErrorString(checkGooglePlayServices)); - - boolean isNeedToUpdate = false; - - String errorMsg = PluginUtil.getPgmStrings(activity, "pgm_google_play_error"); - switch (checkGooglePlayServices) { - case ConnectionResult.DEVELOPER_ERROR: - errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_developer_error"); - break; - case ConnectionResult.INTERNAL_ERROR: - errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_internal_error"); - break; - case ConnectionResult.INVALID_ACCOUNT: - errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_invalid_account"); - break; - case ConnectionResult.LICENSE_CHECK_FAILED: - errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_license_check_failed"); - break; - case ConnectionResult.NETWORK_ERROR: - errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_network_error"); - break; - case ConnectionResult.SERVICE_DISABLED: - errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_disabled"); - break; - case ConnectionResult.SERVICE_INVALID: - errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_invalid"); - isNeedToUpdate = true; - break; - case ConnectionResult.SERVICE_MISSING: - errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_missing"); - isNeedToUpdate = true; - break; - case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED: - errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_update_required"); - isNeedToUpdate = true; - break; - case ConnectionResult.SIGN_IN_REQUIRED: - errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_sign_in_required"); - break; - default: - isNeedToUpdate = true; - break; - } - - final boolean finalIsNeedToUpdate = isNeedToUpdate; - AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(activity); - alertDialogBuilder - .setMessage(errorMsg) - .setCancelable(false) - .setPositiveButton(PluginUtil.getPgmStrings(activity,"pgm_google_close_button"), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog,int id) { - dialog.dismiss(); - if (finalIsNeedToUpdate) { - try { - activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.google.android.gms"))); - } catch (android.content.ActivityNotFoundException anfe) { - activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=com.google.android.gms"))); - } - } - } - }); - AlertDialog alertDialog = alertDialogBuilder.create(); - - // show it - alertDialog.show(); - - Log.e(TAG, "Google Play Services is not available."); - return; - } +// int checkGooglePlayServices = GooglePlayServicesUtil.isGooglePlayServicesAvailable(activity); +// +// Log.d(TAG, "----> checkGooglePlayServices = " + (ConnectionResult.SUCCESS == checkGooglePlayServices)); +// +// if (checkGooglePlayServices != ConnectionResult.SUCCESS) { +// // google play services is missing!!!! +// /* +// * Returns status code indicating whether there was an error. Can be one +// * of following in ConnectionResult: SUCCESS, SERVICE_MISSING, +// * SERVICE_VERSION_UPDATE_REQUIRED, SERVICE_DISABLED, SERVICE_INVALID. +// */ +// Log.e(TAG, "---Google Play Services is not available: " + GooglePlayServicesUtil.getErrorString(checkGooglePlayServices)); +// +// boolean isNeedToUpdate = false; +// +// String errorMsg = PluginUtil.getPgmStrings(activity, "pgm_google_play_error"); +// switch (checkGooglePlayServices) { +// case ConnectionResult.DEVELOPER_ERROR: +// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_developer_error"); +// break; +// case ConnectionResult.INTERNAL_ERROR: +// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_internal_error"); +// break; +// case ConnectionResult.INVALID_ACCOUNT: +// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_invalid_account"); +// break; +// case ConnectionResult.LICENSE_CHECK_FAILED: +// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_license_check_failed"); +// break; +// case ConnectionResult.NETWORK_ERROR: +// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_network_error"); +// break; +// case ConnectionResult.SERVICE_DISABLED: +// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_disabled"); +// break; +// case ConnectionResult.SERVICE_INVALID: +// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_invalid"); +// isNeedToUpdate = true; +// break; +// case ConnectionResult.SERVICE_MISSING: +// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_missing"); +// isNeedToUpdate = true; +// break; +// case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED: +// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_update_required"); +// isNeedToUpdate = true; +// break; +// case ConnectionResult.SIGN_IN_REQUIRED: +// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_sign_in_required"); +// break; +// default: +// isNeedToUpdate = true; +// break; +// } +// +// final boolean finalIsNeedToUpdate = isNeedToUpdate; +// AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(activity); +// alertDialogBuilder +// .setMessage(errorMsg) +// .setCancelable(false) +// .setPositiveButton(PluginUtil.getPgmStrings(activity,"pgm_google_close_button"), new DialogInterface.OnClickListener() { +// public void onClick(DialogInterface dialog,int id) { +// dialog.dismiss(); +// if (finalIsNeedToUpdate) { +// try { +// activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.google.android.gms"))); +// } catch (android.content.ActivityNotFoundException anfe) { +// activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=com.google.android.gms"))); +// } +// } +// } +// }); +// AlertDialog alertDialog = alertDialogBuilder.create(); +// +// // show it +// alertDialog.show(); +// +// Log.e(TAG, "Google Play Services is not available."); +// return; +// } webView.getView().setBackgroundColor(Color.TRANSPARENT); webView.getView().setOverScrollMode(View.OVER_SCROLL_NEVER); diff --git a/src/android/plugin/google/maps/MyPlugin.java b/src/android/plugin/google/maps/MyPlugin.java index 9af3faab6..1b3cf41b0 100644 --- a/src/android/plugin/google/maps/MyPlugin.java +++ b/src/android/plugin/google/maps/MyPlugin.java @@ -4,14 +4,14 @@ import android.content.res.Resources; import android.util.Log; -import com.google.android.gms.maps.GoogleMap; -import com.google.android.gms.maps.model.Circle; -import com.google.android.gms.maps.model.GroundOverlay; -import com.google.android.gms.maps.model.LatLng; -import com.google.android.gms.maps.model.Marker; -import com.google.android.gms.maps.model.Polygon; -import com.google.android.gms.maps.model.Polyline; -import com.google.android.gms.maps.model.TileOverlay; +import com.google.android.libraries.maps.GoogleMap; +import com.google.android.libraries.maps.model.Circle; +import com.google.android.libraries.maps.model.GroundOverlay; +import com.google.android.libraries.maps.model.LatLng; +import com.google.android.libraries.maps.model.Marker; +import com.google.android.libraries.maps.model.Polygon; +import com.google.android.libraries.maps.model.Polyline; +import com.google.android.libraries.maps.model.TileOverlay; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/ObjectCache.java b/src/android/plugin/google/maps/ObjectCache.java index 12df5d247..32a407f9f 100644 --- a/src/android/plugin/google/maps/ObjectCache.java +++ b/src/android/plugin/google/maps/ObjectCache.java @@ -1,6 +1,6 @@ package plugin.google.maps; -import android.util.LruCache; +import androidx.collection.LruCache; import java.util.HashSet; diff --git a/src/android/plugin/google/maps/PluginCircle.java b/src/android/plugin/google/maps/PluginCircle.java index 58b888a78..8e51a58a8 100644 --- a/src/android/plugin/google/maps/PluginCircle.java +++ b/src/android/plugin/google/maps/PluginCircle.java @@ -1,9 +1,9 @@ package plugin.google.maps; -import com.google.android.gms.maps.model.Circle; -import com.google.android.gms.maps.model.CircleOptions; -import com.google.android.gms.maps.model.LatLng; -import com.google.android.gms.maps.model.LatLngBounds; +import com.google.android.libraries.maps.model.Circle; +import com.google.android.libraries.maps.model.CircleOptions; +import com.google.android.libraries.maps.model.LatLng; +import com.google.android.libraries.maps.model.LatLngBounds; import org.apache.cordova.CallbackContext; import org.json.JSONArray; diff --git a/src/android/plugin/google/maps/PluginDirectionsService.java b/src/android/plugin/google/maps/PluginDirectionsService.java index 4b98f30bc..f84c2985a 100644 --- a/src/android/plugin/google/maps/PluginDirectionsService.java +++ b/src/android/plugin/google/maps/PluginDirectionsService.java @@ -5,7 +5,7 @@ import android.content.pm.PackageManager; import android.util.Log; -import com.google.android.gms.maps.model.LatLng; +import com.google.android.libraries.maps.model.LatLng; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginElevationService.java b/src/android/plugin/google/maps/PluginElevationService.java index b2c679ff9..9c1afceb6 100644 --- a/src/android/plugin/google/maps/PluginElevationService.java +++ b/src/android/plugin/google/maps/PluginElevationService.java @@ -5,7 +5,7 @@ import android.content.pm.PackageManager; import android.util.Log; -import com.google.android.gms.maps.model.LatLng; +import com.google.android.libraries.maps.model.LatLng; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginEnvironment.java b/src/android/plugin/google/maps/PluginEnvironment.java index df8eb98d7..02a1fb724 100644 --- a/src/android/plugin/google/maps/PluginEnvironment.java +++ b/src/android/plugin/google/maps/PluginEnvironment.java @@ -78,7 +78,7 @@ public void isAvailable(final JSONArray args, final CallbackContext callbackCont // ------------------------------ try { @SuppressWarnings({ "rawtypes" }) - Class GoogleMapsClass = Class.forName("com.google.android.gms.maps.GoogleMap"); + Class GoogleMapsClass = Class.forName("com.google.android.libraries.maps.GoogleMap"); } catch (Exception e) { Log.e("GoogleMaps", "Error", e); callbackContext.error(e.getMessage()); diff --git a/src/android/plugin/google/maps/PluginGeocoder.java b/src/android/plugin/google/maps/PluginGeocoder.java index c2cda4687..1024cf72c 100644 --- a/src/android/plugin/google/maps/PluginGeocoder.java +++ b/src/android/plugin/google/maps/PluginGeocoder.java @@ -4,7 +4,7 @@ import android.location.Geocoder; import android.os.Bundle; -import com.google.android.gms.maps.model.LatLngBounds; +import com.google.android.libraries.maps.model.LatLngBounds; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginGroundOverlay.java b/src/android/plugin/google/maps/PluginGroundOverlay.java index 229bf5694..ae2166dc4 100644 --- a/src/android/plugin/google/maps/PluginGroundOverlay.java +++ b/src/android/plugin/google/maps/PluginGroundOverlay.java @@ -3,11 +3,11 @@ import android.graphics.Bitmap; import android.os.AsyncTask; -import com.google.android.gms.maps.model.BitmapDescriptor; -import com.google.android.gms.maps.model.BitmapDescriptorFactory; -import com.google.android.gms.maps.model.GroundOverlay; -import com.google.android.gms.maps.model.GroundOverlayOptions; -import com.google.android.gms.maps.model.LatLngBounds; +import com.google.android.libraries.maps.model.BitmapDescriptor; +import com.google.android.libraries.maps.model.BitmapDescriptorFactory; +import com.google.android.libraries.maps.model.GroundOverlay; +import com.google.android.libraries.maps.model.GroundOverlayOptions; +import com.google.android.libraries.maps.model.LatLngBounds; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginMap.java b/src/android/plugin/google/maps/PluginMap.java index b7e95e05f..fe6858cb1 100644 --- a/src/android/plugin/google/maps/PluginMap.java +++ b/src/android/plugin/google/maps/PluginMap.java @@ -28,37 +28,37 @@ import android.widget.LinearLayout; import android.widget.TextView; -import com.google.android.gms.maps.CameraUpdate; -import com.google.android.gms.maps.CameraUpdateFactory; -import com.google.android.gms.maps.GoogleMap; -import com.google.android.gms.maps.GoogleMap.InfoWindowAdapter; -import com.google.android.gms.maps.GoogleMap.OnIndoorStateChangeListener; -import com.google.android.gms.maps.GoogleMap.OnInfoWindowClickListener; -import com.google.android.gms.maps.GoogleMap.OnMapClickListener; -import com.google.android.gms.maps.GoogleMap.OnMapLongClickListener; -import com.google.android.gms.maps.GoogleMap.OnMarkerClickListener; -import com.google.android.gms.maps.GoogleMap.OnMarkerDragListener; -import com.google.android.gms.maps.GoogleMap.OnMyLocationButtonClickListener; -import com.google.android.gms.maps.GoogleMapOptions; -import com.google.android.gms.maps.MapView; -import com.google.android.gms.maps.OnMapReadyCallback; -import com.google.android.gms.maps.Projection; -import com.google.android.gms.maps.UiSettings; -import com.google.android.gms.maps.model.CameraPosition; -import com.google.android.gms.maps.model.CameraPosition.Builder; -import com.google.android.gms.maps.model.Circle; -import com.google.android.gms.maps.model.GroundOverlay; -import com.google.android.gms.maps.model.IndoorBuilding; -import com.google.android.gms.maps.model.LatLng; -import com.google.android.gms.maps.model.LatLngBounds; -import com.google.android.gms.maps.model.MapStyleOptions; -import com.google.android.gms.maps.model.Marker; -import com.google.android.gms.maps.model.MarkerOptions; -import com.google.android.gms.maps.model.PointOfInterest; -import com.google.android.gms.maps.model.Polygon; -import com.google.android.gms.maps.model.Polyline; -import com.google.android.gms.maps.model.PolylineOptions; -import com.google.android.gms.maps.model.VisibleRegion; +import com.google.android.libraries.maps.CameraUpdate; +import com.google.android.libraries.maps.CameraUpdateFactory; +import com.google.android.libraries.maps.GoogleMap; +import com.google.android.libraries.maps.GoogleMap.InfoWindowAdapter; +import com.google.android.libraries.maps.GoogleMap.OnIndoorStateChangeListener; +import com.google.android.libraries.maps.GoogleMap.OnInfoWindowClickListener; +import com.google.android.libraries.maps.GoogleMap.OnMapClickListener; +import com.google.android.libraries.maps.GoogleMap.OnMapLongClickListener; +import com.google.android.libraries.maps.GoogleMap.OnMarkerClickListener; +import com.google.android.libraries.maps.GoogleMap.OnMarkerDragListener; +import com.google.android.libraries.maps.GoogleMap.OnMyLocationButtonClickListener; +import com.google.android.libraries.maps.GoogleMapOptions; +import com.google.android.libraries.maps.MapView; +import com.google.android.libraries.maps.OnMapReadyCallback; +import com.google.android.libraries.maps.Projection; +import com.google.android.libraries.maps.UiSettings; +import com.google.android.libraries.maps.model.CameraPosition; +import com.google.android.libraries.maps.model.CameraPosition.Builder; +import com.google.android.libraries.maps.model.Circle; +import com.google.android.libraries.maps.model.GroundOverlay; +import com.google.android.libraries.maps.model.IndoorBuilding; +import com.google.android.libraries.maps.model.LatLng; +import com.google.android.libraries.maps.model.LatLngBounds; +import com.google.android.libraries.maps.model.MapStyleOptions; +import com.google.android.libraries.maps.model.Marker; +import com.google.android.libraries.maps.model.MarkerOptions; +import com.google.android.libraries.maps.model.PointOfInterest; +import com.google.android.libraries.maps.model.Polygon; +import com.google.android.libraries.maps.model.Polyline; +import com.google.android.libraries.maps.model.PolylineOptions; +import com.google.android.libraries.maps.model.VisibleRegion; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginMarker.java b/src/android/plugin/google/maps/PluginMarker.java index cb9338f15..7c5238689 100644 --- a/src/android/plugin/google/maps/PluginMarker.java +++ b/src/android/plugin/google/maps/PluginMarker.java @@ -16,12 +16,12 @@ import android.view.animation.Interpolator; import android.view.animation.LinearInterpolator; -import com.google.android.gms.maps.Projection; -import com.google.android.gms.maps.model.BitmapDescriptor; -import com.google.android.gms.maps.model.BitmapDescriptorFactory; -import com.google.android.gms.maps.model.LatLng; -import com.google.android.gms.maps.model.Marker; -import com.google.android.gms.maps.model.MarkerOptions; +import com.google.android.libraries.maps.Projection; +import com.google.android.libraries.maps.model.BitmapDescriptor; +import com.google.android.libraries.maps.model.BitmapDescriptorFactory; +import com.google.android.libraries.maps.model.LatLng; +import com.google.android.libraries.maps.model.Marker; +import com.google.android.libraries.maps.model.MarkerOptions; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginMarkerCluster.java b/src/android/plugin/google/maps/PluginMarkerCluster.java index f9a220e9e..247738af7 100644 --- a/src/android/plugin/google/maps/PluginMarkerCluster.java +++ b/src/android/plugin/google/maps/PluginMarkerCluster.java @@ -4,10 +4,10 @@ import android.os.Bundle; import android.util.Log; -import com.google.android.gms.maps.model.LatLng; -import com.google.android.gms.maps.model.LatLngBounds; -import com.google.android.gms.maps.model.Marker; -import com.google.android.gms.maps.model.MarkerOptions; +import com.google.android.libraries.maps.model.LatLng; +import com.google.android.libraries.maps.model.LatLngBounds; +import com.google.android.libraries.maps.model.Marker; +import com.google.android.libraries.maps.model.MarkerOptions; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginPolygon.java b/src/android/plugin/google/maps/PluginPolygon.java index 231cd5884..0a6692581 100644 --- a/src/android/plugin/google/maps/PluginPolygon.java +++ b/src/android/plugin/google/maps/PluginPolygon.java @@ -1,9 +1,9 @@ package plugin.google.maps; -import com.google.android.gms.maps.model.LatLng; -import com.google.android.gms.maps.model.LatLngBounds; -import com.google.android.gms.maps.model.Polygon; -import com.google.android.gms.maps.model.PolygonOptions; +import com.google.android.libraries.maps.model.LatLng; +import com.google.android.libraries.maps.model.LatLngBounds; +import com.google.android.libraries.maps.model.Polygon; +import com.google.android.libraries.maps.model.PolygonOptions; import org.apache.cordova.CallbackContext; import org.json.JSONArray; diff --git a/src/android/plugin/google/maps/PluginPolyline.java b/src/android/plugin/google/maps/PluginPolyline.java index 95643eb8d..70ad049c0 100644 --- a/src/android/plugin/google/maps/PluginPolyline.java +++ b/src/android/plugin/google/maps/PluginPolyline.java @@ -3,12 +3,12 @@ import android.graphics.Color; import android.util.Log; -import com.google.android.gms.maps.model.CircleOptions; -import com.google.android.gms.maps.model.LatLng; -import com.google.android.gms.maps.model.LatLngBounds; -import com.google.android.gms.maps.model.MarkerOptions; -import com.google.android.gms.maps.model.Polyline; -import com.google.android.gms.maps.model.PolylineOptions; +import com.google.android.libraries.maps.model.CircleOptions; +import com.google.android.libraries.maps.model.LatLng; +import com.google.android.libraries.maps.model.LatLngBounds; +import com.google.android.libraries.maps.model.MarkerOptions; +import com.google.android.libraries.maps.model.Polyline; +import com.google.android.libraries.maps.model.PolylineOptions; import org.apache.cordova.CallbackContext; import org.json.JSONArray; diff --git a/src/android/plugin/google/maps/PluginStreetViewPanorama.java b/src/android/plugin/google/maps/PluginStreetViewPanorama.java index b85a51e47..0131069e3 100644 --- a/src/android/plugin/google/maps/PluginStreetViewPanorama.java +++ b/src/android/plugin/google/maps/PluginStreetViewPanorama.java @@ -5,16 +5,16 @@ import android.view.View; import android.view.ViewGroup; -import com.google.android.gms.maps.OnStreetViewPanoramaReadyCallback; -import com.google.android.gms.maps.StreetViewPanorama; -import com.google.android.gms.maps.StreetViewPanoramaOptions; -import com.google.android.gms.maps.StreetViewPanoramaView; -import com.google.android.gms.maps.model.LatLng; -import com.google.android.gms.maps.model.StreetViewPanoramaCamera; -import com.google.android.gms.maps.model.StreetViewPanoramaLink; -import com.google.android.gms.maps.model.StreetViewPanoramaLocation; -import com.google.android.gms.maps.model.StreetViewPanoramaOrientation; -import com.google.android.gms.maps.model.StreetViewSource; +import com.google.android.libraries.maps.OnStreetViewPanoramaReadyCallback; +import com.google.android.libraries.maps.StreetViewPanorama; +import com.google.android.libraries.maps.StreetViewPanoramaOptions; +import com.google.android.libraries.maps.StreetViewPanoramaView; +import com.google.android.libraries.maps.model.LatLng; +import com.google.android.libraries.maps.model.StreetViewPanoramaCamera; +import com.google.android.libraries.maps.model.StreetViewPanoramaLink; +import com.google.android.libraries.maps.model.StreetViewPanoramaLocation; +import com.google.android.libraries.maps.model.StreetViewPanoramaOrientation; +import com.google.android.libraries.maps.model.StreetViewSource; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginTileOverlay.java b/src/android/plugin/google/maps/PluginTileOverlay.java index 05ca806cb..0f934e2b4 100644 --- a/src/android/plugin/google/maps/PluginTileOverlay.java +++ b/src/android/plugin/google/maps/PluginTileOverlay.java @@ -4,8 +4,8 @@ import android.view.View; import android.webkit.WebView; -import com.google.android.gms.maps.model.TileOverlay; -import com.google.android.gms.maps.model.TileOverlayOptions; +import com.google.android.libraries.maps.model.TileOverlay; +import com.google.android.libraries.maps.model.TileOverlayOptions; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaPreferences; diff --git a/src/android/plugin/google/maps/PluginTileProvider.java b/src/android/plugin/google/maps/PluginTileProvider.java index 1bbb3b824..5073981e1 100644 --- a/src/android/plugin/google/maps/PluginTileProvider.java +++ b/src/android/plugin/google/maps/PluginTileProvider.java @@ -16,8 +16,8 @@ import android.text.TextPaint; import android.util.Log; -import com.google.android.gms.maps.model.Tile; -import com.google.android.gms.maps.model.TileProvider; +import com.google.android.libraries.maps.model.Tile; +import com.google.android.libraries.maps.model.TileProvider; import org.apache.cordova.CordovaWebView; diff --git a/src/android/plugin/google/maps/PluginUtil.java b/src/android/plugin/google/maps/PluginUtil.java index 634362820..7c7a1fee0 100644 --- a/src/android/plugin/google/maps/PluginUtil.java +++ b/src/android/plugin/google/maps/PluginUtil.java @@ -17,11 +17,11 @@ import android.os.Bundle; import android.util.Base64; -import com.google.android.gms.maps.model.IndoorBuilding; -import com.google.android.gms.maps.model.IndoorLevel; -import com.google.android.gms.maps.model.LatLng; -import com.google.android.gms.maps.model.LatLngBounds; -import com.google.android.gms.maps.model.LatLngBounds.Builder; +import com.google.android.libraries.maps.model.IndoorBuilding; +import com.google.android.libraries.maps.model.IndoorLevel; +import com.google.android.libraries.maps.model.LatLng; +import com.google.android.libraries.maps.model.LatLngBounds; +import com.google.android.libraries.maps.model.LatLngBounds.Builder; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaResourceApi; diff --git a/www/DirectionsRenderer.js b/www/DirectionsRenderer.js index ab4954bcd..129f01e8b 100644 --- a/www/DirectionsRenderer.js +++ b/www/DirectionsRenderer.js @@ -418,6 +418,32 @@ DirectionsRenderer.prototype.setRouteIndex = function(index) { self.set('routeIndex', index); }; +DirectionsRenderer.prototype.remove = function(callback) { + var self = this; + if (self._isRemoved) { + if (typeof callback === 'function') { + return; + } else { + return Promise.resolve(); + } + } + Object.defineProperty(self, '_isRemoved', { + value: true, + writable: false + }); + + + var resolver = function(resolve) { + self.polyline.remove().then(resolve); + }; + + if (typeof callback === 'function') { + resolver.call(self, callback, null); + return; + } else { + return Promise.resolve(); + } +}; DirectionsRenderer.prototype._redrawRoute = function(oldIdx, newIdx) { var self = this; var options = self.get('options'); From 76055d3df44fa1c35d9fa3abb8bec05d0714f646 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Fri, 29 May 2020 23:05:21 -0700 Subject: [PATCH 38/50] still working on --- src/android/frameworks/pgm-custom.gradle | 111 +++++++++++------- .../plugin/google/maps/BitmapCache.java | 4 +- .../plugin/google/maps/CordovaGoogleMaps.java | 3 +- src/android/plugin/google/maps/MyPlugin.java | 17 +-- .../plugin/google/maps/ObjectCache.java | 2 +- .../plugin/google/maps/PluginCircle.java | 8 +- .../google/maps/PluginDirectionsService.java | 2 +- .../google/maps/PluginElevationService.java | 2 +- .../plugin/google/maps/PluginEnvironment.java | 2 +- .../plugin/google/maps/PluginGeocoder.java | 2 +- .../google/maps/PluginGroundOverlay.java | 10 +- .../google/maps/PluginLocationService.java | 6 +- src/android/plugin/google/maps/PluginMap.java | 67 ++++++----- .../plugin/google/maps/PluginMarker.java | 12 +- .../google/maps/PluginMarkerCluster.java | 8 +- .../plugin/google/maps/PluginPolygon.java | 8 +- .../plugin/google/maps/PluginPolyline.java | 12 +- .../google/maps/PluginStreetViewPanorama.java | 21 ++-- .../plugin/google/maps/PluginTileOverlay.java | 4 +- .../google/maps/PluginTileProvider.java | 4 +- .../plugin/google/maps/PluginUtil.java | 10 +- 21 files changed, 166 insertions(+), 149 deletions(-) diff --git a/src/android/frameworks/pgm-custom.gradle b/src/android/frameworks/pgm-custom.gradle index e6209178d..a0683c9b4 100644 --- a/src/android/frameworks/pgm-custom.gradle +++ b/src/android/frameworks/pgm-custom.gradle @@ -12,12 +12,8 @@ def searchFileInParents(target) { return null; } -ext { - android { - useAndroidX=true - enableJetifier=true - } -} + + android { // #1. Find (project)/config.xml file, @@ -46,12 +42,15 @@ android { Properties props = new Properties() def isKeyFound = 0 + props.setProperty("ANDROIDX_CORE_VERSION", "1.3.0"); props.setProperty("GOOGLE_MAPS_ANDROID_SDK", "maps-sdk-3.0.0-beta"); props.setProperty("APP_COMPAT_VERSION", "1.1.0"); props.setProperty("PLAY_SERVICES_BASEMENT_VERSION", "17.2.1"); props.setProperty("PLAY_SERVICES_BASE_VERSION", "17.2.1"); props.setProperty("PLAY_SERVICES_GCM_VERSION", "17.0.0"); props.setProperty("PLAY_SERVICES_LOCATION_VERSION", "17.0.0"); + props.setProperty("ANDROID_SUPPORT_V4_VERSION", "27.1.1"); + props.setProperty("GOOGLE_MAPS_PLAY_SERVICES_VERSION", "17.0.0"); widget.preference.each { pref -> @@ -62,12 +61,14 @@ android { isKeyFound = 1 props.setProperty(name, value) } - if (name == "GOOGLE_MAPS_ANDROID_SDK" || + if (name == "ANDROIDX_CORE_VERSION" || + name == "GOOGLE_MAPS_ANDROID_SDK" || name == "APP_COMPAT_VERSION" || name == "PLAY_SERVICES_BASEMENT_VERSION" || name == "PLAY_SERVICES_BASE_VERSION" || name == "PLAY_SERVICES_GCM_VERSION" || - name == "PLAY_SERVICES_LOCATION_VERSION") { + name == "PLAY_SERVICES_LOCATION_VERSION"|| + name == "GOOGLE_MAPS_PLAY_SERVICES_VERSION") { props.setProperty(name, value) } } @@ -77,45 +78,65 @@ android { throw new GradleException("Please add '' to the config.xml file.") } - //---------- - // maps SDK - //---------- - def libsDirPath = System.getProperty("user.dir") - def libsDir = new File("${libsDirPath}/libs/") - if (!libsDir.exists()) { - libsDir.mkdirs() - } + def hasUseAndroidX = project.ext.has('android.useAndroidX') + def useAndroidX = hasUseAndroidX && 'true' == project.ext.get('android.useAndroidX') + + if (useAndroidX) { + //---------- + // maps SDK + //---------- + def libsDirPath = System.getProperty("user.dir") + def libsDir = new File("${libsDirPath}/libs/") + if (!libsDir.exists()) { + libsDir.mkdirs() + } - def mapsSDK = props.getProperty("GOOGLE_MAPS_ANDROID_SDK") - def f = new File("${libsDir.absolutePath}/${mapsSDK}.aar") - println("---->GOOGLE_MAPS_ANDROID_SDK = " + f.absolutePath); - if (!f.exists()) { - new URL("https://dl.google.com/dl/geosdk/${mapsSDK}.aar").withInputStream{ i -> f.withOutputStream{ it << i }} - } - dependencies { - implementation name: mapsSDK, ext:'aar' - } + def mapsSDK = props.getProperty("GOOGLE_MAPS_ANDROID_SDK") + def f = new File("${libsDir.absolutePath}/${mapsSDK}.aar") + println("---->GOOGLE_MAPS_ANDROID_SDK = " + f.absolutePath); + if (!f.exists()) { + new URL("https://dl.google.com/dl/geosdk/${mapsSDK}.aar").withInputStream { i -> + f.withOutputStream { + it << i + } + } + } + dependencies { + implementation name: mapsSDK, ext: 'aar' + } - //------------- - // dependencies - //------------- - def APP_COMPAT_VERSION = props.getProperty("APP_COMPAT_VERSION") - def PLAY_SERVICES_BASEMENT_VERSION = props.getProperty("PLAY_SERVICES_BASEMENT_VERSION") - def PLAY_SERVICES_BASE_VERSION = props.getProperty("PLAY_SERVICES_BASE_VERSION") - def PLAY_SERVICES_GCM_VERSION = props.getProperty("PLAY_SERVICES_GCM_VERSION") - def PLAY_SERVICES_LOCATION_VERSION = props.getProperty("PLAY_SERVICES_LOCATION_VERSION") - - println("---->APP_COMPAT_VERSION = ${APP_COMPAT_VERSION}") - println("---->PLAY_SERVICES_BASEMENT_VERSION = ${PLAY_SERVICES_BASEMENT_VERSION}") - println("---->PLAY_SERVICES_BASE_VERSION = ${PLAY_SERVICES_BASE_VERSION}") - println("---->PLAY_SERVICES_GCM_VERSION = ${PLAY_SERVICES_GCM_VERSION}") - println("---->PLAY_SERVICES_LOCATION_VERSION = ${PLAY_SERVICES_LOCATION_VERSION}") - dependencies { - implementation "androidx.appcompat:appcompat:${APP_COMPAT_VERSION}" - implementation "com.google.android.gms:play-services-basement:${PLAY_SERVICES_BASEMENT_VERSION}" - implementation "com.google.android.gms:play-services-base:${PLAY_SERVICES_BASE_VERSION}" - implementation "com.google.android.gms:play-services-gcm:${PLAY_SERVICES_GCM_VERSION}" - implementation "com.google.android.gms:play-services-location:${PLAY_SERVICES_LOCATION_VERSION}" + //------------- + // dependencies + //------------- + def ANDROIDX_CORE_VERSION = props.getProperty("ANDROIDX_CORE_VERSION") + def APP_COMPAT_VERSION = props.getProperty("APP_COMPAT_VERSION") + def PLAY_SERVICES_BASEMENT_VERSION = props.getProperty("PLAY_SERVICES_BASEMENT_VERSION") + def PLAY_SERVICES_BASE_VERSION = props.getProperty("PLAY_SERVICES_BASE_VERSION") + def PLAY_SERVICES_GCM_VERSION = props.getProperty("PLAY_SERVICES_GCM_VERSION") + def PLAY_SERVICES_LOCATION_VERSION = props.getProperty("PLAY_SERVICES_LOCATION_VERSION") + + println("---->ANDROIDX_CORE_VERSION = ${ANDROIDX_CORE_VERSION}") + println("---->APP_COMPAT_VERSION = ${APP_COMPAT_VERSION}") + println("---->PLAY_SERVICES_BASEMENT_VERSION = ${PLAY_SERVICES_BASEMENT_VERSION}") + println("---->PLAY_SERVICES_BASE_VERSION = ${PLAY_SERVICES_BASE_VERSION}") + println("---->PLAY_SERVICES_GCM_VERSION = ${PLAY_SERVICES_GCM_VERSION}") + println("---->PLAY_SERVICES_LOCATION_VERSION = ${PLAY_SERVICES_LOCATION_VERSION}") + dependencies { + implementation "androidx.appcompat:appcompat:${APP_COMPAT_VERSION}" + implementation "com.google.android.gms:play-services-basement:${PLAY_SERVICES_BASEMENT_VERSION}" + implementation "com.google.android.gms:play-services-base:${PLAY_SERVICES_BASE_VERSION}" + implementation "com.google.android.gms:play-services-gcm:${PLAY_SERVICES_GCM_VERSION}" + implementation "com.google.android.gms:play-services-location:${PLAY_SERVICES_LOCATION_VERSION}" + } + } else { + def GOOGLE_MAPS_PLAY_SERVICES_VERSION = props.getProperty("GOOGLE_MAPS_PLAY_SERVICES_VERSION") + def PLAY_SERVICES_LOCATION_VERSION = props.getProperty("PLAY_SERVICES_LOCATION_VERSION") + def ANDROID_SUPPORT_V4_VERSION = props.getProperty("ANDROID_SUPPORT_V4_VERSION") + dependencies { + implementation "com.google.android.gms:play-services-maps:${GOOGLE_MAPS_PLAY_SERVICES_VERSION}" + implementation "com.google.android.gms:play-services-location:${GOOGLE_MAPS_PLAY_SERVICES_VERSION}" + implementation "com.android.support:support-core-utils:${ANDROID_SUPPORT_V4_VERSION}" + } } diff --git a/src/android/plugin/google/maps/BitmapCache.java b/src/android/plugin/google/maps/BitmapCache.java index 1ee9365a4..b78d2b791 100644 --- a/src/android/plugin/google/maps/BitmapCache.java +++ b/src/android/plugin/google/maps/BitmapCache.java @@ -1,7 +1,7 @@ package plugin.google.maps; import android.graphics.Bitmap; -import androidx.collection.LruCache; +import android.support.v4.util.LruCache; public class BitmapCache extends LruCache { @@ -23,4 +23,4 @@ protected void entryRemoved(boolean evicted, String key, Bitmap oldBitmap, Bitma oldBitmap = null; } } -} \ No newline at end of file +} diff --git a/src/android/plugin/google/maps/CordovaGoogleMaps.java b/src/android/plugin/google/maps/CordovaGoogleMaps.java index f120e490c..5e575b793 100644 --- a/src/android/plugin/google/maps/CordovaGoogleMaps.java +++ b/src/android/plugin/google/maps/CordovaGoogleMaps.java @@ -24,7 +24,7 @@ import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; -import com.google.android.libraries.maps.MapsInitializer; +import com.google.android.gms.maps.MapsInitializer; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; @@ -43,7 +43,6 @@ import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Set; - @SuppressWarnings("deprecation") public class CordovaGoogleMaps extends CordovaPlugin implements ViewTreeObserver.OnScrollChangedListener{ private final String TAG = "GoogleMapsPlugin"; diff --git a/src/android/plugin/google/maps/MyPlugin.java b/src/android/plugin/google/maps/MyPlugin.java index 1b3cf41b0..348de063a 100644 --- a/src/android/plugin/google/maps/MyPlugin.java +++ b/src/android/plugin/google/maps/MyPlugin.java @@ -4,14 +4,14 @@ import android.content.res.Resources; import android.util.Log; -import com.google.android.libraries.maps.GoogleMap; -import com.google.android.libraries.maps.model.Circle; -import com.google.android.libraries.maps.model.GroundOverlay; -import com.google.android.libraries.maps.model.LatLng; -import com.google.android.libraries.maps.model.Marker; -import com.google.android.libraries.maps.model.Polygon; -import com.google.android.libraries.maps.model.Polyline; -import com.google.android.libraries.maps.model.TileOverlay; +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.model.Circle; +import com.google.android.gms.maps.model.GroundOverlay; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.Marker; +import com.google.android.gms.maps.model.Polygon; +import com.google.android.gms.maps.model.Polyline; +import com.google.android.gms.maps.model.TileOverlay; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; @@ -28,6 +28,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; + public class MyPlugin extends CordovaPlugin implements MyPluginInterface { public MyPlugin self = null; public final Map methods = new ConcurrentHashMap(); diff --git a/src/android/plugin/google/maps/ObjectCache.java b/src/android/plugin/google/maps/ObjectCache.java index 32a407f9f..a520cdd99 100644 --- a/src/android/plugin/google/maps/ObjectCache.java +++ b/src/android/plugin/google/maps/ObjectCache.java @@ -1,6 +1,6 @@ package plugin.google.maps; -import androidx.collection.LruCache; +import android.support.v4.util.LruCache; import java.util.HashSet; diff --git a/src/android/plugin/google/maps/PluginCircle.java b/src/android/plugin/google/maps/PluginCircle.java index 8e51a58a8..58b888a78 100644 --- a/src/android/plugin/google/maps/PluginCircle.java +++ b/src/android/plugin/google/maps/PluginCircle.java @@ -1,9 +1,9 @@ package plugin.google.maps; -import com.google.android.libraries.maps.model.Circle; -import com.google.android.libraries.maps.model.CircleOptions; -import com.google.android.libraries.maps.model.LatLng; -import com.google.android.libraries.maps.model.LatLngBounds; +import com.google.android.gms.maps.model.Circle; +import com.google.android.gms.maps.model.CircleOptions; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLngBounds; import org.apache.cordova.CallbackContext; import org.json.JSONArray; diff --git a/src/android/plugin/google/maps/PluginDirectionsService.java b/src/android/plugin/google/maps/PluginDirectionsService.java index f84c2985a..4b98f30bc 100644 --- a/src/android/plugin/google/maps/PluginDirectionsService.java +++ b/src/android/plugin/google/maps/PluginDirectionsService.java @@ -5,7 +5,7 @@ import android.content.pm.PackageManager; import android.util.Log; -import com.google.android.libraries.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLng; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginElevationService.java b/src/android/plugin/google/maps/PluginElevationService.java index 9c1afceb6..b2c679ff9 100644 --- a/src/android/plugin/google/maps/PluginElevationService.java +++ b/src/android/plugin/google/maps/PluginElevationService.java @@ -5,7 +5,7 @@ import android.content.pm.PackageManager; import android.util.Log; -import com.google.android.libraries.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLng; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginEnvironment.java b/src/android/plugin/google/maps/PluginEnvironment.java index 02a1fb724..1867c1952 100644 --- a/src/android/plugin/google/maps/PluginEnvironment.java +++ b/src/android/plugin/google/maps/PluginEnvironment.java @@ -78,7 +78,7 @@ public void isAvailable(final JSONArray args, final CallbackContext callbackCont // ------------------------------ try { @SuppressWarnings({ "rawtypes" }) - Class GoogleMapsClass = Class.forName("com.google.android.libraries.maps.GoogleMap"); + Class GoogleMapsClass = Class.forName("com.google.android.gms.maps.model.GoogleMap"); } catch (Exception e) { Log.e("GoogleMaps", "Error", e); callbackContext.error(e.getMessage()); diff --git a/src/android/plugin/google/maps/PluginGeocoder.java b/src/android/plugin/google/maps/PluginGeocoder.java index 1024cf72c..c2cda4687 100644 --- a/src/android/plugin/google/maps/PluginGeocoder.java +++ b/src/android/plugin/google/maps/PluginGeocoder.java @@ -4,7 +4,7 @@ import android.location.Geocoder; import android.os.Bundle; -import com.google.android.libraries.maps.model.LatLngBounds; +import com.google.android.gms.maps.model.LatLngBounds; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginGroundOverlay.java b/src/android/plugin/google/maps/PluginGroundOverlay.java index ae2166dc4..229bf5694 100644 --- a/src/android/plugin/google/maps/PluginGroundOverlay.java +++ b/src/android/plugin/google/maps/PluginGroundOverlay.java @@ -3,11 +3,11 @@ import android.graphics.Bitmap; import android.os.AsyncTask; -import com.google.android.libraries.maps.model.BitmapDescriptor; -import com.google.android.libraries.maps.model.BitmapDescriptorFactory; -import com.google.android.libraries.maps.model.GroundOverlay; -import com.google.android.libraries.maps.model.GroundOverlayOptions; -import com.google.android.libraries.maps.model.LatLngBounds; +import com.google.android.gms.maps.model.BitmapDescriptor; +import com.google.android.gms.maps.model.BitmapDescriptorFactory; +import com.google.android.gms.maps.model.GroundOverlay; +import com.google.android.gms.maps.model.GroundOverlayOptions; +import com.google.android.gms.maps.model.LatLngBounds; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginLocationService.java b/src/android/plugin/google/maps/PluginLocationService.java index 16887af67..9976e5ddd 100644 --- a/src/android/plugin/google/maps/PluginLocationService.java +++ b/src/android/plugin/google/maps/PluginLocationService.java @@ -9,11 +9,10 @@ import android.os.Build; import android.os.Bundle; import android.os.Looper; +import android.support.annotation.NonNull; +import android.support.v4.content.PermissionChecker; import android.util.Log; -import androidx.annotation.NonNull; -import androidx.core.content.PermissionChecker; - import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.location.LocationCallback; @@ -37,7 +36,6 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; - public class PluginLocationService extends CordovaPlugin { private Activity activity; private final String TAG = "PluginLocationService"; diff --git a/src/android/plugin/google/maps/PluginMap.java b/src/android/plugin/google/maps/PluginMap.java index fe6858cb1..ceb25e7fa 100644 --- a/src/android/plugin/google/maps/PluginMap.java +++ b/src/android/plugin/google/maps/PluginMap.java @@ -16,8 +16,8 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; -import androidx.annotation.NonNull; -import androidx.core.content.PermissionChecker; +import android.support.annotation.NonNull; +import android.support.v4.content.PermissionChecker; import android.util.Base64; import android.util.Log; import android.view.Gravity; @@ -28,37 +28,37 @@ import android.widget.LinearLayout; import android.widget.TextView; -import com.google.android.libraries.maps.CameraUpdate; -import com.google.android.libraries.maps.CameraUpdateFactory; -import com.google.android.libraries.maps.GoogleMap; -import com.google.android.libraries.maps.GoogleMap.InfoWindowAdapter; -import com.google.android.libraries.maps.GoogleMap.OnIndoorStateChangeListener; -import com.google.android.libraries.maps.GoogleMap.OnInfoWindowClickListener; -import com.google.android.libraries.maps.GoogleMap.OnMapClickListener; -import com.google.android.libraries.maps.GoogleMap.OnMapLongClickListener; -import com.google.android.libraries.maps.GoogleMap.OnMarkerClickListener; -import com.google.android.libraries.maps.GoogleMap.OnMarkerDragListener; -import com.google.android.libraries.maps.GoogleMap.OnMyLocationButtonClickListener; -import com.google.android.libraries.maps.GoogleMapOptions; -import com.google.android.libraries.maps.MapView; -import com.google.android.libraries.maps.OnMapReadyCallback; -import com.google.android.libraries.maps.Projection; -import com.google.android.libraries.maps.UiSettings; -import com.google.android.libraries.maps.model.CameraPosition; -import com.google.android.libraries.maps.model.CameraPosition.Builder; -import com.google.android.libraries.maps.model.Circle; -import com.google.android.libraries.maps.model.GroundOverlay; -import com.google.android.libraries.maps.model.IndoorBuilding; -import com.google.android.libraries.maps.model.LatLng; -import com.google.android.libraries.maps.model.LatLngBounds; -import com.google.android.libraries.maps.model.MapStyleOptions; -import com.google.android.libraries.maps.model.Marker; -import com.google.android.libraries.maps.model.MarkerOptions; -import com.google.android.libraries.maps.model.PointOfInterest; -import com.google.android.libraries.maps.model.Polygon; -import com.google.android.libraries.maps.model.Polyline; -import com.google.android.libraries.maps.model.PolylineOptions; -import com.google.android.libraries.maps.model.VisibleRegion; +import com.google.android.gms.maps.CameraUpdate; +import com.google.android.gms.maps.CameraUpdateFactory; +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.GoogleMap.InfoWindowAdapter; +import com.google.android.gms.maps.GoogleMap.OnIndoorStateChangeListener; +import com.google.android.gms.maps.GoogleMap.OnInfoWindowClickListener; +import com.google.android.gms.maps.GoogleMap.OnMapClickListener; +import com.google.android.gms.maps.GoogleMap.OnMapLongClickListener; +import com.google.android.gms.maps.GoogleMap.OnMarkerClickListener; +import com.google.android.gms.maps.GoogleMap.OnMarkerDragListener; +import com.google.android.gms.maps.GoogleMap.OnMyLocationButtonClickListener; +import com.google.android.gms.maps.GoogleMapOptions; +import com.google.android.gms.maps.MapView; +import com.google.android.gms.maps.OnMapReadyCallback; +import com.google.android.gms.maps.Projection; +import com.google.android.gms.maps.UiSettings; +import com.google.android.gms.maps.model.CameraPosition; +import com.google.android.gms.maps.model.CameraPosition.Builder; +import com.google.android.gms.maps.model.Circle; +import com.google.android.gms.maps.model.GroundOverlay; +import com.google.android.gms.maps.model.IndoorBuilding; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLngBounds; +import com.google.android.gms.maps.model.MapStyleOptions; +import com.google.android.gms.maps.model.Marker; +import com.google.android.gms.maps.model.MarkerOptions; +import com.google.android.gms.maps.model.PointOfInterest; +import com.google.android.gms.maps.model.Polygon; +import com.google.android.gms.maps.model.Polyline; +import com.google.android.gms.maps.model.PolylineOptions; +import com.google.android.gms.maps.model.VisibleRegion; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; @@ -81,7 +81,6 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; - public class PluginMap extends MyPlugin implements OnMarkerClickListener, OnInfoWindowClickListener, OnMapClickListener, OnMapLongClickListener, OnMarkerDragListener, GoogleMap.OnMapLoadedCallback, diff --git a/src/android/plugin/google/maps/PluginMarker.java b/src/android/plugin/google/maps/PluginMarker.java index 7c5238689..cb9338f15 100644 --- a/src/android/plugin/google/maps/PluginMarker.java +++ b/src/android/plugin/google/maps/PluginMarker.java @@ -16,12 +16,12 @@ import android.view.animation.Interpolator; import android.view.animation.LinearInterpolator; -import com.google.android.libraries.maps.Projection; -import com.google.android.libraries.maps.model.BitmapDescriptor; -import com.google.android.libraries.maps.model.BitmapDescriptorFactory; -import com.google.android.libraries.maps.model.LatLng; -import com.google.android.libraries.maps.model.Marker; -import com.google.android.libraries.maps.model.MarkerOptions; +import com.google.android.gms.maps.Projection; +import com.google.android.gms.maps.model.BitmapDescriptor; +import com.google.android.gms.maps.model.BitmapDescriptorFactory; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.Marker; +import com.google.android.gms.maps.model.MarkerOptions; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginMarkerCluster.java b/src/android/plugin/google/maps/PluginMarkerCluster.java index 247738af7..f9a220e9e 100644 --- a/src/android/plugin/google/maps/PluginMarkerCluster.java +++ b/src/android/plugin/google/maps/PluginMarkerCluster.java @@ -4,10 +4,10 @@ import android.os.Bundle; import android.util.Log; -import com.google.android.libraries.maps.model.LatLng; -import com.google.android.libraries.maps.model.LatLngBounds; -import com.google.android.libraries.maps.model.Marker; -import com.google.android.libraries.maps.model.MarkerOptions; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLngBounds; +import com.google.android.gms.maps.model.Marker; +import com.google.android.gms.maps.model.MarkerOptions; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; diff --git a/src/android/plugin/google/maps/PluginPolygon.java b/src/android/plugin/google/maps/PluginPolygon.java index 0a6692581..231cd5884 100644 --- a/src/android/plugin/google/maps/PluginPolygon.java +++ b/src/android/plugin/google/maps/PluginPolygon.java @@ -1,9 +1,9 @@ package plugin.google.maps; -import com.google.android.libraries.maps.model.LatLng; -import com.google.android.libraries.maps.model.LatLngBounds; -import com.google.android.libraries.maps.model.Polygon; -import com.google.android.libraries.maps.model.PolygonOptions; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLngBounds; +import com.google.android.gms.maps.model.Polygon; +import com.google.android.gms.maps.model.PolygonOptions; import org.apache.cordova.CallbackContext; import org.json.JSONArray; diff --git a/src/android/plugin/google/maps/PluginPolyline.java b/src/android/plugin/google/maps/PluginPolyline.java index 70ad049c0..95643eb8d 100644 --- a/src/android/plugin/google/maps/PluginPolyline.java +++ b/src/android/plugin/google/maps/PluginPolyline.java @@ -3,12 +3,12 @@ import android.graphics.Color; import android.util.Log; -import com.google.android.libraries.maps.model.CircleOptions; -import com.google.android.libraries.maps.model.LatLng; -import com.google.android.libraries.maps.model.LatLngBounds; -import com.google.android.libraries.maps.model.MarkerOptions; -import com.google.android.libraries.maps.model.Polyline; -import com.google.android.libraries.maps.model.PolylineOptions; +import com.google.android.gms.maps.model.CircleOptions; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLngBounds; +import com.google.android.gms.maps.model.MarkerOptions; +import com.google.android.gms.maps.model.Polyline; +import com.google.android.gms.maps.model.PolylineOptions; import org.apache.cordova.CallbackContext; import org.json.JSONArray; diff --git a/src/android/plugin/google/maps/PluginStreetViewPanorama.java b/src/android/plugin/google/maps/PluginStreetViewPanorama.java index 0131069e3..f14d7cb10 100644 --- a/src/android/plugin/google/maps/PluginStreetViewPanorama.java +++ b/src/android/plugin/google/maps/PluginStreetViewPanorama.java @@ -5,16 +5,16 @@ import android.view.View; import android.view.ViewGroup; -import com.google.android.libraries.maps.OnStreetViewPanoramaReadyCallback; -import com.google.android.libraries.maps.StreetViewPanorama; -import com.google.android.libraries.maps.StreetViewPanoramaOptions; -import com.google.android.libraries.maps.StreetViewPanoramaView; -import com.google.android.libraries.maps.model.LatLng; -import com.google.android.libraries.maps.model.StreetViewPanoramaCamera; -import com.google.android.libraries.maps.model.StreetViewPanoramaLink; -import com.google.android.libraries.maps.model.StreetViewPanoramaLocation; -import com.google.android.libraries.maps.model.StreetViewPanoramaOrientation; -import com.google.android.libraries.maps.model.StreetViewSource; +import com.google.android.gms.maps.OnStreetViewPanoramaReadyCallback; +import com.google.android.gms.maps.StreetViewPanorama; +import com.google.android.gms.maps.StreetViewPanoramaOptions; +import com.google.android.gms.maps.StreetViewPanoramaView; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.StreetViewPanoramaCamera; +import com.google.android.gms.maps.model.StreetViewPanoramaLink; +import com.google.android.gms.maps.model.StreetViewPanoramaLocation; +import com.google.android.gms.maps.model.StreetViewPanoramaOrientation; +import com.google.android.gms.maps.model.StreetViewSource; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaInterface; @@ -25,7 +25,6 @@ import java.util.Locale; - public class PluginStreetViewPanorama extends MyPlugin implements IPluginView, StreetViewPanorama.OnStreetViewPanoramaCameraChangeListener, StreetViewPanorama.OnStreetViewPanoramaChangeListener, diff --git a/src/android/plugin/google/maps/PluginTileOverlay.java b/src/android/plugin/google/maps/PluginTileOverlay.java index 0f934e2b4..05ca806cb 100644 --- a/src/android/plugin/google/maps/PluginTileOverlay.java +++ b/src/android/plugin/google/maps/PluginTileOverlay.java @@ -4,8 +4,8 @@ import android.view.View; import android.webkit.WebView; -import com.google.android.libraries.maps.model.TileOverlay; -import com.google.android.libraries.maps.model.TileOverlayOptions; +import com.google.android.gms.maps.model.TileOverlay; +import com.google.android.gms.maps.model.TileOverlayOptions; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaPreferences; diff --git a/src/android/plugin/google/maps/PluginTileProvider.java b/src/android/plugin/google/maps/PluginTileProvider.java index 5073981e1..1bbb3b824 100644 --- a/src/android/plugin/google/maps/PluginTileProvider.java +++ b/src/android/plugin/google/maps/PluginTileProvider.java @@ -16,8 +16,8 @@ import android.text.TextPaint; import android.util.Log; -import com.google.android.libraries.maps.model.Tile; -import com.google.android.libraries.maps.model.TileProvider; +import com.google.android.gms.maps.model.Tile; +import com.google.android.gms.maps.model.TileProvider; import org.apache.cordova.CordovaWebView; diff --git a/src/android/plugin/google/maps/PluginUtil.java b/src/android/plugin/google/maps/PluginUtil.java index 7c7a1fee0..634362820 100644 --- a/src/android/plugin/google/maps/PluginUtil.java +++ b/src/android/plugin/google/maps/PluginUtil.java @@ -17,11 +17,11 @@ import android.os.Bundle; import android.util.Base64; -import com.google.android.libraries.maps.model.IndoorBuilding; -import com.google.android.libraries.maps.model.IndoorLevel; -import com.google.android.libraries.maps.model.LatLng; -import com.google.android.libraries.maps.model.LatLngBounds; -import com.google.android.libraries.maps.model.LatLngBounds.Builder; +import com.google.android.gms.maps.model.IndoorBuilding; +import com.google.android.gms.maps.model.IndoorLevel; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.LatLngBounds; +import com.google.android.gms.maps.model.LatLngBounds.Builder; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaResourceApi; From c4df91bd1a023da12cdf7f39fe5b847ea1b24990 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Fri, 29 May 2020 23:55:13 -0700 Subject: [PATCH 39/50] Automatic switch dependencies for androidx --- README.md | 7 +- src/android/frameworks/pgm-custom.gradle | 2237 ++++++++++++++++- .../plugin/google/maps/CordovaGoogleMaps.java | 183 +- .../plugin/google/maps/PluginEnvironment.java | 11 - 4 files changed, 2296 insertions(+), 142 deletions(-) diff --git a/README.md b/README.md index 57f93d48a..a739068d8 100644 --- a/README.md +++ b/README.md @@ -112,8 +112,11 @@ For browser platform, ## Release Notes - **v2.8.0** - - Important Change: (Android) This plugin uses [Maps SDK for Android v.3.0.0 BETA](https://developers.google.com/maps/documentation/android-sdk/v3-client-migration). **No longer use `com.google.android.gms:play-services-maps` library.** - Because of this, this plugin uses `Androidx`. + - Important Change: (Android) + If `android.useAndroidX=true` and `android.enableJetifier=true` are defined in `gradle.properties`, + this plugin uses [Maps SDK for Android v.3.0.0 BETA](https://developers.google.com/maps/documentation/android-sdk/v3-client-migration). + If no definition, this plugin uses `com.google.android.gms:play-services-maps` + - Add: (Android/iOS/Browser) `mapOptions.preferences.restriction` which is able to set the camera bounds. - Add: (Android/iOS/Browser) `mapOptions.preferences.clickableIcons` which is able to be disable clicking on POI icons. - Bug fix: (Android/iOS/Browser) `mapOptions.preferences.building` does not work. diff --git a/src/android/frameworks/pgm-custom.gradle b/src/android/frameworks/pgm-custom.gradle index a0683c9b4..7c98161ef 100644 --- a/src/android/frameworks/pgm-custom.gradle +++ b/src/android/frameworks/pgm-custom.gradle @@ -1,3 +1,2075 @@ +def getConvertListe(useAndroidX) { + def list = [ + ["android.arch.core.executor.AppToolkitTaskExecutor", "androidx.arch.core.executor.AppToolkitTaskExecutor"], + ["android.arch.core.executor.ArchTaskExecutor", "androidx.arch.core.executor.ArchTaskExecutor"], + ["android.arch.core.executor.DefaultTaskExecutor", "androidx.arch.core.executor.DefaultTaskExecutor"], + ["android.arch.core.executor.JunitTaskExecutorRule", "androidx.arch.core.executor.JunitTaskExecutorRule"], + ["android.arch.core.executor.TaskExecutor", "androidx.arch.core.executor.TaskExecutor"], + ["android.arch.core.executor.TaskExecutorWithFakeMainThread", "androidx.arch.core.executor.TaskExecutorWithFakeMainThread"], + ["android.arch.core.executor.testing.CountingTaskExecutorRule", "androidx.arch.core.executor.testing.CountingTaskExecutorRule"], + ["android.arch.core.executor.testing.InstantTaskExecutorRule", "androidx.arch.core.executor.testing.InstantTaskExecutorRule"], + ["android.arch.core.internal.FastSafeIterableMap", "androidx.arch.core.internal.FastSafeIterableMap"], + ["android.arch.core.internal.SafeIterableMap", "androidx.arch.core.internal.SafeIterableMap"], + ["android.arch.core.util.Function", "androidx.arch.core.util.Function"], + ["android.arch.lifecycle.AndroidViewModel", "androidx.lifecycle.AndroidViewModel"], + ["android.arch.lifecycle.ClassesInfoCache", "androidx.lifecycle.ClassesInfoCache"], + ["android.arch.lifecycle.CompositeGeneratedAdaptersObserver", "androidx.lifecycle.CompositeGeneratedAdaptersObserver"], + ["android.arch.lifecycle.ComputableLiveData", "androidx.lifecycle.ComputableLiveData"], + ["android.arch.lifecycle.DefaultLifecycleObserver", "androidx.lifecycle.DefaultLifecycleObserver"], + ["android.arch.lifecycle.Elements_extKt", "androidx.lifecycle.Elements_extKt"], + ["android.arch.lifecycle.EmptyActivityLifecycleCallbacks", "androidx.lifecycle.EmptyActivityLifecycleCallbacks"], + ["android.arch.lifecycle.ErrorMessages", "androidx.lifecycle.ErrorMessages"], + ["android.arch.lifecycle.FullLifecycleObserver", "androidx.lifecycle.FullLifecycleObserver"], + ["android.arch.lifecycle.FullLifecycleObserverAdapter", "androidx.lifecycle.FullLifecycleObserverAdapter"], + ["android.arch.lifecycle.GeneratedAdapter", "androidx.lifecycle.GeneratedAdapter"], + ["android.arch.lifecycle.GenericLifecycleObserver", "androidx.lifecycle.GenericLifecycleObserver"], + ["android.arch.lifecycle.HolderFragment", "androidx.lifecycle.HolderFragment"], + ["android.arch.lifecycle.Input_collectorKt", "androidx.lifecycle.Input_collectorKt"], + ["android.arch.lifecycle.Lifecycle", "androidx.lifecycle.Lifecycle"], + ["android.arch.lifecycle.LifecycleDispatcher", "androidx.lifecycle.LifecycleDispatcher"], + ["android.arch.lifecycle.LifecycleObserver", "androidx.lifecycle.LifecycleObserver"], + ["android.arch.lifecycle.LifecycleOwner", "androidx.lifecycle.LifecycleOwner"], + ["android.arch.lifecycle.LifecycleProcessor", "androidx.lifecycle.LifecycleProcessor"], + ["android.arch.lifecycle.LifecycleRegistry", "androidx.lifecycle.LifecycleRegistry"], + ["android.arch.lifecycle.LifecycleRegistryOwner", "androidx.lifecycle.LifecycleRegistryOwner"], + ["android.arch.lifecycle.LifecycleService", "androidx.lifecycle.LifecycleService"], + ["android.arch.lifecycle.Lifecycling", "androidx.lifecycle.Lifecycling"], + ["android.arch.lifecycle.LiveData", "androidx.lifecycle.LiveData"], + ["android.arch.lifecycle.LiveDataReactiveStreams", "androidx.lifecycle.LiveDataReactiveStreams"], + ["android.arch.lifecycle.MediatorLiveData", "androidx.lifecycle.MediatorLiveData"], + ["android.arch.lifecycle.MethodCallsLogger", "androidx.lifecycle.MethodCallsLogger"], + ["android.arch.lifecycle.model.AdapterClass", "androidx.lifecycle.model.AdapterClass"], + ["android.arch.lifecycle.model.AdapterClassKt", "androidx.lifecycle.model.AdapterClassKt"], + ["android.arch.lifecycle.model.EventMethod", "androidx.lifecycle.model.EventMethod"], + ["android.arch.lifecycle.model.EventMethodCall", "androidx.lifecycle.model.EventMethodCall"], + ["android.arch.lifecycle.model.InputModel", "androidx.lifecycle.model.InputModel"], + ["android.arch.lifecycle.model.LifecycleObserverInfo", "androidx.lifecycle.model.LifecycleObserverInfo"], + ["android.arch.lifecycle.MutableLiveData", "androidx.lifecycle.MutableLiveData"], + ["android.arch.lifecycle.Observer", "androidx.lifecycle.Observer"], + ["android.arch.lifecycle.ObserversCollector", "androidx.lifecycle.ObserversCollector"], + ["android.arch.lifecycle.OnLifecycleEvent", "androidx.lifecycle.OnLifecycleEvent"], + ["android.arch.lifecycle.ProcessLifecycleOwner", "androidx.lifecycle.ProcessLifecycleOwner"], + ["android.arch.lifecycle.ProcessLifecycleOwnerInitializer", "androidx.lifecycle.ProcessLifecycleOwnerInitializer"], + ["android.arch.lifecycle.ReflectiveGenericLifecycleObserver", "androidx.lifecycle.ReflectiveGenericLifecycleObserver"], + ["android.arch.lifecycle.ReportFragment", "androidx.lifecycle.ReportFragment"], + ["android.arch.lifecycle.ServiceLifecycleDispatcher", "androidx.lifecycle.ServiceLifecycleDispatcher"], + ["android.arch.lifecycle.SingleGeneratedAdapterObserver", "androidx.lifecycle.SingleGeneratedAdapterObserver"], + ["android.arch.lifecycle.TransformationKt", "androidx.lifecycle.TransformationKt"], + ["android.arch.lifecycle.Transformations", "androidx.lifecycle.Transformations"], + ["android.arch.lifecycle.Validator", "androidx.lifecycle.Validator"], + ["android.arch.lifecycle.ViewModel", "androidx.lifecycle.ViewModel"], + ["android.arch.lifecycle.ViewModelProvider", "androidx.lifecycle.ViewModelProvider"], + ["android.arch.lifecycle.ViewModelProviders", "androidx.lifecycle.ViewModelProviders"], + ["android.arch.lifecycle.ViewModelStore", "androidx.lifecycle.ViewModelStore"], + ["android.arch.lifecycle.ViewModelStoreOwner", "androidx.lifecycle.ViewModelStoreOwner"], + ["android.arch.lifecycle.ViewModelStores", "androidx.lifecycle.ViewModelStores"], + ["android.arch.lifecycle.WriterKt", "androidx.lifecycle.WriterKt"], + ["android.arch.paging.AsyncPagedListDiffer", "androidx.paging.AsyncPagedListDiffer"], + ["android.arch.paging.ContiguousDataSource", "androidx.paging.ContiguousDataSource"], + ["android.arch.paging.ContiguousPagedList", "androidx.paging.ContiguousPagedList"], + ["android.arch.paging.DataSource", "androidx.paging.DataSource"], + ["android.arch.paging.ItemKeyedDataSource", "androidx.paging.ItemKeyedDataSource"], + ["android.arch.paging.ListDataSource", "androidx.paging.ListDataSource"], + ["android.arch.paging.LivePagedListBuilder", "androidx.paging.LivePagedListBuilder"], + ["android.arch.paging.LivePagedListProvider", "androidx.paging.LivePagedListProvider"], + ["android.arch.paging.PagedList", "androidx.paging.PagedList"], + ["android.arch.paging.PagedListAdapter", "androidx.paging.PagedListAdapter"], + ["android.arch.paging.PagedStorage", "androidx.paging.PagedStorage"], + ["android.arch.paging.PagedStorageDiffHelper", "androidx.paging.PagedStorageDiffHelper"], + ["android.arch.paging.PageKeyedDataSource", "androidx.paging.PageKeyedDataSource"], + ["android.arch.paging.PageResult", "androidx.paging.PageResult"], + ["android.arch.paging.PositionalDataSource", "androidx.paging.PositionalDataSource"], + ["android.arch.paging.RxPagedListBuilder", "androidx.paging.RxPagedListBuilder"], + ["android.arch.paging.SnapshotPagedList", "androidx.paging.SnapshotPagedList"], + ["android.arch.paging.TiledDataSource", "androidx.paging.TiledDataSource"], + ["android.arch.paging.TiledPagedList", "androidx.paging.TiledPagedList"], + ["android.arch.paging.WrapperItemKeyedDataSource", "androidx.paging.WrapperItemKeyedDataSource"], + ["android.arch.paging.WrapperPageKeyedDataSource", "androidx.paging.WrapperPageKeyedDataSource"], + ["android.arch.paging.WrapperPositionalDataSource", "androidx.paging.WrapperPositionalDataSource"], + ["android.arch.persistence.db.framework.FrameworkSQLiteDatabase", "androidx.sqlite.db.framework.FrameworkSQLiteDatabase"], + ["android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper", "androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper"], + ["android.arch.persistence.db.framework.FrameworkSQLiteOpenHelperFactory", "androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory"], + ["android.arch.persistence.db.framework.FrameworkSQLiteProgram", "androidx.sqlite.db.framework.FrameworkSQLiteProgram"], + ["android.arch.persistence.db.framework.FrameworkSQLiteStatement", "androidx.sqlite.db.framework.FrameworkSQLiteStatement"], + ["android.arch.persistence.db.SimpleSQLiteQuery", "androidx.sqlite.db.SimpleSQLiteQuery"], + ["android.arch.persistence.db.SupportSQLiteDatabase", "androidx.sqlite.db.SupportSQLiteDatabase"], + ["android.arch.persistence.db.SupportSQLiteOpenHelper", "androidx.sqlite.db.SupportSQLiteOpenHelper"], + ["android.arch.persistence.db.SupportSQLiteProgram", "androidx.sqlite.db.SupportSQLiteProgram"], + ["android.arch.persistence.db.SupportSQLiteQuery", "androidx.sqlite.db.SupportSQLiteQuery"], + ["android.arch.persistence.db.SupportSQLiteQueryBuilder", "androidx.sqlite.db.SupportSQLiteQueryBuilder"], + ["android.arch.persistence.db.SupportSQLiteStatement", "androidx.sqlite.db.SupportSQLiteStatement"], + ["android.arch.persistence.room.ColumnInfo", "androidx.room.ColumnInfo"], + ["android.arch.persistence.room.Dao", "androidx.room.Dao"], + ["android.arch.persistence.room.Database", "androidx.room.Database"], + ["android.arch.persistence.room.DatabaseConfiguration", "androidx.room.DatabaseConfiguration"], + ["android.arch.persistence.room.Delete", "androidx.room.Delete"], + ["android.arch.persistence.room.Embedded", "androidx.room.Embedded"], + ["android.arch.persistence.room.EmptyResultSetException", "androidx.room.EmptyResultSetException"], + ["android.arch.persistence.room.Entity", "androidx.room.Entity"], + ["android.arch.persistence.room.EntityDeletionOrUpdateAdapter", "androidx.room.EntityDeletionOrUpdateAdapter"], + ["android.arch.persistence.room.EntityInsertionAdapter", "androidx.room.EntityInsertionAdapter"], + ["android.arch.persistence.room.ext.AndroidTypeNames", "androidx.room.ext.AndroidTypeNames"], + ["android.arch.persistence.room.ext.ArchTypeNames", "androidx.room.ext.ArchTypeNames"], + ["android.arch.persistence.room.ext.CommonTypeNames", "androidx.room.ext.CommonTypeNames"], + ["android.arch.persistence.room.ext.Element_extKt", "androidx.room.ext.Element_extKt"], + ["android.arch.persistence.room.ext.GuavaBaseTypeNames", "androidx.room.ext.GuavaBaseTypeNames"], + ["android.arch.persistence.room.ext.GuavaUtilConcurrentTypeNames", "androidx.room.ext.GuavaUtilConcurrentTypeNames"], + ["android.arch.persistence.room.ext.Javapoet_extKt", "androidx.room.ext.Javapoet_extKt"], + ["android.arch.persistence.room.ext.KotlinMetadataProcessor", "androidx.room.ext.KotlinMetadataProcessor"], + ["android.arch.persistence.room.ext.LifecyclesTypeNames", "androidx.room.ext.LifecyclesTypeNames"], + ["android.arch.persistence.room.ext.PagingTypeNames", "androidx.room.ext.PagingTypeNames"], + ["android.arch.persistence.room.ext.ReactiveStreamsTypeNames", "androidx.room.ext.ReactiveStreamsTypeNames"], + ["android.arch.persistence.room.ext.RoomGuavaTypeNames", "androidx.room.ext.RoomGuavaTypeNames"], + ["android.arch.persistence.room.ext.RoomRxJava2TypeNames", "androidx.room.ext.RoomRxJava2TypeNames"], + ["android.arch.persistence.room.ext.RoomTypeNames", "androidx.room.ext.RoomTypeNames"], + ["android.arch.persistence.room.ext.RxJava2TypeNames", "androidx.room.ext.RxJava2TypeNames"], + ["android.arch.persistence.room.ext.SupportDbTypeNames", "androidx.room.ext.SupportDbTypeNames"], + ["android.arch.persistence.room.ForeignKey", "androidx.room.ForeignKey"], + ["android.arch.persistence.room.guava.GuavaRoom", "androidx.room.guava.GuavaRoom"], + ["android.arch.persistence.room.Ignore", "androidx.room.Ignore"], + ["android.arch.persistence.room.Index", "androidx.room.Index"], + ["android.arch.persistence.room.Insert", "androidx.room.Insert"], + ["android.arch.persistence.room.InvalidationTracker", "androidx.room.InvalidationTracker"], + ["android.arch.persistence.room.log.RLog", "androidx.room.log.RLog"], + ["android.arch.persistence.room.migration.bundle.BundleUtil", "androidx.room.migration.bundle.BundleUtil"], + ["android.arch.persistence.room.migration.bundle.DatabaseBundle", "androidx.room.migration.bundle.DatabaseBundle"], + ["android.arch.persistence.room.migration.bundle.EntityBundle", "androidx.room.migration.bundle.EntityBundle"], + ["android.arch.persistence.room.migration.bundle.FieldBundle", "androidx.room.migration.bundle.FieldBundle"], + ["android.arch.persistence.room.migration.bundle.ForeignKeyBundle", "androidx.room.migration.bundle.ForeignKeyBundle"], + ["android.arch.persistence.room.migration.bundle.IndexBundle", "androidx.room.migration.bundle.IndexBundle"], + ["android.arch.persistence.room.migration.bundle.PrimaryKeyBundle", "androidx.room.migration.bundle.PrimaryKeyBundle"], + ["android.arch.persistence.room.migration.bundle.SchemaBundle", "androidx.room.migration.bundle.SchemaBundle"], + ["android.arch.persistence.room.migration.bundle.SchemaEquality", "androidx.room.migration.bundle.SchemaEquality"], + ["android.arch.persistence.room.migration.bundle.SchemaEqualityUtil", "androidx.room.migration.bundle.SchemaEqualityUtil"], + ["android.arch.persistence.room.migration.Migration", "androidx.room.migration.Migration"], + ["android.arch.persistence.room.OnConflictStrategy", "androidx.room.OnConflictStrategy"], + ["android.arch.persistence.room.paging.LimitOffsetDataSource", "androidx.room.paging.LimitOffsetDataSource"], + ["android.arch.persistence.room.parser.Collate", "androidx.room.parser.Collate"], + ["android.arch.persistence.room.parser.ParsedQuery", "androidx.room.parser.ParsedQuery"], + ["android.arch.persistence.room.parser.ParserErrors", "androidx.room.parser.ParserErrors"], + ["android.arch.persistence.room.parser.QueryType", "androidx.room.parser.QueryType"], + ["android.arch.persistence.room.parser.QueryVisitor", "androidx.room.parser.QueryVisitor"], + ["android.arch.persistence.room.parser.Section", "androidx.room.parser.Section"], + ["android.arch.persistence.room.parser.SectionType", "androidx.room.parser.SectionType"], + ["android.arch.persistence.room.parser.SQLiteBaseListener", "androidx.room.parser.SQLiteBaseListener"], + ["android.arch.persistence.room.parser.SQLiteBaseVisitor", "androidx.room.parser.SQLiteBaseVisitor"], + ["android.arch.persistence.room.parser.SQLiteLexer", "androidx.room.parser.SQLiteLexer"], + ["android.arch.persistence.room.parser.SQLiteListener", "androidx.room.parser.SQLiteListener"], + ["android.arch.persistence.room.parser.SQLiteParser", "androidx.room.parser.SQLiteParser"], + ["android.arch.persistence.room.parser.SQLiteVisitor", "androidx.room.parser.SQLiteVisitor"], + ["android.arch.persistence.room.parser.SqlParser", "androidx.room.parser.SqlParser"], + ["android.arch.persistence.room.parser.SQLTypeAffinity", "androidx.room.parser.SQLTypeAffinity"], + ["android.arch.persistence.room.parser.Table", "androidx.room.parser.Table"], + ["android.arch.persistence.room.preconditions.Checks", "androidx.room.preconditions.Checks"], + ["android.arch.persistence.room.PrimaryKey", "androidx.room.PrimaryKey"], + ["android.arch.persistence.room.processor.cache.Cache", "androidx.room.processor.cache.Cache"], + ["android.arch.persistence.room.processor.Context", "androidx.room.processor.Context"], + ["android.arch.persistence.room.processor.CustomConverterProcessor", "androidx.room.processor.CustomConverterProcessor"], + ["android.arch.persistence.room.processor.DaoProcessor", "androidx.room.processor.DaoProcessor"], + ["android.arch.persistence.room.processor.DatabaseProcessor", "androidx.room.processor.DatabaseProcessor"], + ["android.arch.persistence.room.processor.DeletionMethodProcessor", "androidx.room.processor.DeletionMethodProcessor"], + ["android.arch.persistence.room.processor.EntityProcessor", "androidx.room.processor.EntityProcessor"], + ["android.arch.persistence.room.processor.FieldProcessor", "androidx.room.processor.FieldProcessor"], + ["android.arch.persistence.room.processor.InsertionMethodProcessor", "androidx.room.processor.InsertionMethodProcessor"], + ["android.arch.persistence.room.processor.OnConflictProcessor", "androidx.room.processor.OnConflictProcessor"], + ["android.arch.persistence.room.processor.PojoMethodProcessor", "androidx.room.processor.PojoMethodProcessor"], + ["android.arch.persistence.room.processor.PojoProcessor", "androidx.room.processor.PojoProcessor"], + ["android.arch.persistence.room.processor.ProcessorErrors", "androidx.room.processor.ProcessorErrors"], + ["android.arch.persistence.room.processor.QueryMethodProcessor", "androidx.room.processor.QueryMethodProcessor"], + ["android.arch.persistence.room.processor.QueryParameterProcessor", "androidx.room.processor.QueryParameterProcessor"], + ["android.arch.persistence.room.processor.RawQueryMethodProcessor", "androidx.room.processor.RawQueryMethodProcessor"], + ["android.arch.persistence.room.processor.ShortcutMethodProcessor", "androidx.room.processor.ShortcutMethodProcessor"], + ["android.arch.persistence.room.processor.ShortcutParameterProcessor", "androidx.room.processor.ShortcutParameterProcessor"], + ["android.arch.persistence.room.processor.SuppressWarningProcessor", "androidx.room.processor.SuppressWarningProcessor"], + ["android.arch.persistence.room.processor.TransactionMethodProcessor", "androidx.room.processor.TransactionMethodProcessor"], + ["android.arch.persistence.room.processor.UpdateMethodProcessor", "androidx.room.processor.UpdateMethodProcessor"], + ["android.arch.persistence.room.Query", "androidx.room.Query"], + ["android.arch.persistence.room.RawQuery", "androidx.room.RawQuery"], + ["android.arch.persistence.room.Relation", "androidx.room.Relation"], + ["android.arch.persistence.room.Room", "androidx.room.Room"], + ["android.arch.persistence.room.RoomDatabase", "androidx.room.RoomDatabase"], + ["android.arch.persistence.room.RoomMasterTable", "androidx.room.RoomMasterTable"], + ["android.arch.persistence.room.RoomOpenHelper", "androidx.room.RoomOpenHelper"], + ["android.arch.persistence.room.RoomProcessor", "androidx.room.RoomProcessor"], + ["android.arch.persistence.room.RoomSQLiteQuery", "androidx.room.RoomSQLiteQuery"], + ["android.arch.persistence.room.RoomWarnings", "androidx.room.RoomWarnings"], + ["android.arch.persistence.room.RxRoom", "androidx.room.RxRoom"], + ["android.arch.persistence.room.SharedSQLiteStatement", "androidx.room.SharedSQLiteStatement"], + ["android.arch.persistence.room.SkipQueryVerification", "androidx.room.SkipQueryVerification"], + ["android.arch.persistence.room.solver.binderprovider.CursorQueryResultBinderProvider", "androidx.room.solver.binderprovider.CursorQueryResultBinderProvider"], + ["android.arch.persistence.room.solver.binderprovider.DataSourceFactoryQueryResultBinderProvider", "androidx.room.solver.binderprovider.DataSourceFactoryQueryResultBinderProvider"], + ["android.arch.persistence.room.solver.binderprovider.DataSourceQueryResultBinderProvider", "androidx.room.solver.binderprovider.DataSourceQueryResultBinderProvider"], + ["android.arch.persistence.room.solver.binderprovider.FlowableQueryResultBinderProvider", "androidx.room.solver.binderprovider.FlowableQueryResultBinderProvider"], + ["android.arch.persistence.room.solver.binderprovider.GuavaListenableFutureQueryResultBinderProvider", "androidx.room.solver.binderprovider.GuavaListenableFutureQueryResultBinderProvider"], + ["android.arch.persistence.room.solver.binderprovider.InstantQueryResultBinderProvider", "androidx.room.solver.binderprovider.InstantQueryResultBinderProvider"], + ["android.arch.persistence.room.solver.binderprovider.LiveDataQueryResultBinderProvider", "androidx.room.solver.binderprovider.LiveDataQueryResultBinderProvider"], + ["android.arch.persistence.room.solver.binderprovider.RxCallableQueryResultBinderProvider", "androidx.room.solver.binderprovider.RxCallableQueryResultBinderProvider"], + ["android.arch.persistence.room.solver.binderprovider.RxMaybeQueryResultBinderProvider", "androidx.room.solver.binderprovider.RxMaybeQueryResultBinderProvider"], + ["android.arch.persistence.room.solver.binderprovider.RxSingleQueryResultBinderProvider", "androidx.room.solver.binderprovider.RxSingleQueryResultBinderProvider"], + ["android.arch.persistence.room.solver.CodeGenScope", "androidx.room.solver.CodeGenScope"], + ["android.arch.persistence.room.solver.ObservableQueryResultBinderProvider", "androidx.room.solver.ObservableQueryResultBinderProvider"], + ["android.arch.persistence.room.solver.query.parameter.ArrayQueryParameterAdapter", "androidx.room.solver.query.parameter.ArrayQueryParameterAdapter"], + ["android.arch.persistence.room.solver.query.parameter.BasicQueryParameterAdapter", "androidx.room.solver.query.parameter.BasicQueryParameterAdapter"], + ["android.arch.persistence.room.solver.query.parameter.CollectionQueryParameterAdapter", "androidx.room.solver.query.parameter.CollectionQueryParameterAdapter"], + ["android.arch.persistence.room.solver.query.parameter.QueryParameterAdapter", "androidx.room.solver.query.parameter.QueryParameterAdapter"], + ["android.arch.persistence.room.solver.query.result.ArrayQueryResultAdapter", "androidx.room.solver.query.result.ArrayQueryResultAdapter"], + ["android.arch.persistence.room.solver.query.result.BaseObservableQueryResultBinder", "androidx.room.solver.query.result.BaseObservableQueryResultBinder"], + ["android.arch.persistence.room.solver.query.result.CursorQueryResultBinder", "androidx.room.solver.query.result.CursorQueryResultBinder"], + ["android.arch.persistence.room.solver.query.result.DataSourceFactoryQueryResultBinder", "androidx.room.solver.query.result.DataSourceFactoryQueryResultBinder"], + ["android.arch.persistence.room.solver.query.result.EntityRowAdapter", "androidx.room.solver.query.result.EntityRowAdapter"], + ["android.arch.persistence.room.solver.query.result.FlowableQueryResultBinder", "androidx.room.solver.query.result.FlowableQueryResultBinder"], + ["android.arch.persistence.room.solver.query.result.GuavaListenableFutureQueryResultBinder", "androidx.room.solver.query.result.GuavaListenableFutureQueryResultBinder"], + ["android.arch.persistence.room.solver.query.result.GuavaOptionalQueryResultAdapter", "androidx.room.solver.query.result.GuavaOptionalQueryResultAdapter"], + ["android.arch.persistence.room.solver.query.result.InstantQueryResultBinder", "androidx.room.solver.query.result.InstantQueryResultBinder"], + ["android.arch.persistence.room.solver.query.result.ListQueryResultAdapter", "androidx.room.solver.query.result.ListQueryResultAdapter"], + ["android.arch.persistence.room.solver.query.result.LiveDataQueryResultBinder", "androidx.room.solver.query.result.LiveDataQueryResultBinder"], + ["android.arch.persistence.room.solver.query.result.OptionalQueryResultAdapter", "androidx.room.solver.query.result.OptionalQueryResultAdapter"], + ["android.arch.persistence.room.solver.query.result.PojoRowAdapter", "androidx.room.solver.query.result.PojoRowAdapter"], + ["android.arch.persistence.room.solver.query.result.PositionalDataSourceQueryResultBinder", "androidx.room.solver.query.result.PositionalDataSourceQueryResultBinder"], + ["android.arch.persistence.room.solver.query.result.QueryResultAdapter", "androidx.room.solver.query.result.QueryResultAdapter"], + ["android.arch.persistence.room.solver.query.result.QueryResultBinder", "androidx.room.solver.query.result.QueryResultBinder"], + ["android.arch.persistence.room.solver.query.result.RowAdapter", "androidx.room.solver.query.result.RowAdapter"], + ["android.arch.persistence.room.solver.query.result.RxCallableQueryResultBinder", "androidx.room.solver.query.result.RxCallableQueryResultBinder"], + ["android.arch.persistence.room.solver.query.result.SingleColumnRowAdapter", "androidx.room.solver.query.result.SingleColumnRowAdapter"], + ["android.arch.persistence.room.solver.query.result.SingleEntityQueryResultAdapter", "androidx.room.solver.query.result.SingleEntityQueryResultAdapter"], + ["android.arch.persistence.room.solver.query.result.TransactionWrapper", "androidx.room.solver.query.result.TransactionWrapper"], + ["android.arch.persistence.room.solver.query.result.TransactionWrapperKt", "androidx.room.solver.query.result.TransactionWrapperKt"], + ["android.arch.persistence.room.solver.QueryResultBinderProvider", "androidx.room.solver.QueryResultBinderProvider"], + ["android.arch.persistence.room.solver.TypeAdapterStore", "androidx.room.solver.TypeAdapterStore"], + ["android.arch.persistence.room.solver.types.BoxedBooleanToBoxedIntConverter", "androidx.room.solver.types.BoxedBooleanToBoxedIntConverter"], + ["android.arch.persistence.room.solver.types.BoxedPrimitiveColumnTypeAdapter", "androidx.room.solver.types.BoxedPrimitiveColumnTypeAdapter"], + ["android.arch.persistence.room.solver.types.ByteArrayColumnTypeAdapter", "androidx.room.solver.types.ByteArrayColumnTypeAdapter"], + ["android.arch.persistence.room.solver.types.ColumnTypeAdapter", "androidx.room.solver.types.ColumnTypeAdapter"], + ["android.arch.persistence.room.solver.types.CompositeAdapter", "androidx.room.solver.types.CompositeAdapter"], + ["android.arch.persistence.room.solver.types.CompositeTypeConverter", "androidx.room.solver.types.CompositeTypeConverter"], + ["android.arch.persistence.room.solver.types.CursorValueReader", "androidx.room.solver.types.CursorValueReader"], + ["android.arch.persistence.room.solver.types.CustomTypeConverterWrapper", "androidx.room.solver.types.CustomTypeConverterWrapper"], + ["android.arch.persistence.room.solver.types.NoOpConverter", "androidx.room.solver.types.NoOpConverter"], + ["android.arch.persistence.room.solver.types.PrimitiveBooleanToIntConverter", "androidx.room.solver.types.PrimitiveBooleanToIntConverter"], + ["android.arch.persistence.room.solver.types.PrimitiveColumnTypeAdapter", "androidx.room.solver.types.PrimitiveColumnTypeAdapter"], + ["android.arch.persistence.room.solver.types.StatementValueBinder", "androidx.room.solver.types.StatementValueBinder"], + ["android.arch.persistence.room.solver.types.StringColumnTypeAdapter", "androidx.room.solver.types.StringColumnTypeAdapter"], + ["android.arch.persistence.room.solver.types.TypeConverter", "androidx.room.solver.types.TypeConverter"], + ["android.arch.persistence.room.testing.MigrationTestHelper", "androidx.room.testing.MigrationTestHelper"], + ["android.arch.persistence.room.Transaction", "androidx.room.Transaction"], + ["android.arch.persistence.room.TypeConverter", "androidx.room.TypeConverter"], + ["android.arch.persistence.room.TypeConverters", "androidx.room.TypeConverters"], + ["android.arch.persistence.room.Update", "androidx.room.Update"], + ["android.arch.persistence.room.util.StringUtil", "androidx.room.util.StringUtil"], + ["android.arch.persistence.room.util.TableInfo", "androidx.room.util.TableInfo"], + ["android.arch.persistence.room.verifier.ColumnInfo", "androidx.room.verifier.ColumnInfo"], + ["android.arch.persistence.room.verifier.DatabaseVerificaitonErrors", "androidx.room.verifier.DatabaseVerificaitonErrors"], + ["android.arch.persistence.room.verifier.DatabaseVerifier", "androidx.room.verifier.DatabaseVerifier"], + ["android.arch.persistence.room.verifier.QueryResultInfo", "androidx.room.verifier.QueryResultInfo"], + ["android.arch.persistence.room.vo.CallType", "androidx.room.vo.CallType"], + ["android.arch.persistence.room.vo.Constructor", "androidx.room.vo.Constructor"], + ["android.arch.persistence.room.vo.CustomTypeConverter", "androidx.room.vo.CustomTypeConverter"], + ["android.arch.persistence.room.vo.Dao", "androidx.room.vo.Dao"], + ["android.arch.persistence.room.vo.DaoMethod", "androidx.room.vo.DaoMethod"], + ["android.arch.persistence.room.vo.Database", "androidx.room.vo.Database"], + ["android.arch.persistence.room.vo.DeletionMethod", "androidx.room.vo.DeletionMethod"], + ["android.arch.persistence.room.vo.EmbeddedField", "androidx.room.vo.EmbeddedField"], + ["android.arch.persistence.room.vo.Entity", "androidx.room.vo.Entity"], + ["android.arch.persistence.room.vo.Field", "androidx.room.vo.Field"], + ["android.arch.persistence.room.vo.FieldGetter", "androidx.room.vo.FieldGetter"], + ["android.arch.persistence.room.vo.FieldSetter", "androidx.room.vo.FieldSetter"], + ["android.arch.persistence.room.vo.FieldWithIndex", "androidx.room.vo.FieldWithIndex"], + ["android.arch.persistence.room.vo.ForeignKey", "androidx.room.vo.ForeignKey"], + ["android.arch.persistence.room.vo.ForeignKeyAction", "androidx.room.vo.ForeignKeyAction"], + ["android.arch.persistence.room.vo.HasSchemaIdentity", "androidx.room.vo.HasSchemaIdentity"], + ["android.arch.persistence.room.vo.Index", "androidx.room.vo.Index"], + ["android.arch.persistence.room.vo.InsertionMethod", "androidx.room.vo.InsertionMethod"], + ["android.arch.persistence.room.vo.Pojo", "androidx.room.vo.Pojo"], + ["android.arch.persistence.room.vo.PojoMethod", "androidx.room.vo.PojoMethod"], + ["android.arch.persistence.room.vo.PrimaryKey", "androidx.room.vo.PrimaryKey"], + ["android.arch.persistence.room.vo.QueryMethod", "androidx.room.vo.QueryMethod"], + ["android.arch.persistence.room.vo.QueryParameter", "androidx.room.vo.QueryParameter"], + ["android.arch.persistence.room.vo.RawQueryMethod", "androidx.room.vo.RawQueryMethod"], + ["android.arch.persistence.room.vo.Relation", "androidx.room.vo.Relation"], + ["android.arch.persistence.room.vo.RelationCollector", "androidx.room.vo.RelationCollector"], + ["android.arch.persistence.room.vo.SchemaIdentityKey", "androidx.room.vo.SchemaIdentityKey"], + ["android.arch.persistence.room.vo.ShortcutMethod", "androidx.room.vo.ShortcutMethod"], + ["android.arch.persistence.room.vo.ShortcutQueryParameter", "androidx.room.vo.ShortcutQueryParameter"], + ["android.arch.persistence.room.vo.TransactionMethod", "androidx.room.vo.TransactionMethod"], + ["android.arch.persistence.room.vo.UpdateMethod", "androidx.room.vo.UpdateMethod"], + ["android.arch.persistence.room.vo.Warning", "androidx.room.vo.Warning"], + ["android.arch.persistence.room.writer.ClassWriter", "androidx.room.writer.ClassWriter"], + ["android.arch.persistence.room.writer.DaoWriter", "androidx.room.writer.DaoWriter"], + ["android.arch.persistence.room.writer.DatabaseWriter", "androidx.room.writer.DatabaseWriter"], + ["android.arch.persistence.room.writer.EntityCursorConverterWriter", "androidx.room.writer.EntityCursorConverterWriter"], + ["android.arch.persistence.room.writer.EntityDeleteComparator", "androidx.room.writer.EntityDeleteComparator"], + ["android.arch.persistence.room.writer.EntityDeletionAdapterWriter", "androidx.room.writer.EntityDeletionAdapterWriter"], + ["android.arch.persistence.room.writer.EntityInsertionAdapterWriter", "androidx.room.writer.EntityInsertionAdapterWriter"], + ["android.arch.persistence.room.writer.EntityUpdateAdapterWriter", "androidx.room.writer.EntityUpdateAdapterWriter"], + ["android.arch.persistence.room.writer.FieldReadWriteWriter", "androidx.room.writer.FieldReadWriteWriter"], + ["android.arch.persistence.room.writer.PreparedStatementWriter", "androidx.room.writer.PreparedStatementWriter"], + ["android.arch.persistence.room.writer.QueryWriter", "androidx.room.writer.QueryWriter"], + ["android.arch.persistence.room.writer.RelationCollectorMethodWriter", "androidx.room.writer.RelationCollectorMethodWriter"], + ["android.arch.persistence.room.writer.SQLiteOpenHelperWriter", "androidx.room.writer.SQLiteOpenHelperWriter"], + ["android.arch.persistence.room.writer.TableInfoValidationWriter", "androidx.room.writer.TableInfoValidationWriter"], + ["android.databinding.adapters.AbsListViewBindingAdapter", "androidx.databinding.adapters.AbsListViewBindingAdapter"], + ["android.databinding.adapters.AbsSeekBarBindingAdapter", "androidx.databinding.adapters.AbsSeekBarBindingAdapter"], + ["android.databinding.adapters.AbsSpinnerBindingAdapter", "androidx.databinding.adapters.AbsSpinnerBindingAdapter"], + ["android.databinding.adapters.ActionMenuViewBindingAdapter", "androidx.databinding.adapters.ActionMenuViewBindingAdapter"], + ["android.databinding.adapters.AdapterViewBindingAdapter", "androidx.databinding.adapters.AdapterViewBindingAdapter"], + ["android.databinding.adapters.AutoCompleteTextViewBindingAdapter", "androidx.databinding.adapters.AutoCompleteTextViewBindingAdapter"], + ["android.databinding.adapters.CalendarViewBindingAdapter", "androidx.databinding.adapters.CalendarViewBindingAdapter"], + ["android.databinding.adapters.CardViewBindingAdapter", "androidx.databinding.adapters.CardViewBindingAdapter"], + ["android.databinding.adapters.CheckedTextViewBindingAdapter", "androidx.databinding.adapters.CheckedTextViewBindingAdapter"], + ["android.databinding.adapters.ChronometerBindingAdapter", "androidx.databinding.adapters.ChronometerBindingAdapter"], + ["android.databinding.adapters.CompoundButtonBindingAdapter", "androidx.databinding.adapters.CompoundButtonBindingAdapter"], + ["android.databinding.adapters.Converters", "androidx.databinding.adapters.Converters"], + ["android.databinding.adapters.DatePickerBindingAdapter", "androidx.databinding.adapters.DatePickerBindingAdapter"], + ["android.databinding.adapters.ExpandableListViewBindingAdapter", "androidx.databinding.adapters.ExpandableListViewBindingAdapter"], + ["android.databinding.adapters.FrameLayoutBindingAdapter", "androidx.databinding.adapters.FrameLayoutBindingAdapter"], + ["android.databinding.adapters.ImageViewBindingAdapter", "androidx.databinding.adapters.ImageViewBindingAdapter"], + ["android.databinding.adapters.LinearLayoutBindingAdapter", "androidx.databinding.adapters.LinearLayoutBindingAdapter"], + ["android.databinding.adapters.ListenerUtil", "androidx.databinding.adapters.ListenerUtil"], + ["android.databinding.adapters.NumberPickerBindingAdapter", "androidx.databinding.adapters.NumberPickerBindingAdapter"], + ["android.databinding.adapters.ObservableListAdapter", "androidx.databinding.adapters.ObservableListAdapter"], + ["android.databinding.adapters.ProgressBarBindingAdapter", "androidx.databinding.adapters.ProgressBarBindingAdapter"], + ["android.databinding.adapters.RadioGroupBindingAdapter", "androidx.databinding.adapters.RadioGroupBindingAdapter"], + ["android.databinding.adapters.RatingBarBindingAdapter", "androidx.databinding.adapters.RatingBarBindingAdapter"], + ["android.databinding.adapters.SearchViewBindingAdapter", "androidx.databinding.adapters.SearchViewBindingAdapter"], + ["android.databinding.adapters.SeekBarBindingAdapter", "androidx.databinding.adapters.SeekBarBindingAdapter"], + ["android.databinding.adapters.SpinnerBindingAdapter", "androidx.databinding.adapters.SpinnerBindingAdapter"], + ["android.databinding.adapters.SwitchBindingAdapter", "androidx.databinding.adapters.SwitchBindingAdapter"], + ["android.databinding.adapters.SwitchCompatBindingAdapter", "androidx.databinding.adapters.SwitchCompatBindingAdapter"], + ["android.databinding.adapters.TabHostBindingAdapter", "androidx.databinding.adapters.TabHostBindingAdapter"], + ["android.databinding.adapters.TableLayoutBindingAdapter", "androidx.databinding.adapters.TableLayoutBindingAdapter"], + ["android.databinding.adapters.TabWidgetBindingAdapter", "androidx.databinding.adapters.TabWidgetBindingAdapter"], + ["android.databinding.adapters.TextViewBindingAdapter", "androidx.databinding.adapters.TextViewBindingAdapter"], + ["android.databinding.adapters.TimePickerBindingAdapter", "androidx.databinding.adapters.TimePickerBindingAdapter"], + ["android.databinding.adapters.ToolbarBindingAdapter", "androidx.databinding.adapters.ToolbarBindingAdapter"], + ["android.databinding.adapters.VideoViewBindingAdapter", "androidx.databinding.adapters.VideoViewBindingAdapter"], + ["android.databinding.adapters.ViewBindingAdapter", "androidx.databinding.adapters.ViewBindingAdapter"], + ["android.databinding.adapters.ViewGroupBindingAdapter", "androidx.databinding.adapters.ViewGroupBindingAdapter"], + ["android.databinding.adapters.ViewStubBindingAdapter", "androidx.databinding.adapters.ViewStubBindingAdapter"], + ["android.databinding.adapters.ZoomControlsBindingAdapter", "androidx.databinding.adapters.ZoomControlsBindingAdapter"], + ["android.databinding.BaseObservable", "androidx.databinding.BaseObservable"], + ["android.databinding.BaseObservableField", "androidx.databinding.BaseObservableField"], + ["android.databinding.Bindable", "androidx.databinding.Bindable"], + ["android.databinding.BindingAdapter", "androidx.databinding.BindingAdapter"], + ["android.databinding.BindingBuildInfo", "androidx.databinding.BindingBuildInfo"], + ["android.databinding.BindingConversion", "androidx.databinding.BindingConversion"], + ["android.databinding.BindingMethod", "androidx.databinding.BindingMethod"], + ["android.databinding.BindingMethods", "androidx.databinding.BindingMethods"], + ["android.databinding.CallbackRegistry", "androidx.databinding.CallbackRegistry"], + ["android.databinding.DataBinderMapper", "androidx.databinding.DataBinderMapper"], + ["android.databinding.DataBinderMapperImpl", "androidx.databinding.DataBinderMapperImpl"], + ["android.databinding.DataBindingComponent", "androidx.databinding.DataBindingComponent"], + ["android.databinding.DataBindingUtil", "androidx.databinding.DataBindingUtil"], + ["android.databinding.InverseBindingAdapter", "androidx.databinding.InverseBindingAdapter"], + ["android.databinding.InverseBindingListener", "androidx.databinding.InverseBindingListener"], + ["android.databinding.InverseBindingMethod", "androidx.databinding.InverseBindingMethod"], + ["android.databinding.InverseBindingMethods", "androidx.databinding.InverseBindingMethods"], + ["android.databinding.InverseMethod", "androidx.databinding.InverseMethod"], + ["android.databinding.ListChangeRegistry", "androidx.databinding.ListChangeRegistry"], + ["android.databinding.MapChangeRegistry", "androidx.databinding.MapChangeRegistry"], + ["android.databinding.MergedDataBinderMapper", "androidx.databinding.MergedDataBinderMapper"], + ["android.databinding.Observable", "androidx.databinding.Observable"], + ["android.databinding.ObservableArrayList", "androidx.databinding.ObservableArrayList"], + ["android.databinding.ObservableArrayMap", "androidx.databinding.ObservableArrayMap"], + ["android.databinding.ObservableBoolean", "androidx.databinding.ObservableBoolean"], + ["android.databinding.ObservableByte", "androidx.databinding.ObservableByte"], + ["android.databinding.ObservableChar", "androidx.databinding.ObservableChar"], + ["android.databinding.ObservableDouble", "androidx.databinding.ObservableDouble"], + ["android.databinding.ObservableField", "androidx.databinding.ObservableField"], + ["android.databinding.ObservableFloat", "androidx.databinding.ObservableFloat"], + ["android.databinding.ObservableInt", "androidx.databinding.ObservableInt"], + ["android.databinding.ObservableList", "androidx.databinding.ObservableList"], + ["android.databinding.ObservableLong", "androidx.databinding.ObservableLong"], + ["android.databinding.ObservableMap", "androidx.databinding.ObservableMap"], + ["android.databinding.ObservableParcelable", "androidx.databinding.ObservableParcelable"], + ["android.databinding.ObservableShort", "androidx.databinding.ObservableShort"], + ["android.databinding.OnRebindCallback", "androidx.databinding.OnRebindCallback"], + ["android.databinding.PropertyChangeRegistry", "androidx.databinding.PropertyChangeRegistry"], + ["android.databinding.Untaggable", "androidx.databinding.Untaggable"], + ["android.databinding.ViewDataBinding", "androidx.databinding.ViewDataBinding"], + ["android.databinding.ViewStubProxy", "androidx.databinding.ViewStubProxy"], + ["android.support.animation.AnimationHandler", "androidx.dynamicanimation.animation.AnimationHandler"], + ["android.support.animation.DynamicAnimation", "androidx.dynamicanimation.animation.DynamicAnimation"], + ["android.support.animation.FlingAnimation", "androidx.dynamicanimation.animation.FlingAnimation"], + ["android.support.animation.FloatPropertyCompat", "androidx.dynamicanimation.animation.FloatPropertyCompat"], + ["android.support.animation.FloatValueHolder", "androidx.dynamicanimation.animation.FloatValueHolder"], + ["android.support.animation.Force", "androidx.dynamicanimation.animation.Force"], + ["android.support.animation.SpringAnimation", "androidx.dynamicanimation.animation.SpringAnimation"], + ["android.support.animation.SpringForce", "androidx.dynamicanimation.animation.SpringForce"], + ["android.support.annotation.AnimatorRes", "androidx.annotation.AnimatorRes"], + ["android.support.annotation.AnimRes", "androidx.annotation.AnimRes"], + ["android.support.annotation.AnyRes", "androidx.annotation.AnyRes"], + ["android.support.annotation.AnyThread", "androidx.annotation.AnyThread"], + ["android.support.annotation.ArrayRes", "androidx.annotation.ArrayRes"], + ["android.support.annotation.AttrRes", "androidx.annotation.AttrRes"], + ["android.support.annotation.BinderThread", "androidx.annotation.BinderThread"], + ["android.support.annotation.BoolRes", "androidx.annotation.BoolRes"], + ["android.support.annotation.CallSuper", "androidx.annotation.CallSuper"], + ["android.support.annotation.CheckResult", "androidx.annotation.CheckResult"], + ["android.support.annotation.ColorInt", "androidx.annotation.ColorInt"], + ["android.support.annotation.ColorLong", "androidx.annotation.ColorLong"], + ["android.support.annotation.ColorRes", "androidx.annotation.ColorRes"], + ["android.support.annotation.DimenRes", "androidx.annotation.DimenRes"], + ["android.support.annotation.Dimension", "androidx.annotation.Dimension"], + ["android.support.annotation.DrawableRes", "androidx.annotation.DrawableRes"], + ["android.support.annotation.FloatRange", "androidx.annotation.FloatRange"], + ["android.support.annotation.FontRes", "androidx.annotation.FontRes"], + ["android.support.annotation.FractionRes", "androidx.annotation.FractionRes"], + ["android.support.annotation.GuardedBy", "androidx.annotation.GuardedBy"], + ["android.support.annotation.HalfFloat", "androidx.annotation.HalfFloat"], + ["android.support.annotation.IdRes", "androidx.annotation.IdRes"], + ["android.support.annotation.IntDef", "androidx.annotation.IntDef"], + ["android.support.annotation.IntegerRes", "androidx.annotation.IntegerRes"], + ["android.support.annotation.InterpolatorRes", "androidx.annotation.InterpolatorRes"], + ["android.support.annotation.IntRange", "androidx.annotation.IntRange"], + ["android.support.annotation.Keep", "androidx.annotation.Keep"], + ["android.support.annotation.LayoutRes", "androidx.annotation.LayoutRes"], + ["android.support.annotation.LongDef", "androidx.annotation.LongDef"], + ["android.support.annotation.MainThread", "androidx.annotation.MainThread"], + ["android.support.annotation.MenuRes", "androidx.annotation.MenuRes"], + ["android.support.annotation.NavigationRes", "androidx.annotation.NavigationRes"], + ["android.support.annotation.NonNull", "androidx.annotation.NonNull"], + ["android.support.annotation.Nullable", "androidx.annotation.Nullable"], + ["android.support.annotation.PluralsRes", "androidx.annotation.PluralsRes"], + ["android.support.annotation.Px", "androidx.annotation.Px"], + ["android.support.annotation.RawRes", "androidx.annotation.RawRes"], + ["android.support.annotation.RequiresApi", "androidx.annotation.RequiresApi"], + ["android.support.annotation.RequiresFeature", "androidx.annotation.RequiresFeature"], + ["android.support.annotation.RequiresPermission", "androidx.annotation.RequiresPermission"], + ["android.support.annotation.RestrictTo", "androidx.annotation.RestrictTo"], + ["android.support.annotation.Size", "androidx.annotation.Size"], + ["android.support.annotation.StringDef", "androidx.annotation.StringDef"], + ["android.support.annotation.StringRes", "androidx.annotation.StringRes"], + ["android.support.annotation.StyleableRes", "androidx.annotation.StyleableRes"], + ["android.support.annotation.StyleRes", "androidx.annotation.StyleRes"], + ["android.support.annotation.TransitionRes", "androidx.annotation.TransitionRes"], + ["android.support.annotation.UiThread", "androidx.annotation.UiThread"], + ["android.support.annotation.VisibleForTesting", "androidx.annotation.VisibleForTesting"], + ["android.support.annotation.WorkerThread", "androidx.annotation.WorkerThread"], + ["android.support.annotation.XmlRes", "androidx.annotation.XmlRes"], + ["android.support.app.recommendation.ContentRecommendation", "androidx.recommendation.app.ContentRecommendation"], + ["android.support.app.recommendation.RecommendationExtender", "androidx.recommendation.app.RecommendationExtender"], + ["android.support.compat.R", "androidx.core.R"], + ["android.support.constraint.Barrier", "androidx.constraintlayout.widget.Barrier"], + ["android.support.constraint.ConstraintHelper", "androidx.constraintlayout.widget.ConstraintHelper"], + ["android.support.constraint.ConstraintLayout", "androidx.constraintlayout.widget.ConstraintLayout"], + ["android.support.constraint.Constraints", "androidx.constraintlayout.widget.Constraints"], + ["android.support.constraint.ConstraintSet", "androidx.constraintlayout.widget.ConstraintSet"], + ["android.support.constraint.Group", "androidx.constraintlayout.widget.Group"], + ["android.support.constraint.Guideline", "androidx.constraintlayout.widget.Guideline"], + ["android.support.constraint.Placeholder", "androidx.constraintlayout.widget.Placeholder"], + ["android.support.constraint.R", "androidx.constraintlayout.widget.R"], + ["android.support.constraint.solver.ArrayLinkedVariables", "androidx.constraintlayout.solver.ArrayLinkedVariables"], + ["android.support.constraint.solver.ArrayRow", "androidx.constraintlayout.solver.ArrayRow"], + ["android.support.constraint.solver.Cache", "androidx.constraintlayout.solver.Cache"], + ["android.support.constraint.solver.GoalRow", "androidx.constraintlayout.solver.GoalRow"], + ["android.support.constraint.solver.LinearSystem", "androidx.constraintlayout.solver.LinearSystem"], + ["android.support.constraint.solver.Metrics", "androidx.constraintlayout.solver.Metrics"], + ["android.support.constraint.solver.Pools", "androidx.constraintlayout.solver.Pools"], + ["android.support.constraint.solver.SolverVariable", "androidx.constraintlayout.solver.SolverVariable"], + ["android.support.constraint.solver.widgets.Analyzer", "androidx.constraintlayout.solver.widgets.Analyzer"], + ["android.support.constraint.solver.widgets.Barrier", "androidx.constraintlayout.solver.widgets.Barrier"], + ["android.support.constraint.solver.widgets.Chain", "androidx.constraintlayout.solver.widgets.Chain"], + ["android.support.constraint.solver.widgets.ChainHead", "androidx.constraintlayout.solver.widgets.ChainHead"], + ["android.support.constraint.solver.widgets.ConstraintAnchor", "androidx.constraintlayout.solver.widgets.ConstraintAnchor"], + ["android.support.constraint.solver.widgets.ConstraintHorizontalLayout", "androidx.constraintlayout.solver.widgets.ConstraintHorizontalLayout"], + ["android.support.constraint.solver.widgets.ConstraintTableLayout", "androidx.constraintlayout.solver.widgets.ConstraintTableLayout"], + ["android.support.constraint.solver.widgets.ConstraintWidget", "androidx.constraintlayout.solver.widgets.ConstraintWidget"], + ["android.support.constraint.solver.widgets.ConstraintWidgetContainer", "androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer"], + ["android.support.constraint.solver.widgets.ConstraintWidgetGroup", "androidx.constraintlayout.solver.widgets.ConstraintWidgetGroup"], + ["android.support.constraint.solver.widgets.Guideline", "androidx.constraintlayout.solver.widgets.Guideline"], + ["android.support.constraint.solver.widgets.Helper", "androidx.constraintlayout.solver.widgets.Helper"], + ["android.support.constraint.solver.widgets.Optimizer", "androidx.constraintlayout.solver.widgets.Optimizer"], + ["android.support.constraint.solver.widgets.Rectangle", "androidx.constraintlayout.solver.widgets.Rectangle"], + ["android.support.constraint.solver.widgets.ResolutionAnchor", "androidx.constraintlayout.solver.widgets.ResolutionAnchor"], + ["android.support.constraint.solver.widgets.ResolutionDimension", "androidx.constraintlayout.solver.widgets.ResolutionDimension"], + ["android.support.constraint.solver.widgets.ResolutionNode", "androidx.constraintlayout.solver.widgets.ResolutionNode"], + ["android.support.constraint.solver.widgets.Snapshot", "androidx.constraintlayout.solver.widgets.Snapshot"], + ["android.support.constraint.solver.widgets.WidgetContainer", "androidx.constraintlayout.solver.widgets.WidgetContainer"], + ["android.support.content.ContentPager", "androidx.contentpager.content.ContentPager"], + ["android.support.content.InMemoryCursor", "androidx.contentpager.content.InMemoryCursor"], + ["android.support.content.LoaderQueryRunner", "androidx.contentpager.content.LoaderQueryRunner"], + ["android.support.content.Query", "androidx.contentpager.content.Query"], + ["android.support.coordinatorlayout.R", "androidx.coordinatorlayout.R"], + ["android.support.customtabs.CustomTabsCallback", "androidx.browser.customtabs.CustomTabsCallback"], + ["android.support.customtabs.CustomTabsClient", "androidx.browser.customtabs.CustomTabsClient"], + ["android.support.customtabs.CustomTabsIntent", "androidx.browser.customtabs.CustomTabsIntent"], + ["android.support.customtabs.CustomTabsService", "androidx.browser.customtabs.CustomTabsService"], + ["android.support.customtabs.CustomTabsServiceConnection", "androidx.browser.customtabs.CustomTabsServiceConnection"], + ["android.support.customtabs.CustomTabsSession", "androidx.browser.customtabs.CustomTabsSession"], + ["android.support.customtabs.CustomTabsSessionToken", "androidx.browser.customtabs.CustomTabsSessionToken"], + ["android.support.customtabs.ICustomTabsCallback", "android.support.customtabs.ICustomTabsCallback"], + ["android.support.customtabs.ICustomTabsService", "android.support.customtabs.ICustomTabsService"], + ["android.support.customtabs.IPostMessageService", "android.support.customtabs.IPostMessageService"], + ["android.support.customtabs.PostMessageService", "androidx.browser.customtabs.PostMessageService"], + ["android.support.customtabs.PostMessageServiceConnection", "androidx.browser.customtabs.PostMessageServiceConnection"], + ["android.support.customtabs.R", "androidx.browser.R"], + ["android.support.customtabs.TrustedWebUtils", "androidx.browser.customtabs.TrustedWebUtils"], + ["android.support.design.animation.AnimationUtils", "com.google.android.material.animation.AnimationUtils"], + ["android.support.design.animation.AnimatorSetCompat", "com.google.android.material.animation.AnimatorSetCompat"], + ["android.support.design.animation.ArgbEvaluatorCompat", "com.google.android.material.animation.ArgbEvaluatorCompat"], + ["android.support.design.animation.ChildrenAlphaProperty", "com.google.android.material.animation.ChildrenAlphaProperty"], + ["android.support.design.animation.DrawableAlphaProperty", "com.google.android.material.animation.DrawableAlphaProperty"], + ["android.support.design.animation.ImageMatrixProperty", "com.google.android.material.animation.ImageMatrixProperty"], + ["android.support.design.animation.MatrixEvaluator", "com.google.android.material.animation.MatrixEvaluator"], + ["android.support.design.animation.MotionSpec", "com.google.android.material.animation.MotionSpec"], + ["android.support.design.animation.MotionTiming", "com.google.android.material.animation.MotionTiming"], + ["android.support.design.animation.Positioning", "com.google.android.material.animation.Positioning"], + ["android.support.design.behavior.HideBottomViewOnScrollBehavior", "com.google.android.material.behavior.HideBottomViewOnScrollBehavior"], + ["android.support.design.bottomappbar.BottomAppBar", "com.google.android.material.bottomappbar.BottomAppBar"], + ["android.support.design.bottomappbar.BottomAppBarTopEdgeTreatment", "com.google.android.material.bottomappbar.BottomAppBarTopEdgeTreatment"], + ["android.support.design.bottomnavigation.LabelVisibilityMode", "com.google.android.material.bottomnavigation.LabelVisibilityMode"], + ["android.support.design.button.MaterialButton", "com.google.android.material.button.MaterialButton"], + ["android.support.design.button.MaterialButtonBackgroundDrawable", "com.google.android.material.button.MaterialButtonBackgroundDrawable"], + ["android.support.design.button.MaterialButtonHelper", "com.google.android.material.button.MaterialButtonHelper"], + ["android.support.design.canvas.CanvasCompat", "com.google.android.material.canvas.CanvasCompat"], + ["android.support.design.card.MaterialCardView", "com.google.android.material.card.MaterialCardView"], + ["android.support.design.card.MaterialCardViewHelper", "com.google.android.material.card.MaterialCardViewHelper"], + ["android.support.design.chip.Chip", "com.google.android.material.chip.Chip"], + ["android.support.design.chip.ChipDrawable", "com.google.android.material.chip.ChipDrawable"], + ["android.support.design.chip.ChipGroup", "com.google.android.material.chip.ChipGroup"], + ["android.support.design.circularreveal.cardview.CircularRevealCardView", "com.google.android.material.circularreveal.cardview.CircularRevealCardView"], + ["android.support.design.circularreveal.CircularRevealCompat", "com.google.android.material.circularreveal.CircularRevealCompat"], + ["android.support.design.circularreveal.CircularRevealFrameLayout", "com.google.android.material.circularreveal.CircularRevealFrameLayout"], + ["android.support.design.circularreveal.CircularRevealGridLayout", "com.google.android.material.circularreveal.CircularRevealGridLayout"], + ["android.support.design.circularreveal.CircularRevealHelper", "com.google.android.material.circularreveal.CircularRevealHelper"], + ["android.support.design.circularreveal.CircularRevealLinearLayout", "com.google.android.material.circularreveal.CircularRevealLinearLayout"], + ["android.support.design.circularreveal.CircularRevealRelativeLayout", "com.google.android.material.circularreveal.CircularRevealRelativeLayout"], + ["android.support.design.circularreveal.CircularRevealWidget", "com.google.android.material.circularreveal.CircularRevealWidget"], + ["android.support.design.circularreveal.coordinatorlayout.CircularRevealCoordinatorLayout", "com.google.android.material.circularreveal.coordinatorlayout.CircularRevealCoordinatorLayout"], + ["android.support.design.drawable.DrawableUtils", "com.google.android.material.drawable.DrawableUtils"], + ["android.support.design.expandable.ExpandableTransformationWidget", "com.google.android.material.expandable.ExpandableTransformationWidget"], + ["android.support.design.expandable.ExpandableWidget", "com.google.android.material.expandable.ExpandableWidget"], + ["android.support.design.expandable.ExpandableWidgetHelper", "com.google.android.material.expandable.ExpandableWidgetHelper"], + ["android.support.design.internal.BaselineLayout", "com.google.android.material.internal.BaselineLayout"], + ["android.support.design.internal.BottomNavigationItemView", "com.google.android.material.bottomnavigation.BottomNavigationItemView"], + ["android.support.design.internal.BottomNavigationMenu", "com.google.android.material.bottomnavigation.BottomNavigationMenu"], + ["android.support.design.internal.BottomNavigationMenuView", "com.google.android.material.bottomnavigation.BottomNavigationMenuView"], + ["android.support.design.internal.BottomNavigationPresenter", "com.google.android.material.bottomnavigation.BottomNavigationPresenter"], + ["android.support.design.internal.Experimental", "com.google.android.material.internal.Experimental"], + ["android.support.design.internal.FlowLayout", "com.google.android.material.internal.FlowLayout"], + ["android.support.design.internal.ForegroundLinearLayout", "com.google.android.material.internal.ForegroundLinearLayout"], + ["android.support.design.internal.NavigationMenu", "com.google.android.material.internal.NavigationMenu"], + ["android.support.design.internal.NavigationMenuItemView", "com.google.android.material.internal.NavigationMenuItemView"], + ["android.support.design.internal.NavigationMenuPresenter", "com.google.android.material.internal.NavigationMenuPresenter"], + ["android.support.design.internal.NavigationMenuView", "com.google.android.material.internal.NavigationMenuView"], + ["android.support.design.internal.NavigationSubMenu", "com.google.android.material.internal.NavigationSubMenu"], + ["android.support.design.internal.ParcelableSparseArray", "com.google.android.material.internal.ParcelableSparseArray"], + ["android.support.design.internal.ScrimInsetsFrameLayout", "com.google.android.material.internal.ScrimInsetsFrameLayout"], + ["android.support.design.internal.TextScale", "com.google.android.material.internal.TextScale"], + ["android.support.design.internal.ThemeEnforcement", "com.google.android.material.internal.ThemeEnforcement"], + ["android.support.design.internal.ViewUtils", "com.google.android.material.internal.ViewUtils"], + ["android.support.design.R", "com.google.android.material.R"], + ["android.support.design.resources.MaterialResources", "com.google.android.material.resources.MaterialResources"], + ["android.support.design.resources.TextAppearance", "com.google.android.material.resources.TextAppearance"], + ["android.support.design.resources.TextAppearanceConfig", "com.google.android.material.resources.TextAppearanceConfig"], + ["android.support.design.ripple.RippleUtils", "com.google.android.material.ripple.RippleUtils"], + ["android.support.design.shape.CornerTreatment", "com.google.android.material.shape.CornerTreatment"], + ["android.support.design.shape.CutCornerTreatment", "com.google.android.material.shape.CutCornerTreatment"], + ["android.support.design.shape.EdgeTreatment", "com.google.android.material.shape.EdgeTreatment"], + ["android.support.design.shape.InterpolateOnScrollPositionChangeHelper", "com.google.android.material.shape.InterpolateOnScrollPositionChangeHelper"], + ["android.support.design.shape.MaterialShapeDrawable", "com.google.android.material.shape.MaterialShapeDrawable"], + ["android.support.design.shape.RoundedCornerTreatment", "com.google.android.material.shape.RoundedCornerTreatment"], + ["android.support.design.shape.ShapePath", "com.google.android.material.shape.ShapePath"], + ["android.support.design.shape.ShapePathModel", "com.google.android.material.shape.ShapePathModel"], + ["android.support.design.shape.TriangleEdgeTreatment", "com.google.android.material.shape.TriangleEdgeTreatment"], + ["android.support.design.snackbar.ContentViewCallback", "com.google.android.material.snackbar.ContentViewCallback"], + ["android.support.design.stateful.ExtendableSavedState", "com.google.android.material.stateful.ExtendableSavedState"], + ["android.support.design.theme.MaterialComponentsViewInflater", "com.google.android.material.theme.MaterialComponentsViewInflater"], + ["android.support.design.transformation.ExpandableBehavior", "com.google.android.material.transformation.ExpandableBehavior"], + ["android.support.design.transformation.ExpandableTransformationBehavior", "com.google.android.material.transformation.ExpandableTransformationBehavior"], + ["android.support.design.transformation.FabTransformationBehavior", "com.google.android.material.transformation.FabTransformationBehavior"], + ["android.support.design.transformation.FabTransformationScrimBehavior", "com.google.android.material.transformation.FabTransformationScrimBehavior"], + ["android.support.design.transformation.FabTransformationSheetBehavior", "com.google.android.material.transformation.FabTransformationSheetBehavior"], + ["android.support.design.transformation.TransformationChildCard", "com.google.android.material.transformation.TransformationChildCard"], + ["android.support.design.transformation.TransformationChildLayout", "com.google.android.material.transformation.TransformationChildLayout"], + ["android.support.design.widget.AppBarLayout", "com.google.android.material.appbar.AppBarLayout"], + ["android.support.design.widget.BaseTransientBottomBar", "com.google.android.material.snackbar.BaseTransientBottomBar"], + ["android.support.design.widget.BottomNavigationView", "com.google.android.material.bottomnavigation.BottomNavigationView"], + ["android.support.design.widget.BottomSheetBehavior", "com.google.android.material.bottomsheet.BottomSheetBehavior"], + ["android.support.design.widget.BottomSheetDialog", "com.google.android.material.bottomsheet.BottomSheetDialog"], + ["android.support.design.widget.BottomSheetDialogFragment", "com.google.android.material.bottomsheet.BottomSheetDialogFragment"], + ["android.support.design.widget.CheckableImageButton", "com.google.android.material.internal.CheckableImageButton"], + ["android.support.design.widget.CircularBorderDrawable", "com.google.android.material.internal.CircularBorderDrawable"], + ["android.support.design.widget.CircularBorderDrawableLollipop", "com.google.android.material.internal.CircularBorderDrawableLollipop"], + ["android.support.design.widget.CollapsingTextHelper", "com.google.android.material.internal.CollapsingTextHelper"], + ["android.support.design.widget.CollapsingToolbarLayout", "com.google.android.material.appbar.CollapsingToolbarLayout"], + ["android.support.design.widget.CoordinatorLayout", "androidx.coordinatorlayout.widget.CoordinatorLayout"], + ["android.support.design.widget.CutoutDrawable", "com.google.android.material.textfield.CutoutDrawable"], + ["android.support.design.widget.DescendantOffsetUtils", "com.google.android.material.internal.DescendantOffsetUtils"], + ["android.support.design.widget.DrawableUtils", "com.google.android.material.internal.DrawableUtils"], + ["android.support.design.widget.FloatingActionButton", "com.google.android.material.floatingactionbutton.FloatingActionButton"], + ["android.support.design.widget.FloatingActionButtonImpl", "com.google.android.material.floatingactionbutton.FloatingActionButtonImpl"], + ["android.support.design.widget.FloatingActionButtonImplLollipop", "com.google.android.material.floatingactionbutton.FloatingActionButtonImplLollipop"], + ["android.support.design.widget.HeaderBehavior", "com.google.android.material.appbar.HeaderBehavior"], + ["android.support.design.widget.HeaderScrollingViewBehavior", "com.google.android.material.appbar.HeaderScrollingViewBehavior"], + ["android.support.design.widget.IndicatorViewController", "com.google.android.material.textfield.IndicatorViewController"], + ["android.support.design.widget.MathUtils", "com.google.android.material.math.MathUtils"], + ["android.support.design.widget.NavigationView", "com.google.android.material.navigation.NavigationView"], + ["android.support.design.widget.ShadowDrawableWrapper", "com.google.android.material.shadow.ShadowDrawableWrapper"], + ["android.support.design.widget.ShadowViewDelegate", "com.google.android.material.shadow.ShadowViewDelegate"], + ["android.support.design.widget.Snackbar", "com.google.android.material.snackbar.Snackbar"], + ["android.support.design.widget.SnackbarContentLayout", "com.google.android.material.snackbar.SnackbarContentLayout"], + ["android.support.design.widget.SnackbarManager", "com.google.android.material.snackbar.SnackbarManager"], + ["android.support.design.widget.StateListAnimator", "com.google.android.material.internal.StateListAnimator"], + ["android.support.design.widget.SwipeDismissBehavior", "com.google.android.material.behavior.SwipeDismissBehavior"], + ["android.support.design.widget.TabItem", "com.google.android.material.tabs.TabItem"], + ["android.support.design.widget.TabLayout", "com.google.android.material.tabs.TabLayout"], + ["android.support.design.widget.TextInputEditText", "com.google.android.material.textfield.TextInputEditText"], + ["android.support.design.widget.TextInputLayout", "com.google.android.material.textfield.TextInputLayout"], + ["android.support.design.widget.ViewOffsetBehavior", "com.google.android.material.appbar.ViewOffsetBehavior"], + ["android.support.design.widget.ViewOffsetHelper", "com.google.android.material.appbar.ViewOffsetHelper"], + ["android.support.design.widget.ViewUtilsLollipop", "com.google.android.material.appbar.ViewUtilsLollipop"], + ["android.support.design.widget.VisibilityAwareImageButton", "com.google.android.material.internal.VisibilityAwareImageButton"], + ["android.support.graphics.drawable.AndroidResources", "androidx.vectordrawable.graphics.drawable.AndroidResources"], + ["android.support.graphics.drawable.Animatable2Compat", "androidx.vectordrawable.graphics.drawable.Animatable2Compat"], + ["android.support.graphics.drawable.AnimatedVectorDrawableCompat", "androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat"], + ["android.support.graphics.drawable.AnimationUtilsCompat", "androidx.vectordrawable.graphics.drawable.AnimationUtilsCompat"], + ["android.support.graphics.drawable.AnimatorInflaterCompat", "androidx.vectordrawable.graphics.drawable.AnimatorInflaterCompat"], + ["android.support.graphics.drawable.ArgbEvaluator", "androidx.vectordrawable.graphics.drawable.ArgbEvaluator"], + ["android.support.graphics.drawable.PathInterpolatorCompat", "androidx.vectordrawable.graphics.drawable.PathInterpolatorCompat"], + ["android.support.graphics.drawable.VectorDrawableCommon", "androidx.vectordrawable.graphics.drawable.VectorDrawableCommon"], + ["android.support.graphics.drawable.VectorDrawableCompat", "androidx.vectordrawable.graphics.drawable.VectorDrawableCompat"], + ["android.support.media.ExifInterface", "androidx.exifinterface.media.ExifInterface"], + ["android.support.media.tv.BasePreviewProgram", "androidx.tvprovider.media.tv.BasePreviewProgram"], + ["android.support.media.tv.BaseProgram", "androidx.tvprovider.media.tv.BaseProgram"], + ["android.support.media.tv.Channel", "androidx.tvprovider.media.tv.Channel"], + ["android.support.media.tv.ChannelLogoUtils", "androidx.tvprovider.media.tv.ChannelLogoUtils"], + ["android.support.media.tv.CollectionUtils", "androidx.tvprovider.media.tv.CollectionUtils"], + ["android.support.media.tv.PreviewChannel", "androidx.tvprovider.media.tv.PreviewChannel"], + ["android.support.media.tv.PreviewChannelHelper", "androidx.tvprovider.media.tv.PreviewChannelHelper"], + ["android.support.media.tv.PreviewProgram", "androidx.tvprovider.media.tv.PreviewProgram"], + ["android.support.media.tv.Program", "androidx.tvprovider.media.tv.Program"], + ["android.support.media.tv.TvContractCompat", "androidx.tvprovider.media.tv.TvContractCompat"], + ["android.support.media.tv.TvContractUtils", "androidx.tvprovider.media.tv.TvContractUtils"], + ["android.support.media.tv.WatchNextProgram", "androidx.tvprovider.media.tv.WatchNextProgram"], + ["android.support.media2.BaseRemoteMediaPlayerConnector", "android.support.media2.BaseRemoteMediaPlayerConnector"], + ["android.support.media2.DataSourceDesc2", "android.support.media2.DataSourceDesc2"], + ["android.support.media2.MediaPlayerConnector", "android.support.media2.MediaPlayerConnector"], + ["android.support.media2.MediaPlaylistAgent", "android.support.media2.MediaPlaylistAgent"], + ["android.support.media2.MediaSession2", "android.support.media2.MediaSession2"], + ["android.support.mediacompat.R", "androidx.media.R"], + ["android.support.multidex.MultiDex", "androidx.multidex.MultiDex"], + ["android.support.multidex.MultiDexApplication", "androidx.multidex.MultiDexApplication"], + ["android.support.multidex.MultiDexExtractor", "androidx.multidex.MultiDexExtractor"], + ["android.support.multidex.ZipUtil", "androidx.multidex.ZipUtil"], + ["android.support.percent.PercentFrameLayout", "androidx.percentlayout.widget.PercentFrameLayout"], + ["android.support.percent.PercentLayoutHelper", "androidx.percentlayout.widget.PercentLayoutHelper"], + ["android.support.percent.PercentRelativeLayout", "androidx.percentlayout.widget.PercentRelativeLayout"], + ["android.support.percent.R", "androidx.percentlayout.R"], + ["android.support.test.annotation.Beta", "androidx.test.annotation.Beta"], + ["android.support.test.annotation.UiThreadTest", "androidx.test.annotation.UiThreadTest"], + ["android.support.test.espresso.accessibility.AccessibilityChecks", "androidx.test.espresso.accessibility.AccessibilityChecks"], + ["android.support.test.espresso.action.AdapterDataLoaderAction", "androidx.test.espresso.action.AdapterDataLoaderAction"], + ["android.support.test.espresso.action.AdapterDataLoaderActionRemoteMsg", "androidx.test.espresso.action.AdapterDataLoaderActionRemoteMsg"], + ["android.support.test.espresso.action.AdapterViewProtocol", "androidx.test.espresso.action.AdapterViewProtocol"], + ["android.support.test.espresso.action.AdapterViewProtocols", "androidx.test.espresso.action.AdapterViewProtocols"], + ["android.support.test.espresso.action.CloseKeyboardAction", "androidx.test.espresso.action.CloseKeyboardAction"], + ["android.support.test.espresso.action.CoordinatesProvider", "androidx.test.espresso.action.CoordinatesProvider"], + ["android.support.test.espresso.action.EditorAction", "androidx.test.espresso.action.EditorAction"], + ["android.support.test.espresso.action.EspressoKey", "androidx.test.espresso.action.EspressoKey"], + ["android.support.test.espresso.action.GeneralClickAction", "androidx.test.espresso.action.GeneralClickAction"], + ["android.support.test.espresso.action.GeneralClickActionRemoteMessage", "androidx.test.espresso.action.GeneralClickActionRemoteMessage"], + ["android.support.test.espresso.action.GeneralLocation", "androidx.test.espresso.action.GeneralLocation"], + ["android.support.test.espresso.action.GeneralLocationRemoteMessage", "androidx.test.espresso.action.GeneralLocationRemoteMessage"], + ["android.support.test.espresso.action.GeneralSwipeAction", "androidx.test.espresso.action.GeneralSwipeAction"], + ["android.support.test.espresso.action.GeneralSwipeActionRemoteMessage", "androidx.test.espresso.action.GeneralSwipeActionRemoteMessage"], + ["android.support.test.espresso.action.KeyEventAction", "androidx.test.espresso.action.KeyEventAction"], + ["android.support.test.espresso.action.KeyEventActionBase", "androidx.test.espresso.action.KeyEventActionBase"], + ["android.support.test.espresso.action.MotionEvents", "androidx.test.espresso.action.MotionEvents"], + ["android.support.test.espresso.action.OpenLinkAction", "androidx.test.espresso.action.OpenLinkAction"], + ["android.support.test.espresso.action.PrecisionDescriber", "androidx.test.espresso.action.PrecisionDescriber"], + ["android.support.test.espresso.action.Press", "androidx.test.espresso.action.Press"], + ["android.support.test.espresso.action.PressBackAction", "androidx.test.espresso.action.PressBackAction"], + ["android.support.test.espresso.action.PressRemoteMessage", "androidx.test.espresso.action.PressRemoteMessage"], + ["android.support.test.espresso.action.RemoteViewActions", "androidx.test.espresso.action.RemoteViewActions"], + ["android.support.test.espresso.action.RepeatActionUntilViewState", "androidx.test.espresso.action.RepeatActionUntilViewState"], + ["android.support.test.espresso.action.ReplaceTextAction", "androidx.test.espresso.action.ReplaceTextAction"], + ["android.support.test.espresso.action.ScrollToAction", "androidx.test.espresso.action.ScrollToAction"], + ["android.support.test.espresso.action.Swipe", "androidx.test.espresso.action.Swipe"], + ["android.support.test.espresso.action.Swiper", "androidx.test.espresso.action.Swiper"], + ["android.support.test.espresso.action.SwipeRemoteMessage", "androidx.test.espresso.action.SwipeRemoteMessage"], + ["android.support.test.espresso.action.Tap", "androidx.test.espresso.action.Tap"], + ["android.support.test.espresso.action.Tapper", "androidx.test.espresso.action.Tapper"], + ["android.support.test.espresso.action.TapRemoteMessage", "androidx.test.espresso.action.TapRemoteMessage"], + ["android.support.test.espresso.action.TranslatedCoordinatesProvider", "androidx.test.espresso.action.TranslatedCoordinatesProvider"], + ["android.support.test.espresso.action.TranslatedCoordinatesProviderRemoteMessage", "androidx.test.espresso.action.TranslatedCoordinatesProviderRemoteMessage"], + ["android.support.test.espresso.action.TypeTextAction", "androidx.test.espresso.action.TypeTextAction"], + ["android.support.test.espresso.action.ViewActions", "androidx.test.espresso.action.ViewActions"], + ["android.support.test.espresso.AmbiguousViewMatcherException", "androidx.test.espresso.AmbiguousViewMatcherException"], + ["android.support.test.espresso.AppNotIdleException", "androidx.test.espresso.AppNotIdleException"], + ["android.support.test.espresso.assertion.LayoutAssertions", "androidx.test.espresso.assertion.LayoutAssertions"], + ["android.support.test.espresso.assertion.PositionAssertions", "androidx.test.espresso.assertion.PositionAssertions"], + ["android.support.test.espresso.assertion.RemoteViewAssertions", "androidx.test.espresso.assertion.RemoteViewAssertions"], + ["android.support.test.espresso.assertion.ViewAssertions", "androidx.test.espresso.assertion.ViewAssertions"], + ["android.support.test.espresso.base.ActiveRootLister", "androidx.test.espresso.base.ActiveRootLister"], + ["android.support.test.espresso.base.AsyncTaskPoolMonitor", "androidx.test.espresso.base.AsyncTaskPoolMonitor"], + ["android.support.test.espresso.base.BaseLayerModule_FailureHandlerHolder_Factory", "androidx.test.espresso.base.BaseLayerModule_FailureHandlerHolder_Factory"], + ["android.support.test.espresso.base.BaseLayerModule_ProvideActiveRootListerFactory", "androidx.test.espresso.base.BaseLayerModule_ProvideActiveRootListerFactory"], + ["android.support.test.espresso.base.BaseLayerModule_ProvideCompatAsyncTaskMonitorFactory", "androidx.test.espresso.base.BaseLayerModule_ProvideCompatAsyncTaskMonitorFactory"], + ["android.support.test.espresso.base.BaseLayerModule_ProvideDynamicNotiferFactory", "androidx.test.espresso.base.BaseLayerModule_ProvideDynamicNotiferFactory"], + ["android.support.test.espresso.base.BaseLayerModule_ProvideEventInjectorFactory", "androidx.test.espresso.base.BaseLayerModule_ProvideEventInjectorFactory"], + ["android.support.test.espresso.base.BaseLayerModule_ProvideFailureHanderFactory", "androidx.test.espresso.base.BaseLayerModule_ProvideFailureHanderFactory"], + ["android.support.test.espresso.base.BaseLayerModule_ProvideFailureHandlerFactory", "androidx.test.espresso.base.BaseLayerModule_ProvideFailureHandlerFactory"], + ["android.support.test.espresso.base.BaseLayerModule_ProvideLifecycleMonitorFactory", "androidx.test.espresso.base.BaseLayerModule_ProvideLifecycleMonitorFactory"], + ["android.support.test.espresso.base.BaseLayerModule_ProvideMainLooperFactory", "androidx.test.espresso.base.BaseLayerModule_ProvideMainLooperFactory"], + ["android.support.test.espresso.base.BaseLayerModule_ProvideMainThreadExecutorFactory", "androidx.test.espresso.base.BaseLayerModule_ProvideMainThreadExecutorFactory"], + ["android.support.test.espresso.base.BaseLayerModule_ProvideRemoteExecutorFactory", "androidx.test.espresso.base.BaseLayerModule_ProvideRemoteExecutorFactory"], + ["android.support.test.espresso.base.BaseLayerModule_ProvideSdkAsyncTaskMonitorFactory", "androidx.test.espresso.base.BaseLayerModule_ProvideSdkAsyncTaskMonitorFactory"], + ["android.support.test.espresso.base.BaseLayerModule_ProvideTargetContextFactory", "androidx.test.espresso.base.BaseLayerModule_ProvideTargetContextFactory"], + ["android.support.test.espresso.base.BaseLayerModule", "androidx.test.espresso.base.BaseLayerModule"], + ["android.support.test.espresso.base.CompatAsyncTask", "androidx.test.espresso.base.CompatAsyncTask"], + ["android.support.test.espresso.base.Default", "androidx.test.espresso.base.Default"], + ["android.support.test.espresso.base.DefaultFailureHandler", "androidx.test.espresso.base.DefaultFailureHandler"], + ["android.support.test.espresso.base.EventInjectionStrategy", "androidx.test.espresso.base.EventInjectionStrategy"], + ["android.support.test.espresso.base.EventInjector", "androidx.test.espresso.base.EventInjector"], + ["android.support.test.espresso.base.IdleNotifier", "androidx.test.espresso.base.IdleNotifier"], + ["android.support.test.espresso.base.IdlingResourceRegistry_Factory", "androidx.test.espresso.base.IdlingResourceRegistry_Factory"], + ["android.support.test.espresso.base.IdlingResourceRegistry", "androidx.test.espresso.base.IdlingResourceRegistry"], + ["android.support.test.espresso.base.IdlingUiController", "androidx.test.espresso.base.IdlingUiController"], + ["android.support.test.espresso.base.InputManagerEventInjectionStrategy", "androidx.test.espresso.base.InputManagerEventInjectionStrategy"], + ["android.support.test.espresso.base.Interrogator", "androidx.test.espresso.base.Interrogator"], + ["android.support.test.espresso.base.InterruptableUiController", "androidx.test.espresso.base.InterruptableUiController"], + ["android.support.test.espresso.base.LooperIdlingResourceInterrogationHandler", "androidx.test.espresso.base.LooperIdlingResourceInterrogationHandler"], + ["android.support.test.espresso.base.MainThread", "androidx.test.espresso.base.MainThread"], + ["android.support.test.espresso.base.NoopIdleNotificationCallbackIdleNotifierProvider", "androidx.test.espresso.base.NoopIdleNotificationCallbackIdleNotifierProvider"], + ["android.support.test.espresso.base.NoopRunnableIdleNotifier", "androidx.test.espresso.base.NoopRunnableIdleNotifier"], + ["android.support.test.espresso.base.RootsOracle_Factory", "androidx.test.espresso.base.RootsOracle_Factory"], + ["android.support.test.espresso.base.RootsOracle", "androidx.test.espresso.base.RootsOracle"], + ["android.support.test.espresso.base.RootViewPicker_Factory", "androidx.test.espresso.base.RootViewPicker_Factory"], + ["android.support.test.espresso.base.RootViewPicker_RootResultFetcher_Factory", "androidx.test.espresso.base.RootViewPicker_RootResultFetcher_Factory"], + ["android.support.test.espresso.base.RootViewPicker", "androidx.test.espresso.base.RootViewPicker"], + ["android.support.test.espresso.base.RootViewPickerScope", "androidx.test.espresso.base.RootViewPickerScope"], + ["android.support.test.espresso.base.SdkAsyncTask", "androidx.test.espresso.base.SdkAsyncTask"], + ["android.support.test.espresso.base.ThreadPoolExecutorExtractor_Factory", "androidx.test.espresso.base.ThreadPoolExecutorExtractor_Factory"], + ["android.support.test.espresso.base.ThreadPoolExecutorExtractor", "androidx.test.espresso.base.ThreadPoolExecutorExtractor"], + ["android.support.test.espresso.base.UiControllerImpl_Factory", "androidx.test.espresso.base.UiControllerImpl_Factory"], + ["android.support.test.espresso.base.UiControllerImpl", "androidx.test.espresso.base.UiControllerImpl"], + ["android.support.test.espresso.base.UiControllerModule", "androidx.test.espresso.base.UiControllerModule"], + ["android.support.test.espresso.base.ViewFinderImpl_Factory", "androidx.test.espresso.base.ViewFinderImpl_Factory"], + ["android.support.test.espresso.base.ViewFinderImpl", "androidx.test.espresso.base.ViewFinderImpl"], + ["android.support.test.espresso.base.WindowManagerEventInjectionStrategy", "androidx.test.espresso.base.WindowManagerEventInjectionStrategy"], + ["android.support.test.espresso.BaseLayerComponent", "androidx.test.espresso.BaseLayerComponent"], + ["android.support.test.espresso.contrib.AccessibilityChecks", "androidx.test.espresso.contrib.AccessibilityChecks"], + ["android.support.test.espresso.contrib.ActivityResultMatchers", "androidx.test.espresso.contrib.ActivityResultMatchers"], + ["android.support.test.espresso.contrib.Checks", "androidx.test.espresso.contrib.Checks"], + ["android.support.test.espresso.contrib.DrawerActions", "androidx.test.espresso.contrib.DrawerActions"], + ["android.support.test.espresso.contrib.DrawerMatchers", "androidx.test.espresso.contrib.DrawerMatchers"], + ["android.support.test.espresso.contrib.NavigationViewActions", "androidx.test.espresso.contrib.NavigationViewActions"], + ["android.support.test.espresso.contrib.PickerActions", "androidx.test.espresso.contrib.PickerActions"], + ["android.support.test.espresso.contrib.RecyclerViewActions", "androidx.test.espresso.contrib.RecyclerViewActions"], + ["android.support.test.espresso.contrib.ViewPagerActions", "androidx.test.espresso.contrib.ViewPagerActions"], + ["android.support.test.espresso.DaggerBaseLayerComponent", "androidx.test.espresso.DaggerBaseLayerComponent"], + ["android.support.test.espresso.DataInteraction", "androidx.test.espresso.DataInteraction"], + ["android.support.test.espresso.DataInteractionRemote", "androidx.test.espresso.DataInteractionRemote"], + ["android.support.test.espresso.Espresso", "androidx.test.espresso.Espresso"], + ["android.support.test.espresso.EspressoException", "androidx.test.espresso.EspressoException"], + ["android.support.test.espresso.FailureHandler", "androidx.test.espresso.FailureHandler"], + ["android.support.test.espresso.GraphHolder", "androidx.test.espresso.GraphHolder"], + ["android.support.test.espresso.idling.concurrent.IdlingScheduledThreadPoolExecutor", "androidx.test.espresso.idling.concurrent.IdlingScheduledThreadPoolExecutor"], + ["android.support.test.espresso.idling.concurrent.IdlingThreadPoolExecutor", "androidx.test.espresso.idling.concurrent.IdlingThreadPoolExecutor"], + ["android.support.test.espresso.idling.CountingIdlingResource", "androidx.test.espresso.idling.CountingIdlingResource"], + ["android.support.test.espresso.idling.net.UriIdlingResource", "androidx.test.espresso.idling.net.UriIdlingResource"], + ["android.support.test.espresso.IdlingPolicies", "androidx.test.espresso.IdlingPolicies"], + ["android.support.test.espresso.IdlingPolicy", "androidx.test.espresso.IdlingPolicy"], + ["android.support.test.espresso.IdlingRegistry", "androidx.test.espresso.IdlingRegistry"], + ["android.support.test.espresso.IdlingResource", "androidx.test.espresso.IdlingResource"], + ["android.support.test.espresso.IdlingResourceTimeoutException", "androidx.test.espresso.IdlingResourceTimeoutException"], + ["android.support.test.espresso.InjectEventSecurityException", "androidx.test.espresso.InjectEventSecurityException"], + ["android.support.test.espresso.intent.ActivityResultFunction", "androidx.test.espresso.intent.ActivityResultFunction"], + ["android.support.test.espresso.intent.Checks", "androidx.test.espresso.intent.Checks"], + ["android.support.test.espresso.intent.Intents", "androidx.test.espresso.intent.Intents"], + ["android.support.test.espresso.intent.matcher.BundleMatchers", "androidx.test.espresso.intent.matcher.BundleMatchers"], + ["android.support.test.espresso.intent.matcher.ComponentNameMatchers", "androidx.test.espresso.intent.matcher.ComponentNameMatchers"], + ["android.support.test.espresso.intent.matcher.IntentMatchers", "androidx.test.espresso.intent.matcher.IntentMatchers"], + ["android.support.test.espresso.intent.matcher.UriMatchers", "androidx.test.espresso.intent.matcher.UriMatchers"], + ["android.support.test.espresso.intent.OngoingStubbing", "androidx.test.espresso.intent.OngoingStubbing"], + ["android.support.test.espresso.intent.ResettingStubber", "androidx.test.espresso.intent.ResettingStubber"], + ["android.support.test.espresso.intent.ResettingStubberImpl", "androidx.test.espresso.intent.ResettingStubberImpl"], + ["android.support.test.espresso.intent.ResolvedIntent", "androidx.test.espresso.intent.ResolvedIntent"], + ["android.support.test.espresso.intent.ResolvedIntentImpl", "androidx.test.espresso.intent.ResolvedIntentImpl"], + ["android.support.test.espresso.intent.rule.IntentsTestRule", "androidx.test.espresso.intent.rule.IntentsTestRule"], + ["android.support.test.espresso.intent.VerifiableIntent", "androidx.test.espresso.intent.VerifiableIntent"], + ["android.support.test.espresso.intent.VerifiableIntentImpl", "androidx.test.espresso.intent.VerifiableIntentImpl"], + ["android.support.test.espresso.intent.VerificationMode", "androidx.test.espresso.intent.VerificationMode"], + ["android.support.test.espresso.intent.VerificationModes", "androidx.test.espresso.intent.VerificationModes"], + ["android.support.test.espresso.InteractionResultsHandler", "androidx.test.espresso.InteractionResultsHandler"], + ["android.support.test.espresso.matcher.BoundedMatcher", "androidx.test.espresso.matcher.BoundedMatcher"], + ["android.support.test.espresso.matcher.CursorMatchers", "androidx.test.espresso.matcher.CursorMatchers"], + ["android.support.test.espresso.matcher.HasBackgroundMatcher", "androidx.test.espresso.matcher.HasBackgroundMatcher"], + ["android.support.test.espresso.matcher.LayoutMatchers", "androidx.test.espresso.matcher.LayoutMatchers"], + ["android.support.test.espresso.matcher.PreferenceMatchers", "androidx.test.espresso.matcher.PreferenceMatchers"], + ["android.support.test.espresso.matcher.RemoteHamcrestCoreMatchers13", "androidx.test.espresso.matcher.RemoteHamcrestCoreMatchers13"], + ["android.support.test.espresso.matcher.RemoteRootMatchers", "androidx.test.espresso.matcher.RemoteRootMatchers"], + ["android.support.test.espresso.matcher.RemoteViewMatchers", "androidx.test.espresso.matcher.RemoteViewMatchers"], + ["android.support.test.espresso.matcher.RootMatchers", "androidx.test.espresso.matcher.RootMatchers"], + ["android.support.test.espresso.matcher.ViewMatchers", "androidx.test.espresso.matcher.ViewMatchers"], + ["android.support.test.espresso.NoActivityResumedException", "androidx.test.espresso.NoActivityResumedException"], + ["android.support.test.espresso.NoMatchingRootException", "androidx.test.espresso.NoMatchingRootException"], + ["android.support.test.espresso.NoMatchingViewException", "androidx.test.espresso.NoMatchingViewException"], + ["android.support.test.espresso.PerformException", "androidx.test.espresso.PerformException"], + ["android.support.test.espresso.proto.action.ViewActions", "androidx.test.espresso.proto.action.ViewActions"], + ["android.support.test.espresso.proto.assertion.ViewAssertions", "androidx.test.espresso.proto.assertion.ViewAssertions"], + ["android.support.test.espresso.proto.matcher.RootMatchers", "androidx.test.espresso.proto.matcher.RootMatchers"], + ["android.support.test.espresso.proto.matcher.ViewMatchers", "androidx.test.espresso.proto.matcher.ViewMatchers"], + ["android.support.test.espresso.proto.matcher13.HamcrestMatchersv13", "androidx.test.espresso.proto.matcher13.HamcrestMatchersv13"], + ["android.support.test.espresso.proto.UiInteraction", "androidx.test.espresso.proto.UiInteraction"], + ["android.support.test.espresso.remote.annotation.RemoteMsgConstructor", "androidx.test.espresso.remote.annotation.RemoteMsgConstructor"], + ["android.support.test.espresso.remote.annotation.RemoteMsgField", "androidx.test.espresso.remote.annotation.RemoteMsgField"], + ["android.support.test.espresso.remote.AnyToTypeConverter", "androidx.test.espresso.remote.AnyToTypeConverter"], + ["android.support.test.espresso.remote.Bindable", "androidx.test.espresso.remote.Bindable"], + ["android.support.test.espresso.remote.BuilderReflector", "androidx.test.espresso.remote.BuilderReflector"], + ["android.support.test.espresso.remote.ByteStringToParcelableConverter", "androidx.test.espresso.remote.ByteStringToParcelableConverter"], + ["android.support.test.espresso.remote.ByteStringToTypeConverter", "androidx.test.espresso.remote.ByteStringToTypeConverter"], + ["android.support.test.espresso.remote.ConstructorInvocation", "androidx.test.espresso.remote.ConstructorInvocation"], + ["android.support.test.espresso.remote.Converter", "androidx.test.espresso.remote.Converter"], + ["android.support.test.espresso.remote.EspressoRemote", "androidx.test.espresso.remote.EspressoRemote"], + ["android.support.test.espresso.remote.EspressoRemoteMessage", "androidx.test.espresso.remote.EspressoRemoteMessage"], + ["android.support.test.espresso.remote.FieldDescriptor", "androidx.test.espresso.remote.FieldDescriptor"], + ["android.support.test.espresso.remote.GenericRemoteMessage", "androidx.test.espresso.remote.GenericRemoteMessage"], + ["android.support.test.espresso.remote.IInteractionExecutionStatus", "androidx.test.espresso.remote.IInteractionExecutionStatus"], + ["android.support.test.espresso.remote.InteractionRequest", "androidx.test.espresso.remote.InteractionRequest"], + ["android.support.test.espresso.remote.InteractionResponse", "androidx.test.espresso.remote.InteractionResponse"], + ["android.support.test.espresso.remote.MethodInvocation", "androidx.test.espresso.remote.MethodInvocation"], + ["android.support.test.espresso.remote.NoopRemoteInteraction", "androidx.test.espresso.remote.NoopRemoteInteraction"], + ["android.support.test.espresso.remote.NoRemoteEspressoInstanceException", "androidx.test.espresso.remote.NoRemoteEspressoInstanceException"], + ["android.support.test.espresso.remote.ParcelableToByteStringConverter", "androidx.test.espresso.remote.ParcelableToByteStringConverter"], + ["android.support.test.espresso.remote.ProtoReflector", "androidx.test.espresso.remote.ProtoReflector"], + ["android.support.test.espresso.remote.ProtoUtils", "androidx.test.espresso.remote.ProtoUtils"], + ["android.support.test.espresso.remote.RemoteDescriptor", "androidx.test.espresso.remote.RemoteDescriptor"], + ["android.support.test.espresso.remote.RemoteDescriptorRegistry", "androidx.test.espresso.remote.RemoteDescriptorRegistry"], + ["android.support.test.espresso.remote.RemoteEspressoException", "androidx.test.espresso.remote.RemoteEspressoException"], + ["android.support.test.espresso.remote.RemoteInteraction", "androidx.test.espresso.remote.RemoteInteraction"], + ["android.support.test.espresso.remote.RemoteInteractionRegistry", "androidx.test.espresso.remote.RemoteInteractionRegistry"], + ["android.support.test.espresso.remote.RemoteMessageDeserializer", "androidx.test.espresso.remote.RemoteMessageDeserializer"], + ["android.support.test.espresso.remote.RemoteMessageSerializer", "androidx.test.espresso.remote.RemoteMessageSerializer"], + ["android.support.test.espresso.remote.RemoteProtocolException", "androidx.test.espresso.remote.RemoteProtocolException"], + ["android.support.test.espresso.remote.TypeProtoConverters", "androidx.test.espresso.remote.TypeProtoConverters"], + ["android.support.test.espresso.remote.TypeToAnyConverter", "androidx.test.espresso.remote.TypeToAnyConverter"], + ["android.support.test.espresso.remote.TypeToByteStringConverter", "androidx.test.espresso.remote.TypeToByteStringConverter"], + ["android.support.test.espresso.Root", "androidx.test.espresso.Root"], + ["android.support.test.espresso.UiController", "androidx.test.espresso.UiController"], + ["android.support.test.espresso.util.ActivityLifecycles", "androidx.test.espresso.util.ActivityLifecycles"], + ["android.support.test.espresso.util.EspressoOptional", "androidx.test.espresso.util.EspressoOptional"], + ["android.support.test.espresso.util.HumanReadables", "androidx.test.espresso.util.HumanReadables"], + ["android.support.test.espresso.util.TreeIterables", "androidx.test.espresso.util.TreeIterables"], + ["android.support.test.espresso.ViewAction", "androidx.test.espresso.ViewAction"], + ["android.support.test.espresso.ViewAssertion", "androidx.test.espresso.ViewAssertion"], + ["android.support.test.espresso.ViewFinder", "androidx.test.espresso.ViewFinder"], + ["android.support.test.espresso.ViewInteraction_Factory", "androidx.test.espresso.ViewInteraction_Factory"], + ["android.support.test.espresso.ViewInteraction", "androidx.test.espresso.ViewInteraction"], + ["android.support.test.espresso.ViewInteractionComponent", "androidx.test.espresso.ViewInteractionComponent"], + ["android.support.test.espresso.ViewInteractionModule_ProvideNeedsActivityFactory", "androidx.test.espresso.ViewInteractionModule_ProvideNeedsActivityFactory"], + ["android.support.test.espresso.ViewInteractionModule_ProvideRemoteInteractionFactory", "androidx.test.espresso.ViewInteractionModule_ProvideRemoteInteractionFactory"], + ["android.support.test.espresso.ViewInteractionModule_ProvideRootMatcherFactory", "androidx.test.espresso.ViewInteractionModule_ProvideRootMatcherFactory"], + ["android.support.test.espresso.ViewInteractionModule_ProvideRootViewFactory", "androidx.test.espresso.ViewInteractionModule_ProvideRootViewFactory"], + ["android.support.test.espresso.ViewInteractionModule_ProvideViewFinderFactory", "androidx.test.espresso.ViewInteractionModule_ProvideViewFinderFactory"], + ["android.support.test.espresso.ViewInteractionModule_ProvideViewMatcherFactory", "androidx.test.espresso.ViewInteractionModule_ProvideViewMatcherFactory"], + ["android.support.test.espresso.ViewInteractionModule", "androidx.test.espresso.ViewInteractionModule"], + ["android.support.test.espresso.web.action.AtomAction", "androidx.test.espresso.web.action.AtomAction"], + ["android.support.test.espresso.web.action.AtomActionRemoteMessage", "androidx.test.espresso.web.action.AtomActionRemoteMessage"], + ["android.support.test.espresso.web.action.EnableJavascriptAction", "androidx.test.espresso.web.action.EnableJavascriptAction"], + ["android.support.test.espresso.web.action.EvaluationAtom", "androidx.test.espresso.web.action.EvaluationAtom"], + ["android.support.test.espresso.web.action.IAtomActionResultPropagator", "androidx.test.espresso.web.action.IAtomActionResultPropagator"], + ["android.support.test.espresso.web.action.JavascriptEvaluation", "androidx.test.espresso.web.action.JavascriptEvaluation"], + ["android.support.test.espresso.web.action.RemoteWebActions", "androidx.test.espresso.web.action.RemoteWebActions"], + ["android.support.test.espresso.web.assertion.ByteStringToDocumentConverter", "androidx.test.espresso.web.assertion.ByteStringToDocumentConverter"], + ["android.support.test.espresso.web.assertion.CheckResultWebAssertionRemoteMessage", "androidx.test.espresso.web.assertion.CheckResultWebAssertionRemoteMessage"], + ["android.support.test.espresso.web.assertion.CompressorDecompressor", "androidx.test.espresso.web.assertion.CompressorDecompressor"], + ["android.support.test.espresso.web.assertion.DocumentProtoConverters", "androidx.test.espresso.web.assertion.DocumentProtoConverters"], + ["android.support.test.espresso.web.assertion.DocumentToByteStringConverter", "androidx.test.espresso.web.assertion.DocumentToByteStringConverter"], + ["android.support.test.espresso.web.assertion.RemoteWebViewAssertions", "androidx.test.espresso.web.assertion.RemoteWebViewAssertions"], + ["android.support.test.espresso.web.assertion.TagSoupDocumentParser", "androidx.test.espresso.web.assertion.TagSoupDocumentParser"], + ["android.support.test.espresso.web.assertion.WebAssertion", "androidx.test.espresso.web.assertion.WebAssertion"], + ["android.support.test.espresso.web.assertion.WebViewAssertions", "androidx.test.espresso.web.assertion.WebViewAssertions"], + ["android.support.test.espresso.web.matcher.AmbiguousElementMatcherException", "androidx.test.espresso.web.matcher.AmbiguousElementMatcherException"], + ["android.support.test.espresso.web.matcher.DomMatchers", "androidx.test.espresso.web.matcher.DomMatchers"], + ["android.support.test.espresso.web.matcher.RemoteWebMatchers", "androidx.test.espresso.web.matcher.RemoteWebMatchers"], + ["android.support.test.espresso.web.model.Atom", "androidx.test.espresso.web.model.Atom"], + ["android.support.test.espresso.web.model.Atoms", "androidx.test.espresso.web.model.Atoms"], + ["android.support.test.espresso.web.model.ElementReference", "androidx.test.espresso.web.model.ElementReference"], + ["android.support.test.espresso.web.model.Evaluation", "androidx.test.espresso.web.model.Evaluation"], + ["android.support.test.espresso.web.model.JSONAble", "androidx.test.espresso.web.model.JSONAble"], + ["android.support.test.espresso.web.model.ModelCodec", "androidx.test.espresso.web.model.ModelCodec"], + ["android.support.test.espresso.web.model.RemoteWebModelAtoms", "androidx.test.espresso.web.model.RemoteWebModelAtoms"], + ["android.support.test.espresso.web.model.ScriptWithArgsSimpleAtomRemoteMessage", "androidx.test.espresso.web.model.ScriptWithArgsSimpleAtomRemoteMessage"], + ["android.support.test.espresso.web.model.SimpleAtom", "androidx.test.espresso.web.model.SimpleAtom"], + ["android.support.test.espresso.web.model.TransformingAtom", "androidx.test.espresso.web.model.TransformingAtom"], + ["android.support.test.espresso.web.model.WindowReference", "androidx.test.espresso.web.model.WindowReference"], + ["android.support.test.espresso.web.proto.action.WebActions", "androidx.test.espresso.web.proto.action.WebActions"], + ["android.support.test.espresso.web.proto.assertion.WebAssertions", "androidx.test.espresso.web.proto.assertion.WebAssertions"], + ["android.support.test.espresso.web.proto.matcher.RemoteWebMatchers", "androidx.test.espresso.web.proto.matcher.RemoteWebMatchers"], + ["android.support.test.espresso.web.proto.model.WebModelAtoms", "androidx.test.espresso.web.proto.model.WebModelAtoms"], + ["android.support.test.espresso.web.proto.sugar.WebSugar", "androidx.test.espresso.web.proto.sugar.WebSugar"], + ["android.support.test.espresso.web.proto.webdriver.WebWebdriverAtoms", "androidx.test.espresso.web.proto.webdriver.WebWebdriverAtoms"], + ["android.support.test.espresso.web.sugar.RemoteWebSugar", "androidx.test.espresso.web.sugar.RemoteWebSugar"], + ["android.support.test.espresso.web.sugar.Web", "androidx.test.espresso.web.sugar.Web"], + ["android.support.test.espresso.web.webdriver.DriverAtoms", "androidx.test.espresso.web.webdriver.DriverAtoms"], + ["android.support.test.espresso.web.webdriver.Locator", "androidx.test.espresso.web.webdriver.Locator"], + ["android.support.test.espresso.web.webdriver.RemoteWebDriverAtoms", "androidx.test.espresso.web.webdriver.RemoteWebDriverAtoms"], + ["android.support.test.espresso.web.webdriver.WebDriverAtomScripts", "androidx.test.espresso.web.webdriver.WebDriverAtomScripts"], + ["android.support.test.filters.FlakyTest", "androidx.test.filters.FlakyTest"], + ["android.support.test.filters.LargeTest", "androidx.test.filters.LargeTest"], + ["android.support.test.filters.MediumTest", "androidx.test.filters.MediumTest"], + ["android.support.test.filters.RequiresDevice", "androidx.test.filters.RequiresDevice"], + ["android.support.test.filters.SdkSuppress", "androidx.test.filters.SdkSuppress"], + ["android.support.test.filters.SmallTest", "androidx.test.filters.SmallTest"], + ["android.support.test.filters.Suppress", "androidx.test.filters.Suppress"], + ["android.support.test.InstrumentationRegistry", "androidx.test.InstrumentationRegistry"], + ["android.support.test.jank.GfxMonitor", "androidx.test.jank.GfxMonitor"], + ["android.support.test.jank.JankTest", "androidx.test.jank.JankTest"], + ["android.support.test.jank.JankTestBase", "androidx.test.jank.JankTestBase"], + ["android.support.test.jank.WindowAnimationFrameStatsMonitor", "androidx.test.jank.WindowAnimationFrameStatsMonitor"], + ["android.support.test.jank.WindowContentFrameStatsMonitor", "androidx.test.jank.WindowContentFrameStatsMonitor"], + ["android.support.test.orchestrator.callback.OrchestratorCallback", "androidx.test.orchestrator.callback.OrchestratorCallback"], + ["android.support.test.orchestrator.instrumentationlistener.OrchestratedInstrumentationListener", "androidx.test.orchestrator.instrumentationlistener.OrchestratedInstrumentationListener"], + ["android.support.test.orchestrator.junit.BundleJUnitUtils", "androidx.test.orchestrator.junit.BundleJUnitUtils"], + ["android.support.test.orchestrator.junit.ParcelableDescription", "androidx.test.orchestrator.junit.ParcelableDescription"], + ["android.support.test.orchestrator.junit.ParcelableFailure", "androidx.test.orchestrator.junit.ParcelableFailure"], + ["android.support.test.orchestrator.junit.ParcelableResult", "androidx.test.orchestrator.junit.ParcelableResult"], + ["android.support.test.orchestrator.listeners.OrchestrationListenerManager", "androidx.test.orchestrator.listeners.OrchestrationListenerManager"], + ["android.support.test.orchestrator.listeners.OrchestrationRunListener", "androidx.test.orchestrator.listeners.OrchestrationRunListener"], + ["android.support.test.orchestrator.listeners.result.ITestRunListener", "androidx.test.orchestrator.listeners.result.ITestRunListener"], + ["android.support.test.orchestrator.listeners.result.TestIdentifier", "androidx.test.orchestrator.listeners.result.TestIdentifier"], + ["android.support.test.orchestrator.listeners.result.TestResult", "androidx.test.orchestrator.listeners.result.TestResult"], + ["android.support.test.orchestrator.listeners.result.TestRunResult", "androidx.test.orchestrator.listeners.result.TestRunResult"], + ["android.support.test.rule.ActivityTestRule", "androidx.test.rule.ActivityTestRule"], + ["android.support.test.rule.DisableOnAndroidDebug", "androidx.test.rule.DisableOnAndroidDebug"], + ["android.support.test.rule.GrantPermissionRule", "androidx.test.rule.GrantPermissionRule"], + ["android.support.test.rule.logging.AtraceLogger", "androidx.test.rule.logging.AtraceLogger"], + ["android.support.test.rule.PortForwardingRule", "androidx.test.rule.PortForwardingRule"], + ["android.support.test.rule.provider.DatabaseArgs", "androidx.test.rule.provider.DatabaseArgs"], + ["android.support.test.rule.provider.DelegatingContext", "androidx.test.rule.provider.DelegatingContext"], + ["android.support.test.rule.provider.ProviderArgs", "androidx.test.rule.provider.ProviderArgs"], + ["android.support.test.rule.provider.ProviderTestRule", "androidx.test.rule.provider.ProviderTestRule"], + ["android.support.test.rule.ServiceTestRule", "androidx.test.rule.ServiceTestRule"], + ["android.support.test.rule.UiThreadTestRule", "androidx.test.rule.UiThreadTestRule"], + ["android.support.test.runner.AndroidJUnit4", "androidx.test.runner.AndroidJUnit4"], + ["android.support.test.runner.AndroidJUnitRunner", "androidx.test.runner.AndroidJUnitRunner"], + ["android.support.test.runner.intent.IntentCallback", "androidx.test.runner.intent.IntentCallback"], + ["android.support.test.runner.intent.IntentMonitor", "androidx.test.runner.intent.IntentMonitor"], + ["android.support.test.runner.intent.IntentMonitorRegistry", "androidx.test.runner.intent.IntentMonitorRegistry"], + ["android.support.test.runner.intent.IntentStubber", "androidx.test.runner.intent.IntentStubber"], + ["android.support.test.runner.intent.IntentStubberRegistry", "androidx.test.runner.intent.IntentStubberRegistry"], + ["android.support.test.runner.intercepting.InterceptingActivityFactory", "androidx.test.runner.intercepting.InterceptingActivityFactory"], + ["android.support.test.runner.intercepting.SingleActivityFactory", "androidx.test.runner.intercepting.SingleActivityFactory"], + ["android.support.test.runner.lifecycle.ActivityLifecycleCallback", "androidx.test.runner.lifecycle.ActivityLifecycleCallback"], + ["android.support.test.runner.lifecycle.ActivityLifecycleMonitor", "androidx.test.runner.lifecycle.ActivityLifecycleMonitor"], + ["android.support.test.runner.lifecycle.ActivityLifecycleMonitorRegistry", "androidx.test.runner.lifecycle.ActivityLifecycleMonitorRegistry"], + ["android.support.test.runner.lifecycle.ApplicationLifecycleCallback", "androidx.test.runner.lifecycle.ApplicationLifecycleCallback"], + ["android.support.test.runner.lifecycle.ApplicationLifecycleMonitor", "androidx.test.runner.lifecycle.ApplicationLifecycleMonitor"], + ["android.support.test.runner.lifecycle.ApplicationLifecycleMonitorRegistry", "androidx.test.runner.lifecycle.ApplicationLifecycleMonitorRegistry"], + ["android.support.test.runner.lifecycle.ApplicationStage", "androidx.test.runner.lifecycle.ApplicationStage"], + ["android.support.test.runner.lifecycle.Stage", "androidx.test.runner.lifecycle.Stage"], + ["android.support.test.runner.MonitoringInstrumentation", "androidx.test.runner.MonitoringInstrumentation"], + ["android.support.test.runner.permission.GrantPermissionCallable", "androidx.test.runner.permission.GrantPermissionCallable"], + ["android.support.test.runner.permission.PermissionRequester", "androidx.test.runner.permission.PermissionRequester"], + ["android.support.test.runner.permission.RequestPermissionCallable", "androidx.test.runner.permission.RequestPermissionCallable"], + ["android.support.test.runner.permission.ShellCommand", "androidx.test.runner.permission.ShellCommand"], + ["android.support.test.runner.permission.UiAutomationShellCommand", "androidx.test.runner.permission.UiAutomationShellCommand"], + ["android.support.test.runner.screenshot.BasicScreenCaptureProcessor", "androidx.test.runner.screenshot.BasicScreenCaptureProcessor"], + ["android.support.test.runner.screenshot.ScreenCapture", "androidx.test.runner.screenshot.ScreenCapture"], + ["android.support.test.runner.screenshot.ScreenCaptureProcessor", "androidx.test.runner.screenshot.ScreenCaptureProcessor"], + ["android.support.test.runner.screenshot.Screenshot", "androidx.test.runner.screenshot.Screenshot"], + ["android.support.test.runner.screenshot.TakeScreenshotCallable", "androidx.test.runner.screenshot.TakeScreenshotCallable"], + ["android.support.test.runner.screenshot.UiAutomationWrapper", "androidx.test.runner.screenshot.UiAutomationWrapper"], + ["android.support.test.runner.UsageTrackerFacilitator", "androidx.test.runner.UsageTrackerFacilitator"], + ["android.support.test.uiautomator.AccessibilityNodeInfoDumper", "androidx.test.uiautomator.AccessibilityNodeInfoDumper"], + ["android.support.test.uiautomator.AccessibilityNodeInfoHelper", "androidx.test.uiautomator.AccessibilityNodeInfoHelper"], + ["android.support.test.uiautomator.By", "androidx.test.uiautomator.By"], + ["android.support.test.uiautomator.ByMatcher", "androidx.test.uiautomator.ByMatcher"], + ["android.support.test.uiautomator.BySelector", "androidx.test.uiautomator.BySelector"], + ["android.support.test.uiautomator.Condition", "androidx.test.uiautomator.Condition"], + ["android.support.test.uiautomator.Configurator", "androidx.test.uiautomator.Configurator"], + ["android.support.test.uiautomator.Direction", "androidx.test.uiautomator.Direction"], + ["android.support.test.uiautomator.EventCondition", "androidx.test.uiautomator.EventCondition"], + ["android.support.test.uiautomator.GestureController", "androidx.test.uiautomator.GestureController"], + ["android.support.test.uiautomator.Gestures", "androidx.test.uiautomator.Gestures"], + ["android.support.test.uiautomator.IAutomationSupport", "androidx.test.uiautomator.IAutomationSupport"], + ["android.support.test.uiautomator.InstrumentationAutomationSupport", "androidx.test.uiautomator.InstrumentationAutomationSupport"], + ["android.support.test.uiautomator.InteractionController", "androidx.test.uiautomator.InteractionController"], + ["android.support.test.uiautomator.PointerGesture", "androidx.test.uiautomator.PointerGesture"], + ["android.support.test.uiautomator.QueryController", "androidx.test.uiautomator.QueryController"], + ["android.support.test.uiautomator.Searchable", "androidx.test.uiautomator.Searchable"], + ["android.support.test.uiautomator.SearchCondition", "androidx.test.uiautomator.SearchCondition"], + ["android.support.test.uiautomator.StaleObjectException", "androidx.test.uiautomator.StaleObjectException"], + ["android.support.test.uiautomator.Tracer", "androidx.test.uiautomator.Tracer"], + ["android.support.test.uiautomator.UiAutomatorInstrumentationTestRunner", "androidx.test.uiautomator.UiAutomatorInstrumentationTestRunner"], + ["android.support.test.uiautomator.UiAutomatorTestCase", "androidx.test.uiautomator.UiAutomatorTestCase"], + ["android.support.test.uiautomator.UiCollection", "androidx.test.uiautomator.UiCollection"], + ["android.support.test.uiautomator.UiDevice", "androidx.test.uiautomator.UiDevice"], + ["android.support.test.uiautomator.UiObject2", "androidx.test.uiautomator.UiObject2"], + ["android.support.test.uiautomator.UiObject2Condition", "androidx.test.uiautomator.UiObject2Condition"], + ["android.support.test.uiautomator.UiObject", "androidx.test.uiautomator.UiObject"], + ["android.support.test.uiautomator.UiObjectNotFoundException", "androidx.test.uiautomator.UiObjectNotFoundException"], + ["android.support.test.uiautomator.UiScrollable", "androidx.test.uiautomator.UiScrollable"], + ["android.support.test.uiautomator.UiSelector", "androidx.test.uiautomator.UiSelector"], + ["android.support.test.uiautomator.UiWatcher", "androidx.test.uiautomator.UiWatcher"], + ["android.support.test.uiautomator.Until", "androidx.test.uiautomator.Until"], + ["android.support.test.uiautomator.WaitMixin", "androidx.test.uiautomator.WaitMixin"], + ["android.support.text.emoji.bundled.BundledEmojiCompatConfig", "androidx.emoji.bundled.BundledEmojiCompatConfig"], + ["android.support.text.emoji.EmojiCompat", "androidx.emoji.text.EmojiCompat"], + ["android.support.text.emoji.EmojiMetadata", "androidx.emoji.text.EmojiMetadata"], + ["android.support.text.emoji.EmojiProcessor", "androidx.emoji.text.EmojiProcessor"], + ["android.support.text.emoji.EmojiSpan", "androidx.emoji.text.EmojiSpan"], + ["android.support.text.emoji.FontRequestEmojiCompatConfig", "androidx.emoji.text.FontRequestEmojiCompatConfig"], + ["android.support.text.emoji.MetadataListReader", "androidx.emoji.text.MetadataListReader"], + ["android.support.text.emoji.MetadataRepo", "androidx.emoji.text.MetadataRepo"], + ["android.support.text.emoji.R", "androidx.emoji.R"], + ["android.support.text.emoji.TypefaceEmojiSpan", "androidx.emoji.text.TypefaceEmojiSpan"], + ["android.support.text.emoji.widget.EditTextAttributeHelper", "androidx.emoji.widget.EditTextAttributeHelper"], + ["android.support.text.emoji.widget.EmojiAppCompatButton", "androidx.emoji.widget.EmojiAppCompatButton"], + ["android.support.text.emoji.widget.EmojiAppCompatEditText", "androidx.emoji.widget.EmojiAppCompatEditText"], + ["android.support.text.emoji.widget.EmojiAppCompatTextView", "androidx.emoji.widget.EmojiAppCompatTextView"], + ["android.support.text.emoji.widget.EmojiButton", "androidx.emoji.widget.EmojiButton"], + ["android.support.text.emoji.widget.EmojiEditableFactory", "androidx.emoji.widget.EmojiEditableFactory"], + ["android.support.text.emoji.widget.EmojiEditText", "androidx.emoji.widget.EmojiEditText"], + ["android.support.text.emoji.widget.EmojiEditTextHelper", "androidx.emoji.widget.EmojiEditTextHelper"], + ["android.support.text.emoji.widget.EmojiExtractEditText", "androidx.emoji.widget.EmojiExtractEditText"], + ["android.support.text.emoji.widget.EmojiExtractTextLayout", "androidx.emoji.widget.EmojiExtractTextLayout"], + ["android.support.text.emoji.widget.EmojiInputConnection", "androidx.emoji.widget.EmojiInputConnection"], + ["android.support.text.emoji.widget.EmojiInputFilter", "androidx.emoji.widget.EmojiInputFilter"], + ["android.support.text.emoji.widget.EmojiKeyListener", "androidx.emoji.widget.EmojiKeyListener"], + ["android.support.text.emoji.widget.EmojiTextView", "androidx.emoji.widget.EmojiTextView"], + ["android.support.text.emoji.widget.EmojiTextViewHelper", "androidx.emoji.widget.EmojiTextViewHelper"], + ["android.support.text.emoji.widget.EmojiTextWatcher", "androidx.emoji.widget.EmojiTextWatcher"], + ["android.support.text.emoji.widget.EmojiTransformationMethod", "androidx.emoji.widget.EmojiTransformationMethod"], + ["android.support.text.emoji.widget.ExtractButtonCompat", "androidx.emoji.widget.ExtractButtonCompat"], + ["android.support.text.emoji.widget.SpannableBuilder", "androidx.emoji.widget.SpannableBuilder"], + ["android.support.transition.AnimatorUtils", "androidx.transition.AnimatorUtils"], + ["android.support.transition.ArcMotion", "androidx.transition.ArcMotion"], + ["android.support.transition.AutoTransition", "androidx.transition.AutoTransition"], + ["android.support.transition.ChangeBounds", "androidx.transition.ChangeBounds"], + ["android.support.transition.ChangeClipBounds", "androidx.transition.ChangeClipBounds"], + ["android.support.transition.ChangeImageTransform", "androidx.transition.ChangeImageTransform"], + ["android.support.transition.ChangeScroll", "androidx.transition.ChangeScroll"], + ["android.support.transition.ChangeTransform", "androidx.transition.ChangeTransform"], + ["android.support.transition.CircularPropagation", "androidx.transition.CircularPropagation"], + ["android.support.transition.Explode", "androidx.transition.Explode"], + ["android.support.transition.Fade", "androidx.transition.Fade"], + ["android.support.transition.FloatArrayEvaluator", "androidx.transition.FloatArrayEvaluator"], + ["android.support.transition.FragmentTransitionSupport", "androidx.transition.FragmentTransitionSupport"], + ["android.support.transition.GhostViewApi14", "androidx.transition.GhostViewApi14"], + ["android.support.transition.GhostViewApi21", "androidx.transition.GhostViewApi21"], + ["android.support.transition.GhostViewImpl", "androidx.transition.GhostViewImpl"], + ["android.support.transition.GhostViewUtils", "androidx.transition.GhostViewUtils"], + ["android.support.transition.ImageViewUtils", "androidx.transition.ImageViewUtils"], + ["android.support.transition.MatrixUtils", "androidx.transition.MatrixUtils"], + ["android.support.transition.ObjectAnimatorUtils", "androidx.transition.ObjectAnimatorUtils"], + ["android.support.transition.PathMotion", "androidx.transition.PathMotion"], + ["android.support.transition.PathProperty", "androidx.transition.PathProperty"], + ["android.support.transition.PatternPathMotion", "androidx.transition.PatternPathMotion"], + ["android.support.transition.PropertyValuesHolderUtils", "androidx.transition.PropertyValuesHolderUtils"], + ["android.support.transition.R", "androidx.transition.R"], + ["android.support.transition.RectEvaluator", "androidx.transition.RectEvaluator"], + ["android.support.transition.Scene", "androidx.transition.Scene"], + ["android.support.transition.SidePropagation", "androidx.transition.SidePropagation"], + ["android.support.transition.Slide", "androidx.transition.Slide"], + ["android.support.transition.Styleable", "androidx.transition.Styleable"], + ["android.support.transition.Transition", "androidx.transition.Transition"], + ["android.support.transition.TransitionInflater", "androidx.transition.TransitionInflater"], + ["android.support.transition.TransitionListenerAdapter", "androidx.transition.TransitionListenerAdapter"], + ["android.support.transition.TransitionManager", "androidx.transition.TransitionManager"], + ["android.support.transition.TransitionPropagation", "androidx.transition.TransitionPropagation"], + ["android.support.transition.TransitionSet", "androidx.transition.TransitionSet"], + ["android.support.transition.TransitionUtils", "androidx.transition.TransitionUtils"], + ["android.support.transition.TransitionValues", "androidx.transition.TransitionValues"], + ["android.support.transition.TransitionValuesMaps", "androidx.transition.TransitionValuesMaps"], + ["android.support.transition.TranslationAnimationCreator", "androidx.transition.TranslationAnimationCreator"], + ["android.support.transition.ViewGroupOverlayApi14", "androidx.transition.ViewGroupOverlayApi14"], + ["android.support.transition.ViewGroupOverlayApi18", "androidx.transition.ViewGroupOverlayApi18"], + ["android.support.transition.ViewGroupOverlayImpl", "androidx.transition.ViewGroupOverlayImpl"], + ["android.support.transition.ViewGroupUtils", "androidx.transition.ViewGroupUtils"], + ["android.support.transition.ViewGroupUtilsApi14", "androidx.transition.ViewGroupUtilsApi14"], + ["android.support.transition.ViewGroupUtilsApi18", "androidx.transition.ViewGroupUtilsApi18"], + ["android.support.transition.ViewOverlayApi14", "androidx.transition.ViewOverlayApi14"], + ["android.support.transition.ViewOverlayApi18", "androidx.transition.ViewOverlayApi18"], + ["android.support.transition.ViewOverlayImpl", "androidx.transition.ViewOverlayImpl"], + ["android.support.transition.ViewUtils", "androidx.transition.ViewUtils"], + ["android.support.transition.ViewUtilsApi19", "androidx.transition.ViewUtilsApi19"], + ["android.support.transition.ViewUtilsApi21", "androidx.transition.ViewUtilsApi21"], + ["android.support.transition.ViewUtilsApi22", "androidx.transition.ViewUtilsApi22"], + ["android.support.transition.ViewUtilsBase", "androidx.transition.ViewUtilsBase"], + ["android.support.transition.Visibility", "androidx.transition.Visibility"], + ["android.support.transition.VisibilityPropagation", "androidx.transition.VisibilityPropagation"], + ["android.support.transition.WindowIdApi14", "androidx.transition.WindowIdApi14"], + ["android.support.transition.WindowIdApi18", "androidx.transition.WindowIdApi18"], + ["android.support.transition.WindowIdImpl", "androidx.transition.WindowIdImpl"], + ["android.support.v13.app.ActivityCompat", "androidx.legacy.app.ActivityCompat"], + ["android.support.v13.app.FragmentCompat", "androidx.legacy.app.FragmentCompat"], + ["android.support.v13.app.FragmentPagerAdapter", "androidx.legacy.app.FragmentPagerAdapter"], + ["android.support.v13.app.FragmentStatePagerAdapter", "androidx.legacy.app.FragmentStatePagerAdapter"], + ["android.support.v13.app.FragmentTabHost", "androidx.legacy.app.FragmentTabHost"], + ["android.support.v13.view.DragAndDropPermissionsCompat", "androidx.core.view.DragAndDropPermissionsCompat"], + ["android.support.v13.view.DragStartHelper", "androidx.core.view.DragStartHelper"], + ["android.support.v13.view.inputmethod.EditorInfoCompat", "androidx.core.view.inputmethod.EditorInfoCompat"], + ["android.support.v13.view.inputmethod.InputConnectionCompat", "androidx.core.view.inputmethod.InputConnectionCompat"], + ["android.support.v13.view.inputmethod.InputContentInfoCompat", "androidx.core.view.inputmethod.InputContentInfoCompat"], + ["android.support.v13.view.ViewCompat", "androidx.legacy.view.ViewCompat"], + ["android.support.v14.preference.EditTextPreferenceDialogFragment", "androidx.preference.EditTextPreferenceDialogFragment"], + ["android.support.v14.preference.ListPreferenceDialogFragment", "androidx.preference.ListPreferenceDialogFragment"], + ["android.support.v14.preference.MultiSelectListPreference", "androidx.preference.MultiSelectListPreference"], + ["android.support.v14.preference.MultiSelectListPreferenceDialogFragment", "androidx.preference.MultiSelectListPreferenceDialogFragment"], + ["android.support.v14.preference.PreferenceDialogFragment", "androidx.preference.PreferenceDialogFragment"], + ["android.support.v14.preference.PreferenceFragment", "androidx.preference.PreferenceFragment"], + ["android.support.v14.preference.SwitchPreference", "androidx.preference.SwitchPreference"], + ["android.support.v17.internal.widget.OutlineOnlyWithChildrenFrameLayout", "androidx.leanback.preference.internal.OutlineOnlyWithChildrenFrameLayout"], + ["android.support.v17.leanback.animation.LogAccelerateInterpolator", "androidx.leanback.animation.LogAccelerateInterpolator"], + ["android.support.v17.leanback.animation.LogDecelerateInterpolator", "androidx.leanback.animation.LogDecelerateInterpolator"], + ["android.support.v17.leanback.app.BackgroundFragment", "androidx.leanback.app.BackgroundFragment"], + ["android.support.v17.leanback.app.BackgroundManager", "androidx.leanback.app.BackgroundManager"], + ["android.support.v17.leanback.app.BaseFragment", "androidx.leanback.app.BaseFragment"], + ["android.support.v17.leanback.app.BaseRowFragment", "androidx.leanback.app.BaseRowFragment"], + ["android.support.v17.leanback.app.BaseRowSupportFragment", "androidx.leanback.app.BaseRowSupportFragment"], + ["android.support.v17.leanback.app.BaseSupportFragment", "androidx.leanback.app.BaseSupportFragment"], + ["android.support.v17.leanback.app.BrandedFragment", "androidx.leanback.app.BrandedFragment"], + ["android.support.v17.leanback.app.BrandedSupportFragment", "androidx.leanback.app.BrandedSupportFragment"], + ["android.support.v17.leanback.app.BrowseFragment", "androidx.leanback.app.BrowseFragment"], + ["android.support.v17.leanback.app.BrowseSupportFragment", "androidx.leanback.app.BrowseSupportFragment"], + ["android.support.v17.leanback.app.DetailsBackgroundVideoHelper", "androidx.leanback.app.DetailsBackgroundVideoHelper"], + ["android.support.v17.leanback.app.DetailsFragment", "androidx.leanback.app.DetailsFragment"], + ["android.support.v17.leanback.app.DetailsFragmentBackgroundController", "androidx.leanback.app.DetailsFragmentBackgroundController"], + ["android.support.v17.leanback.app.DetailsSupportFragment", "androidx.leanback.app.DetailsSupportFragment"], + ["android.support.v17.leanback.app.DetailsSupportFragmentBackgroundController", "androidx.leanback.app.DetailsSupportFragmentBackgroundController"], + ["android.support.v17.leanback.app.ErrorFragment", "androidx.leanback.app.ErrorFragment"], + ["android.support.v17.leanback.app.ErrorSupportFragment", "androidx.leanback.app.ErrorSupportFragment"], + ["android.support.v17.leanback.app.FragmentUtil", "androidx.leanback.app.FragmentUtil"], + ["android.support.v17.leanback.app.GuidedStepFragment", "androidx.leanback.app.GuidedStepFragment"], + ["android.support.v17.leanback.app.GuidedStepRootLayout", "androidx.leanback.app.GuidedStepRootLayout"], + ["android.support.v17.leanback.app.GuidedStepSupportFragment", "androidx.leanback.app.GuidedStepSupportFragment"], + ["android.support.v17.leanback.app.HeadersFragment", "androidx.leanback.app.HeadersFragment"], + ["android.support.v17.leanback.app.HeadersSupportFragment", "androidx.leanback.app.HeadersSupportFragment"], + ["android.support.v17.leanback.app.ListRowDataAdapter", "androidx.leanback.app.ListRowDataAdapter"], + ["android.support.v17.leanback.app.OnboardingFragment", "androidx.leanback.app.OnboardingFragment"], + ["android.support.v17.leanback.app.OnboardingSupportFragment", "androidx.leanback.app.OnboardingSupportFragment"], + ["android.support.v17.leanback.app.PermissionHelper", "androidx.leanback.app.PermissionHelper"], + ["android.support.v17.leanback.app.PlaybackFragment", "androidx.leanback.app.PlaybackFragment"], + ["android.support.v17.leanback.app.PlaybackFragmentGlueHost", "androidx.leanback.app.PlaybackFragmentGlueHost"], + ["android.support.v17.leanback.app.PlaybackSupportFragment", "androidx.leanback.app.PlaybackSupportFragment"], + ["android.support.v17.leanback.app.PlaybackSupportFragmentGlueHost", "androidx.leanback.app.PlaybackSupportFragmentGlueHost"], + ["android.support.v17.leanback.app.ProgressBarManager", "androidx.leanback.app.ProgressBarManager"], + ["android.support.v17.leanback.app.RowsFragment", "androidx.leanback.app.RowsFragment"], + ["android.support.v17.leanback.app.RowsSupportFragment", "androidx.leanback.app.RowsSupportFragment"], + ["android.support.v17.leanback.app.SearchFragment", "androidx.leanback.app.SearchFragment"], + ["android.support.v17.leanback.app.SearchSupportFragment", "androidx.leanback.app.SearchSupportFragment"], + ["android.support.v17.leanback.app.VerticalGridFragment", "androidx.leanback.app.VerticalGridFragment"], + ["android.support.v17.leanback.app.VerticalGridSupportFragment", "androidx.leanback.app.VerticalGridSupportFragment"], + ["android.support.v17.leanback.app.VideoFragment", "androidx.leanback.app.VideoFragment"], + ["android.support.v17.leanback.app.VideoFragmentGlueHost", "androidx.leanback.app.VideoFragmentGlueHost"], + ["android.support.v17.leanback.app.VideoSupportFragment", "androidx.leanback.app.VideoSupportFragment"], + ["android.support.v17.leanback.app.VideoSupportFragmentGlueHost", "androidx.leanback.app.VideoSupportFragmentGlueHost"], + ["android.support.v17.leanback.database.CursorMapper", "androidx.leanback.database.CursorMapper"], + ["android.support.v17.leanback.graphics.BoundsRule", "androidx.leanback.graphics.BoundsRule"], + ["android.support.v17.leanback.graphics.ColorFilterCache", "androidx.leanback.graphics.ColorFilterCache"], + ["android.support.v17.leanback.graphics.ColorFilterDimmer", "androidx.leanback.graphics.ColorFilterDimmer"], + ["android.support.v17.leanback.graphics.ColorOverlayDimmer", "androidx.leanback.graphics.ColorOverlayDimmer"], + ["android.support.v17.leanback.graphics.CompositeDrawable", "androidx.leanback.graphics.CompositeDrawable"], + ["android.support.v17.leanback.graphics.FitWidthBitmapDrawable", "androidx.leanback.graphics.FitWidthBitmapDrawable"], + ["android.support.v17.leanback.media.MediaControllerAdapter", "androidx.leanback.media.MediaControllerAdapter"], + ["android.support.v17.leanback.media.MediaControllerGlue", "androidx.leanback.media.MediaControllerGlue"], + ["android.support.v17.leanback.media.MediaPlayerAdapter", "androidx.leanback.media.MediaPlayerAdapter"], + ["android.support.v17.leanback.media.MediaPlayerGlue", "androidx.leanback.media.MediaPlayerGlue"], + ["android.support.v17.leanback.media.PlaybackBannerControlGlue", "androidx.leanback.media.PlaybackBannerControlGlue"], + ["android.support.v17.leanback.media.PlaybackBaseControlGlue", "androidx.leanback.media.PlaybackBaseControlGlue"], + ["android.support.v17.leanback.media.PlaybackControlGlue", "androidx.leanback.media.PlaybackControlGlue"], + ["android.support.v17.leanback.media.PlaybackGlue", "androidx.leanback.media.PlaybackGlue"], + ["android.support.v17.leanback.media.PlaybackGlueHost", "androidx.leanback.media.PlaybackGlueHost"], + ["android.support.v17.leanback.media.PlaybackTransportControlGlue", "androidx.leanback.media.PlaybackTransportControlGlue"], + ["android.support.v17.leanback.media.PlayerAdapter", "androidx.leanback.media.PlayerAdapter"], + ["android.support.v17.leanback.media.SurfaceHolderGlueHost", "androidx.leanback.media.SurfaceHolderGlueHost"], + ["android.support.v17.leanback.R", "androidx.leanback.R"], + ["android.support.v17.leanback.system.Settings", "androidx.leanback.system.Settings"], + ["android.support.v17.leanback.transition.CustomChangeBounds", "androidx.leanback.transition.CustomChangeBounds"], + ["android.support.v17.leanback.transition.FadeAndShortSlide", "androidx.leanback.transition.FadeAndShortSlide"], + ["android.support.v17.leanback.transition.LeanbackTransitionHelper", "androidx.leanback.transition.LeanbackTransitionHelper"], + ["android.support.v17.leanback.transition.ParallaxTransition", "androidx.leanback.transition.ParallaxTransition"], + ["android.support.v17.leanback.transition.Scale", "androidx.leanback.transition.Scale"], + ["android.support.v17.leanback.transition.SlideKitkat", "androidx.leanback.transition.SlideKitkat"], + ["android.support.v17.leanback.transition.SlideNoPropagation", "androidx.leanback.transition.SlideNoPropagation"], + ["android.support.v17.leanback.transition.TransitionEpicenterCallback", "androidx.leanback.transition.TransitionEpicenterCallback"], + ["android.support.v17.leanback.transition.TransitionHelper", "androidx.leanback.transition.TransitionHelper"], + ["android.support.v17.leanback.transition.TransitionListener", "androidx.leanback.transition.TransitionListener"], + ["android.support.v17.leanback.transition.TranslationAnimationCreator", "androidx.leanback.transition.TranslationAnimationCreator"], + ["android.support.v17.leanback.util.MathUtil", "androidx.leanback.util.MathUtil"], + ["android.support.v17.leanback.util.StateMachine", "androidx.leanback.util.StateMachine"], + ["android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter", "androidx.leanback.widget.AbstractDetailsDescriptionPresenter"], + ["android.support.v17.leanback.widget.AbstractMediaItemPresenter", "androidx.leanback.widget.AbstractMediaItemPresenter"], + ["android.support.v17.leanback.widget.AbstractMediaListHeaderPresenter", "androidx.leanback.widget.AbstractMediaListHeaderPresenter"], + ["android.support.v17.leanback.widget.Action", "androidx.leanback.widget.Action"], + ["android.support.v17.leanback.widget.ActionPresenterSelector", "androidx.leanback.widget.ActionPresenterSelector"], + ["android.support.v17.leanback.widget.ArrayObjectAdapter", "androidx.leanback.widget.ArrayObjectAdapter"], + ["android.support.v17.leanback.widget.BackgroundHelper", "androidx.leanback.widget.BackgroundHelper"], + ["android.support.v17.leanback.widget.BaseCardView", "androidx.leanback.widget.BaseCardView"], + ["android.support.v17.leanback.widget.BaseGridView", "androidx.leanback.widget.BaseGridView"], + ["android.support.v17.leanback.widget.BaseOnItemViewClickedListener", "androidx.leanback.widget.BaseOnItemViewClickedListener"], + ["android.support.v17.leanback.widget.BaseOnItemViewSelectedListener", "androidx.leanback.widget.BaseOnItemViewSelectedListener"], + ["android.support.v17.leanback.widget.BrowseFrameLayout", "androidx.leanback.widget.BrowseFrameLayout"], + ["android.support.v17.leanback.widget.BrowseRowsFrameLayout", "androidx.leanback.widget.BrowseRowsFrameLayout"], + ["android.support.v17.leanback.widget.CheckableImageView", "androidx.leanback.widget.CheckableImageView"], + ["android.support.v17.leanback.widget.ClassPresenterSelector", "androidx.leanback.widget.ClassPresenterSelector"], + ["android.support.v17.leanback.widget.ControlBar", "androidx.leanback.widget.ControlBar"], + ["android.support.v17.leanback.widget.ControlBarPresenter", "androidx.leanback.widget.ControlBarPresenter"], + ["android.support.v17.leanback.widget.ControlButtonPresenterSelector", "androidx.leanback.widget.ControlButtonPresenterSelector"], + ["android.support.v17.leanback.widget.CursorObjectAdapter", "androidx.leanback.widget.CursorObjectAdapter"], + ["android.support.v17.leanback.widget.DetailsOverviewLogoPresenter", "androidx.leanback.widget.DetailsOverviewLogoPresenter"], + ["android.support.v17.leanback.widget.DetailsOverviewRow", "androidx.leanback.widget.DetailsOverviewRow"], + ["android.support.v17.leanback.widget.DetailsOverviewRowPresenter", "androidx.leanback.widget.DetailsOverviewRowPresenter"], + ["android.support.v17.leanback.widget.DetailsOverviewSharedElementHelper", "androidx.leanback.widget.DetailsOverviewSharedElementHelper"], + ["android.support.v17.leanback.widget.DetailsParallax", "androidx.leanback.widget.DetailsParallax"], + ["android.support.v17.leanback.widget.DetailsParallaxDrawable", "androidx.leanback.widget.DetailsParallaxDrawable"], + ["android.support.v17.leanback.widget.DiffCallback", "androidx.leanback.widget.DiffCallback"], + ["android.support.v17.leanback.widget.DividerPresenter", "androidx.leanback.widget.DividerPresenter"], + ["android.support.v17.leanback.widget.DividerRow", "androidx.leanback.widget.DividerRow"], + ["android.support.v17.leanback.widget.FacetProvider", "androidx.leanback.widget.FacetProvider"], + ["android.support.v17.leanback.widget.FacetProviderAdapter", "androidx.leanback.widget.FacetProviderAdapter"], + ["android.support.v17.leanback.widget.FocusHighlight", "androidx.leanback.widget.FocusHighlight"], + ["android.support.v17.leanback.widget.FocusHighlightHandler", "androidx.leanback.widget.FocusHighlightHandler"], + ["android.support.v17.leanback.widget.FocusHighlightHelper", "androidx.leanback.widget.FocusHighlightHelper"], + ["android.support.v17.leanback.widget.ForegroundHelper", "androidx.leanback.widget.ForegroundHelper"], + ["android.support.v17.leanback.widget.FragmentAnimationProvider", "androidx.leanback.widget.FragmentAnimationProvider"], + ["android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter", "androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter"], + ["android.support.v17.leanback.widget.FullWidthDetailsOverviewSharedElementHelper", "androidx.leanback.widget.FullWidthDetailsOverviewSharedElementHelper"], + ["android.support.v17.leanback.widget.Grid", "androidx.leanback.widget.Grid"], + ["android.support.v17.leanback.widget.GridLayoutManager", "androidx.leanback.widget.GridLayoutManager"], + ["android.support.v17.leanback.widget.GuidanceStylingRelativeLayout", "androidx.leanback.widget.GuidanceStylingRelativeLayout"], + ["android.support.v17.leanback.widget.GuidanceStylist", "androidx.leanback.widget.GuidanceStylist"], + ["android.support.v17.leanback.widget.GuidedAction", "androidx.leanback.widget.GuidedAction"], + ["android.support.v17.leanback.widget.GuidedActionAdapter", "androidx.leanback.widget.GuidedActionAdapter"], + ["android.support.v17.leanback.widget.GuidedActionAdapterGroup", "androidx.leanback.widget.GuidedActionAdapterGroup"], + ["android.support.v17.leanback.widget.GuidedActionAutofillSupport", "androidx.leanback.widget.GuidedActionAutofillSupport"], + ["android.support.v17.leanback.widget.GuidedActionDiffCallback", "androidx.leanback.widget.GuidedActionDiffCallback"], + ["android.support.v17.leanback.widget.GuidedActionEditText", "androidx.leanback.widget.GuidedActionEditText"], + ["android.support.v17.leanback.widget.GuidedActionItemContainer", "androidx.leanback.widget.GuidedActionItemContainer"], + ["android.support.v17.leanback.widget.GuidedActionsRelativeLayout", "androidx.leanback.widget.GuidedActionsRelativeLayout"], + ["android.support.v17.leanback.widget.GuidedActionsStylist", "androidx.leanback.widget.GuidedActionsStylist"], + ["android.support.v17.leanback.widget.GuidedDatePickerAction", "androidx.leanback.widget.GuidedDatePickerAction"], + ["android.support.v17.leanback.widget.HeaderItem", "androidx.leanback.widget.HeaderItem"], + ["android.support.v17.leanback.widget.HorizontalGridView", "androidx.leanback.widget.HorizontalGridView"], + ["android.support.v17.leanback.widget.HorizontalHoverCardSwitcher", "androidx.leanback.widget.HorizontalHoverCardSwitcher"], + ["android.support.v17.leanback.widget.ImageCardView", "androidx.leanback.widget.ImageCardView"], + ["android.support.v17.leanback.widget.ImeKeyMonitor", "androidx.leanback.widget.ImeKeyMonitor"], + ["android.support.v17.leanback.widget.InvisibleRowPresenter", "androidx.leanback.widget.InvisibleRowPresenter"], + ["android.support.v17.leanback.widget.ItemAlignment", "androidx.leanback.widget.ItemAlignment"], + ["android.support.v17.leanback.widget.ItemAlignmentFacet", "androidx.leanback.widget.ItemAlignmentFacet"], + ["android.support.v17.leanback.widget.ItemAlignmentFacetHelper", "androidx.leanback.widget.ItemAlignmentFacetHelper"], + ["android.support.v17.leanback.widget.ItemBridgeAdapter", "androidx.leanback.widget.ItemBridgeAdapter"], + ["android.support.v17.leanback.widget.ItemBridgeAdapterShadowOverlayWrapper", "androidx.leanback.widget.ItemBridgeAdapterShadowOverlayWrapper"], + ["android.support.v17.leanback.widget.ListRow", "androidx.leanback.widget.ListRow"], + ["android.support.v17.leanback.widget.ListRowHoverCardView", "androidx.leanback.widget.ListRowHoverCardView"], + ["android.support.v17.leanback.widget.ListRowPresenter", "androidx.leanback.widget.ListRowPresenter"], + ["android.support.v17.leanback.widget.ListRowView", "androidx.leanback.widget.ListRowView"], + ["android.support.v17.leanback.widget.MediaItemActionPresenter", "androidx.leanback.widget.MediaItemActionPresenter"], + ["android.support.v17.leanback.widget.MediaNowPlayingView", "androidx.leanback.widget.MediaNowPlayingView"], + ["android.support.v17.leanback.widget.MediaRowFocusView", "androidx.leanback.widget.MediaRowFocusView"], + ["android.support.v17.leanback.widget.MultiActionsProvider", "androidx.leanback.widget.MultiActionsProvider"], + ["android.support.v17.leanback.widget.NonOverlappingFrameLayout", "androidx.leanback.widget.NonOverlappingFrameLayout"], + ["android.support.v17.leanback.widget.NonOverlappingLinearLayout", "androidx.leanback.widget.NonOverlappingLinearLayout"], + ["android.support.v17.leanback.widget.NonOverlappingLinearLayoutWithForeground", "androidx.leanback.widget.NonOverlappingLinearLayoutWithForeground"], + ["android.support.v17.leanback.widget.NonOverlappingRelativeLayout", "androidx.leanback.widget.NonOverlappingRelativeLayout"], + ["android.support.v17.leanback.widget.NonOverlappingView", "androidx.leanback.widget.NonOverlappingView"], + ["android.support.v17.leanback.widget.ObjectAdapter", "androidx.leanback.widget.ObjectAdapter"], + ["android.support.v17.leanback.widget.OnActionClickedListener", "androidx.leanback.widget.OnActionClickedListener"], + ["android.support.v17.leanback.widget.OnChildLaidOutListener", "androidx.leanback.widget.OnChildLaidOutListener"], + ["android.support.v17.leanback.widget.OnChildSelectedListener", "androidx.leanback.widget.OnChildSelectedListener"], + ["android.support.v17.leanback.widget.OnChildViewHolderSelectedListener", "androidx.leanback.widget.OnChildViewHolderSelectedListener"], + ["android.support.v17.leanback.widget.OnItemViewClickedListener", "androidx.leanback.widget.OnItemViewClickedListener"], + ["android.support.v17.leanback.widget.OnItemViewSelectedListener", "androidx.leanback.widget.OnItemViewSelectedListener"], + ["android.support.v17.leanback.widget.PageRow", "androidx.leanback.widget.PageRow"], + ["android.support.v17.leanback.widget.PagingIndicator", "androidx.leanback.widget.PagingIndicator"], + ["android.support.v17.leanback.widget.Parallax", "androidx.leanback.widget.Parallax"], + ["android.support.v17.leanback.widget.ParallaxEffect", "androidx.leanback.widget.ParallaxEffect"], + ["android.support.v17.leanback.widget.ParallaxTarget", "androidx.leanback.widget.ParallaxTarget"], + ["android.support.v17.leanback.widget.PersistentFocusWrapper", "androidx.leanback.widget.PersistentFocusWrapper"], + ["android.support.v17.leanback.widget.picker.DatePicker", "androidx.leanback.widget.picker.DatePicker"], + ["android.support.v17.leanback.widget.picker.Picker", "androidx.leanback.widget.picker.Picker"], + ["android.support.v17.leanback.widget.picker.PickerColumn", "androidx.leanback.widget.picker.PickerColumn"], + ["android.support.v17.leanback.widget.picker.PickerUtility", "androidx.leanback.widget.picker.PickerUtility"], + ["android.support.v17.leanback.widget.picker.TimePicker", "androidx.leanback.widget.picker.TimePicker"], + ["android.support.v17.leanback.widget.PlaybackControlsPresenter", "androidx.leanback.widget.PlaybackControlsPresenter"], + ["android.support.v17.leanback.widget.PlaybackControlsRow", "androidx.leanback.widget.PlaybackControlsRow"], + ["android.support.v17.leanback.widget.PlaybackControlsRowPresenter", "androidx.leanback.widget.PlaybackControlsRowPresenter"], + ["android.support.v17.leanback.widget.PlaybackControlsRowView", "androidx.leanback.widget.PlaybackControlsRowView"], + ["android.support.v17.leanback.widget.PlaybackRowPresenter", "androidx.leanback.widget.PlaybackRowPresenter"], + ["android.support.v17.leanback.widget.PlaybackSeekDataProvider", "androidx.leanback.widget.PlaybackSeekDataProvider"], + ["android.support.v17.leanback.widget.PlaybackSeekUi", "androidx.leanback.widget.PlaybackSeekUi"], + ["android.support.v17.leanback.widget.PlaybackTransportRowPresenter", "androidx.leanback.widget.PlaybackTransportRowPresenter"], + ["android.support.v17.leanback.widget.PlaybackTransportRowView", "androidx.leanback.widget.PlaybackTransportRowView"], + ["android.support.v17.leanback.widget.Presenter", "androidx.leanback.widget.Presenter"], + ["android.support.v17.leanback.widget.PresenterSelector", "androidx.leanback.widget.PresenterSelector"], + ["android.support.v17.leanback.widget.PresenterSwitcher", "androidx.leanback.widget.PresenterSwitcher"], + ["android.support.v17.leanback.widget.RecyclerViewParallax", "androidx.leanback.widget.RecyclerViewParallax"], + ["android.support.v17.leanback.widget.ResizingTextView", "androidx.leanback.widget.ResizingTextView"], + ["android.support.v17.leanback.widget.RoundedRectHelper", "androidx.leanback.widget.RoundedRectHelper"], + ["android.support.v17.leanback.widget.RoundedRectHelperApi21", "androidx.leanback.widget.RoundedRectHelperApi21"], + ["android.support.v17.leanback.widget.Row", "androidx.leanback.widget.Row"], + ["android.support.v17.leanback.widget.RowContainerView", "androidx.leanback.widget.RowContainerView"], + ["android.support.v17.leanback.widget.RowHeaderPresenter", "androidx.leanback.widget.RowHeaderPresenter"], + ["android.support.v17.leanback.widget.RowHeaderView", "androidx.leanback.widget.RowHeaderView"], + ["android.support.v17.leanback.widget.RowPresenter", "androidx.leanback.widget.RowPresenter"], + ["android.support.v17.leanback.widget.ScaleFrameLayout", "androidx.leanback.widget.ScaleFrameLayout"], + ["android.support.v17.leanback.widget.SearchBar", "androidx.leanback.widget.SearchBar"], + ["android.support.v17.leanback.widget.SearchEditText", "androidx.leanback.widget.SearchEditText"], + ["android.support.v17.leanback.widget.SearchOrbView", "androidx.leanback.widget.SearchOrbView"], + ["android.support.v17.leanback.widget.SectionRow", "androidx.leanback.widget.SectionRow"], + ["android.support.v17.leanback.widget.SeekBar", "androidx.leanback.widget.SeekBar"], + ["android.support.v17.leanback.widget.ShadowHelper", "androidx.leanback.widget.ShadowHelper"], + ["android.support.v17.leanback.widget.ShadowHelperApi21", "androidx.leanback.widget.ShadowHelperApi21"], + ["android.support.v17.leanback.widget.ShadowOverlayContainer", "androidx.leanback.widget.ShadowOverlayContainer"], + ["android.support.v17.leanback.widget.ShadowOverlayHelper", "androidx.leanback.widget.ShadowOverlayHelper"], + ["android.support.v17.leanback.widget.SinglePresenterSelector", "androidx.leanback.widget.SinglePresenterSelector"], + ["android.support.v17.leanback.widget.SingleRow", "androidx.leanback.widget.SingleRow"], + ["android.support.v17.leanback.widget.SparseArrayObjectAdapter", "androidx.leanback.widget.SparseArrayObjectAdapter"], + ["android.support.v17.leanback.widget.SpeechOrbView", "androidx.leanback.widget.SpeechOrbView"], + ["android.support.v17.leanback.widget.SpeechRecognitionCallback", "androidx.leanback.widget.SpeechRecognitionCallback"], + ["android.support.v17.leanback.widget.StaggeredGrid", "androidx.leanback.widget.StaggeredGrid"], + ["android.support.v17.leanback.widget.StaggeredGridDefault", "androidx.leanback.widget.StaggeredGridDefault"], + ["android.support.v17.leanback.widget.StaticShadowHelper", "androidx.leanback.widget.StaticShadowHelper"], + ["android.support.v17.leanback.widget.StreamingTextView", "androidx.leanback.widget.StreamingTextView"], + ["android.support.v17.leanback.widget.ThumbsBar", "androidx.leanback.widget.ThumbsBar"], + ["android.support.v17.leanback.widget.TitleHelper", "androidx.leanback.widget.TitleHelper"], + ["android.support.v17.leanback.widget.TitleView", "androidx.leanback.widget.TitleView"], + ["android.support.v17.leanback.widget.TitleViewAdapter", "androidx.leanback.widget.TitleViewAdapter"], + ["android.support.v17.leanback.widget.Util", "androidx.leanback.widget.Util"], + ["android.support.v17.leanback.widget.VerticalGridPresenter", "androidx.leanback.widget.VerticalGridPresenter"], + ["android.support.v17.leanback.widget.VerticalGridView", "androidx.leanback.widget.VerticalGridView"], + ["android.support.v17.leanback.widget.VideoSurfaceView", "androidx.leanback.widget.VideoSurfaceView"], + ["android.support.v17.leanback.widget.ViewHolderTask", "androidx.leanback.widget.ViewHolderTask"], + ["android.support.v17.leanback.widget.ViewsStateBundle", "androidx.leanback.widget.ViewsStateBundle"], + ["android.support.v17.leanback.widget.Visibility", "androidx.leanback.widget.Visibility"], + ["android.support.v17.leanback.widget.WindowAlignment", "androidx.leanback.widget.WindowAlignment"], + ["android.support.v17.preference.BaseLeanbackPreferenceFragment", "androidx.leanback.preference.BaseLeanbackPreferenceFragment"], + ["android.support.v17.preference.LeanbackListPreferenceDialogFragment", "androidx.leanback.preference.LeanbackListPreferenceDialogFragment"], + ["android.support.v17.preference.LeanbackPreferenceDialogFragment", "androidx.leanback.preference.LeanbackPreferenceDialogFragment"], + ["android.support.v17.preference.LeanbackPreferenceFragment", "androidx.leanback.preference.LeanbackPreferenceFragment"], + ["android.support.v17.preference.LeanbackPreferenceFragmentTransitionHelperApi21", "androidx.leanback.preference.LeanbackPreferenceFragmentTransitionHelperApi21"], + ["android.support.v17.preference.LeanbackSettingsFragment", "androidx.leanback.preference.LeanbackSettingsFragment"], + ["android.support.v17.preference.LeanbackSettingsRootView", "androidx.leanback.preference.LeanbackSettingsRootView"], + ["android.support.v17.preference.R", "androidx.leanback.preference.R"], + ["android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat", "androidx.core.accessibilityservice.AccessibilityServiceInfoCompat"], + ["android.support.v4.app.ActionBarDrawerToggle", "androidx.legacy.app.ActionBarDrawerToggle"], + ["android.support.v4.app.ActivityCompat", "androidx.core.app.ActivityCompat"], + ["android.support.v4.app.ActivityManagerCompat", "androidx.core.app.ActivityManagerCompat"], + ["android.support.v4.app.ActivityOptionsCompat", "androidx.core.app.ActivityOptionsCompat"], + ["android.support.v4.app.AlarmManagerCompat", "androidx.core.app.AlarmManagerCompat"], + ["android.support.v4.app.AppComponentFactory", "androidx.core.app.AppComponentFactory"], + ["android.support.v4.app.AppLaunchChecker", "androidx.core.app.AppLaunchChecker"], + ["android.support.v4.app.AppOpsManagerCompat", "androidx.core.app.AppOpsManagerCompat"], + ["android.support.v4.app.BackStackRecord", "androidx.fragment.app.BackStackRecord"], + ["android.support.v4.app.BackStackState", "androidx.fragment.app.BackStackState"], + ["android.support.v4.app.BundleCompat", "androidx.core.app.BundleCompat"], + ["android.support.v4.app.CoreComponentFactory", "androidx.core.app.CoreComponentFactory"], + ["android.support.v4.app.DialogFragment", "androidx.fragment.app.DialogFragment"], + ["android.support.v4.app.Fragment", "androidx.fragment.app.Fragment"], + ["android.support.v4.app.FragmentActivity", "androidx.fragment.app.FragmentActivity"], + ["android.support.v4.app.FragmentContainer", "androidx.fragment.app.FragmentContainer"], + ["android.support.v4.app.FragmentController", "androidx.fragment.app.FragmentController"], + ["android.support.v4.app.FragmentHostCallback", "androidx.fragment.app.FragmentHostCallback"], + ["android.support.v4.app.FragmentManager", "androidx.fragment.app.FragmentManager"], + ["android.support.v4.app.FragmentManagerImpl", "androidx.fragment.app.FragmentManagerImpl"], + ["android.support.v4.app.FragmentManagerNonConfig", "androidx.fragment.app.FragmentManagerNonConfig"], + ["android.support.v4.app.FragmentManagerState", "androidx.fragment.app.FragmentManagerState"], + ["android.support.v4.app.FragmentPagerAdapter", "androidx.fragment.app.FragmentPagerAdapter"], + ["android.support.v4.app.FragmentState", "androidx.fragment.app.FragmentState"], + ["android.support.v4.app.FragmentStatePagerAdapter", "androidx.fragment.app.FragmentStatePagerAdapter"], + ["android.support.v4.app.FragmentTabHost", "androidx.fragment.app.FragmentTabHost"], + ["android.support.v4.app.FragmentTransaction", "androidx.fragment.app.FragmentTransaction"], + ["android.support.v4.app.FragmentTransition", "androidx.fragment.app.FragmentTransition"], + ["android.support.v4.app.FragmentTransitionCompat21", "androidx.fragment.app.FragmentTransitionCompat21"], + ["android.support.v4.app.FragmentTransitionImpl", "androidx.fragment.app.FragmentTransitionImpl"], + ["android.support.v4.app.FrameMetricsAggregator", "androidx.core.app.FrameMetricsAggregator"], + ["android.support.v4.app.INotificationSideChannel", "androidx.core.app.INotificationSideChannel"], + ["android.support.v4.app.JobIntentService", "androidx.core.app.JobIntentService"], + ["android.support.v4.app.ListFragment", "androidx.fragment.app.ListFragment"], + ["android.support.v4.app.LoaderManager", "androidx.loader.app.LoaderManager"], + ["android.support.v4.app.LoaderManagerImpl", "androidx.loader.app.LoaderManagerImpl"], + ["android.support.v4.app.NavUtils", "androidx.core.app.NavUtils"], + ["android.support.v4.app.NotificationBuilderWithBuilderAccessor", "androidx.core.app.NotificationBuilderWithBuilderAccessor"], + ["android.support.v4.app.NotificationCompat", "androidx.core.app.NotificationCompat"], + ["android.support.v4.app.NotificationCompatBuilder", "androidx.core.app.NotificationCompatBuilder"], + ["android.support.v4.app.NotificationCompatExtras", "androidx.core.app.NotificationCompatExtras"], + ["android.support.v4.app.NotificationCompatJellybean", "androidx.core.app.NotificationCompatJellybean"], + ["android.support.v4.app.NotificationCompatSideChannelService", "androidx.core.app.NotificationCompatSideChannelService"], + ["android.support.v4.app.NotificationManagerCompat", "androidx.core.app.NotificationManagerCompat"], + ["android.support.v4.app.OneShotPreDrawListener", "androidx.fragment.app.OneShotPreDrawListener"], + ["android.support.v4.app.Person", "androidx.core.app.Person"], + ["android.support.v4.app.RemoteInput", "androidx.core.app.RemoteInput"], + ["android.support.v4.app.ServiceCompat", "androidx.core.app.ServiceCompat"], + ["android.support.v4.app.ShareCompat", "androidx.core.app.ShareCompat"], + ["android.support.v4.app.SharedElementCallback", "androidx.core.app.SharedElementCallback"], + ["android.support.v4.app.SuperNotCalledException", "androidx.fragment.app.SuperNotCalledException"], + ["android.support.v4.app.SupportActivity", "androidx.core.app.ComponentActivity"], + ["android.support.v4.app.TaskStackBuilder", "androidx.core.app.TaskStackBuilder"], + ["android.support.v4.content.AsyncTaskLoader", "androidx.loader.content.AsyncTaskLoader"], + ["android.support.v4.content.ContentResolverCompat", "androidx.core.content.ContentResolverCompat"], + ["android.support.v4.content.ContextCompat", "androidx.core.content.ContextCompat"], + ["android.support.v4.content.CursorLoader", "androidx.loader.content.CursorLoader"], + ["android.support.v4.content.FileProvider", "androidx.core.content.FileProvider"], + ["android.support.v4.content.IntentCompat", "androidx.core.content.IntentCompat"], + ["android.support.v4.content.Loader", "androidx.loader.content.Loader"], + ["android.support.v4.content.LocalBroadcastManager", "androidx.localbroadcastmanager.content.LocalBroadcastManager"], + ["android.support.v4.content.MimeTypeFilter", "androidx.core.content.MimeTypeFilter"], + ["android.support.v4.content.ModernAsyncTask", "androidx.loader.content.ModernAsyncTask"], + ["android.support.v4.content.PermissionChecker", "androidx.core.content.PermissionChecker"], + ["android.support.v4.content.pm.ActivityInfoCompat", "androidx.core.content.pm.ActivityInfoCompat"], + ["android.support.v4.content.pm.PackageInfoCompat", "androidx.core.content.pm.PackageInfoCompat"], + ["android.support.v4.content.pm.PermissionInfoCompat", "androidx.core.content.pm.PermissionInfoCompat"], + ["android.support.v4.content.pm.ShortcutInfoCompat", "androidx.core.content.pm.ShortcutInfoCompat"], + ["android.support.v4.content.pm.ShortcutManagerCompat", "androidx.core.content.pm.ShortcutManagerCompat"], + ["android.support.v4.content.res.ColorStateListInflaterCompat", "androidx.core.content.res.ColorStateListInflaterCompat"], + ["android.support.v4.content.res.ComplexColorCompat", "androidx.core.content.res.ComplexColorCompat"], + ["android.support.v4.content.res.ConfigurationHelper", "androidx.core.content.res.ConfigurationHelper"], + ["android.support.v4.content.res.FontResourcesParserCompat", "androidx.core.content.res.FontResourcesParserCompat"], + ["android.support.v4.content.res.GradientColorInflaterCompat", "androidx.core.content.res.GradientColorInflaterCompat"], + ["android.support.v4.content.res.GrowingArrayUtils", "androidx.core.content.res.GrowingArrayUtils"], + ["android.support.v4.content.res.ResourcesCompat", "androidx.core.content.res.ResourcesCompat"], + ["android.support.v4.content.res.TypedArrayUtils", "androidx.core.content.res.TypedArrayUtils"], + ["android.support.v4.content.SharedPreferencesCompat", "androidx.core.content.SharedPreferencesCompat"], + ["android.support.v4.content.WakefulBroadcastReceiver", "androidx.legacy.content.WakefulBroadcastReceiver"], + ["android.support.v4.database.CursorWindowCompat", "androidx.core.database.CursorWindowCompat"], + ["android.support.v4.database.DatabaseUtilsCompat", "androidx.core.database.DatabaseUtilsCompat"], + ["android.support.v4.database.sqlite.SQLiteCursorCompat", "androidx.core.database.sqlite.SQLiteCursorCompat"], + ["android.support.v4.graphics.BitmapCompat", "androidx.core.graphics.BitmapCompat"], + ["android.support.v4.graphics.ColorUtils", "androidx.core.graphics.ColorUtils"], + ["android.support.v4.graphics.drawable.DrawableCompat", "androidx.core.graphics.drawable.DrawableCompat"], + ["android.support.v4.graphics.drawable.IconCompat", "androidx.core.graphics.drawable.IconCompat"], + ["android.support.v4.graphics.drawable.IconCompatParcelizer", "android.support.v4.graphics.drawable.IconCompatParcelizer"], + ["android.support.v4.graphics.drawable.RoundedBitmapDrawable21", "androidx.core.graphics.drawable.RoundedBitmapDrawable21"], + ["android.support.v4.graphics.drawable.RoundedBitmapDrawable", "androidx.core.graphics.drawable.RoundedBitmapDrawable"], + ["android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory", "androidx.core.graphics.drawable.RoundedBitmapDrawableFactory"], + ["android.support.v4.graphics.drawable.TintAwareDrawable", "androidx.core.graphics.drawable.TintAwareDrawable"], + ["android.support.v4.graphics.drawable.WrappedDrawable", "androidx.core.graphics.drawable.WrappedDrawable"], + ["android.support.v4.graphics.drawable.WrappedDrawableApi14", "androidx.core.graphics.drawable.WrappedDrawableApi14"], + ["android.support.v4.graphics.drawable.WrappedDrawableApi21", "androidx.core.graphics.drawable.WrappedDrawableApi21"], + ["android.support.v4.graphics.PaintCompat", "androidx.core.graphics.PaintCompat"], + ["android.support.v4.graphics.PathParser", "androidx.core.graphics.PathParser"], + ["android.support.v4.graphics.PathSegment", "androidx.core.graphics.PathSegment"], + ["android.support.v4.graphics.PathUtils", "androidx.core.graphics.PathUtils"], + ["android.support.v4.graphics.TypefaceCompat", "androidx.core.graphics.TypefaceCompat"], + ["android.support.v4.graphics.TypefaceCompatApi21Impl", "androidx.core.graphics.TypefaceCompatApi21Impl"], + ["android.support.v4.graphics.TypefaceCompatApi24Impl", "androidx.core.graphics.TypefaceCompatApi24Impl"], + ["android.support.v4.graphics.TypefaceCompatApi26Impl", "androidx.core.graphics.TypefaceCompatApi26Impl"], + ["android.support.v4.graphics.TypefaceCompatApi28Impl", "androidx.core.graphics.TypefaceCompatApi28Impl"], + ["android.support.v4.graphics.TypefaceCompatBaseImpl", "androidx.core.graphics.TypefaceCompatBaseImpl"], + ["android.support.v4.graphics.TypefaceCompatUtil", "androidx.core.graphics.TypefaceCompatUtil"], + ["android.support.v4.hardware.display.DisplayManagerCompat", "androidx.core.hardware.display.DisplayManagerCompat"], + ["android.support.v4.hardware.fingerprint.FingerprintManagerCompat", "androidx.core.hardware.fingerprint.FingerprintManagerCompat"], + ["android.support.v4.internal.view.SupportMenu", "androidx.core.internal.view.SupportMenu"], + ["android.support.v4.internal.view.SupportMenuItem", "androidx.core.internal.view.SupportMenuItem"], + ["android.support.v4.internal.view.SupportSubMenu", "androidx.core.internal.view.SupportSubMenu"], + ["android.support.v4.math.MathUtils", "androidx.core.math.MathUtils"], + ["android.support.v4.media.app.NotificationCompat", "androidx.media.app.NotificationCompat"], + ["android.support.v4.media.AudioAttributesCompat", "androidx.media.AudioAttributesCompat"], + ["android.support.v4.media.AudioAttributesImpl", "android.support.v4.media.AudioAttributesImpl"], + ["android.support.v4.media.AudioAttributesImplApi21", "android.support.v4.media.AudioAttributesImplApi21"], + ["android.support.v4.media.AudioAttributesImplBase", "android.support.v4.media.AudioAttributesImplBase"], + ["android.support.v4.media.MediaBrowserCompat", "android.support.v4.media.MediaBrowserCompat"], + ["android.support.v4.media.MediaBrowserCompatApi21", "android.support.v4.media.MediaBrowserCompatApi21"], + ["android.support.v4.media.MediaBrowserCompatApi23", "android.support.v4.media.MediaBrowserCompatApi23"], + ["android.support.v4.media.MediaBrowserCompatApi26", "android.support.v4.media.MediaBrowserCompatApi26"], + ["android.support.v4.media.MediaBrowserCompatUtils", "androidx.media.MediaBrowserCompatUtils"], + ["android.support.v4.media.MediaBrowserProtocol", "androidx.media.MediaBrowserProtocol"], + ["android.support.v4.media.MediaBrowserServiceCompat", "androidx.media.MediaBrowserServiceCompat"], + ["android.support.v4.media.MediaBrowserServiceCompatApi21", "androidx.media.MediaBrowserServiceCompatApi21"], + ["android.support.v4.media.MediaBrowserServiceCompatApi23", "androidx.media.MediaBrowserServiceCompatApi23"], + ["android.support.v4.media.MediaBrowserServiceCompatApi26", "androidx.media.MediaBrowserServiceCompatApi26"], + ["android.support.v4.media.MediaDescriptionCompat", "android.support.v4.media.MediaDescriptionCompat"], + ["android.support.v4.media.MediaDescriptionCompatApi21", "android.support.v4.media.MediaDescriptionCompatApi21"], + ["android.support.v4.media.MediaDescriptionCompatApi23", "android.support.v4.media.MediaDescriptionCompatApi23"], + ["android.support.v4.media.MediaMetadataCompat", "android.support.v4.media.MediaMetadataCompat"], + ["android.support.v4.media.MediaMetadataCompatApi21", "android.support.v4.media.MediaMetadataCompatApi21"], + ["android.support.v4.media.MediaSessionManager", "android.support.v4.media.MediaSessionManager"], + ["android.support.v4.media.MediaSessionManagerImplApi21", "android.support.v4.media.MediaSessionManagerImplApi21"], + ["android.support.v4.media.MediaSessionManagerImplApi28", "android.support.v4.media.MediaSessionManagerImplApi28"], + ["android.support.v4.media.MediaSessionManagerImplBase", "android.support.v4.media.MediaSessionManagerImplBase"], + ["android.support.v4.media.ParceledListSliceAdapterApi21", "android.support.v4.media.ParceledListSliceAdapterApi21"], + ["android.support.v4.media.RatingCompat", "android.support.v4.media.RatingCompat"], + ["android.support.v4.media.session.IMediaControllerCallback", "android.support.v4.media.session.IMediaControllerCallback"], + ["android.support.v4.media.session.IMediaSession", "android.support.v4.media.session.IMediaSession"], + ["android.support.v4.media.session.MediaButtonReceiver", "androidx.media.session.MediaButtonReceiver"], + ["android.support.v4.media.session.MediaControllerCompat", "android.support.v4.media.session.MediaControllerCompat"], + ["android.support.v4.media.session.MediaControllerCompatApi21", "android.support.v4.media.session.MediaControllerCompatApi21"], + ["android.support.v4.media.session.MediaControllerCompatApi23", "android.support.v4.media.session.MediaControllerCompatApi23"], + ["android.support.v4.media.session.MediaControllerCompatApi24", "android.support.v4.media.session.MediaControllerCompatApi24"], + ["android.support.v4.media.session.MediaSessionCompat", "android.support.v4.media.session.MediaSessionCompat"], + ["android.support.v4.media.session.MediaSessionCompatApi21", "android.support.v4.media.session.MediaSessionCompatApi21"], + ["android.support.v4.media.session.MediaSessionCompatApi22", "android.support.v4.media.session.MediaSessionCompatApi22"], + ["android.support.v4.media.session.MediaSessionCompatApi23", "android.support.v4.media.session.MediaSessionCompatApi23"], + ["android.support.v4.media.session.MediaSessionCompatApi24", "android.support.v4.media.session.MediaSessionCompatApi24"], + ["android.support.v4.media.session.ParcelableVolumeInfo", "android.support.v4.media.session.ParcelableVolumeInfo"], + ["android.support.v4.media.session.PlaybackStateCompat", "android.support.v4.media.session.PlaybackStateCompat"], + ["android.support.v4.media.session.PlaybackStateCompatApi21", "android.support.v4.media.session.PlaybackStateCompatApi21"], + ["android.support.v4.media.session.PlaybackStateCompatApi22", "android.support.v4.media.session.PlaybackStateCompatApi22"], + ["android.support.v4.media.VolumeProviderCompat", "androidx.media.VolumeProviderCompat"], + ["android.support.v4.media.VolumeProviderCompatApi21", "androidx.media.VolumeProviderCompatApi21"], + ["android.support.v4.net.ConnectivityManagerCompat", "androidx.core.net.ConnectivityManagerCompat"], + ["android.support.v4.net.DatagramSocketWrapper", "androidx.core.net.DatagramSocketWrapper"], + ["android.support.v4.net.TrafficStatsCompat", "androidx.core.net.TrafficStatsCompat"], + ["android.support.v4.os.BuildCompat", "androidx.core.os.BuildCompat"], + ["android.support.v4.os.CancellationSignal", "androidx.core.os.CancellationSignal"], + ["android.support.v4.os.ConfigurationCompat", "androidx.core.os.ConfigurationCompat"], + ["android.support.v4.os.EnvironmentCompat", "androidx.core.os.EnvironmentCompat"], + ["android.support.v4.os.HandlerCompat", "androidx.core.os.HandlerCompat"], + ["android.support.v4.os.IResultReceiver", "androidx.core.os.IResultReceiver"], + ["android.support.v4.os.LocaleHelper", "androidx.core.os.LocaleHelper"], + ["android.support.v4.os.LocaleListCompat", "androidx.core.os.LocaleListCompat"], + ["android.support.v4.os.LocaleListHelper", "androidx.core.os.LocaleListHelper"], + ["android.support.v4.os.LocaleListInterface", "androidx.core.os.LocaleListInterface"], + ["android.support.v4.os.OperationCanceledException", "androidx.core.os.OperationCanceledException"], + ["android.support.v4.os.ParcelableCompat", "androidx.core.os.ParcelableCompat"], + ["android.support.v4.os.ParcelableCompatCreatorCallbacks", "androidx.core.os.ParcelableCompatCreatorCallbacks"], + ["android.support.v4.os.ParcelCompat", "androidx.core.os.ParcelCompat"], + ["android.support.v4.os.ResultReceiver", "androidx.core.os.ResultReceiver"], + ["android.support.v4.os.TraceCompat", "androidx.core.os.TraceCompat"], + ["android.support.v4.os.UserManagerCompat", "androidx.core.os.UserManagerCompat"], + ["android.support.v4.print.PrintHelper", "androidx.print.PrintHelper"], + ["android.support.v4.provider.DocumentFile", "androidx.documentfile.provider.DocumentFile"], + ["android.support.v4.provider.DocumentsContractApi19", "androidx.documentfile.provider.DocumentsContractApi19"], + ["android.support.v4.provider.FontRequest", "androidx.core.provider.FontRequest"], + ["android.support.v4.provider.FontsContractCompat", "androidx.core.provider.FontsContractCompat"], + ["android.support.v4.provider.RawDocumentFile", "androidx.documentfile.provider.RawDocumentFile"], + ["android.support.v4.provider.SelfDestructiveThread", "androidx.core.provider.SelfDestructiveThread"], + ["android.support.v4.provider.SingleDocumentFile", "androidx.documentfile.provider.SingleDocumentFile"], + ["android.support.v4.provider.TreeDocumentFile", "androidx.documentfile.provider.TreeDocumentFile"], + ["android.support.v4.text.BidiFormatter", "androidx.core.text.BidiFormatter"], + ["android.support.v4.text.HtmlCompat", "androidx.core.text.HtmlCompat"], + ["android.support.v4.text.ICUCompat", "androidx.core.text.ICUCompat"], + ["android.support.v4.text.PrecomputedTextCompat", "androidx.core.text.PrecomputedTextCompat"], + ["android.support.v4.text.TextDirectionHeuristicCompat", "androidx.core.text.TextDirectionHeuristicCompat"], + ["android.support.v4.text.TextDirectionHeuristicsCompat", "androidx.core.text.TextDirectionHeuristicsCompat"], + ["android.support.v4.text.TextUtilsCompat", "androidx.core.text.TextUtilsCompat"], + ["android.support.v4.text.util.FindAddress", "androidx.core.text.util.FindAddress"], + ["android.support.v4.text.util.LinkifyCompat", "androidx.core.text.util.LinkifyCompat"], + ["android.support.v4.util.ArrayMap", "androidx.collection.ArrayMap"], + ["android.support.v4.util.ArraySet", "androidx.collection.ArraySet"], + ["android.support.v4.util.AtomicFile", "androidx.core.util.AtomicFile"], + ["android.support.v4.util.CircularArray", "androidx.collection.CircularArray"], + ["android.support.v4.util.CircularIntArray", "androidx.collection.CircularIntArray"], + ["android.support.v4.util.Consumer", "androidx.core.util.Consumer"], + ["android.support.v4.util.ContainerHelpers", "androidx.collection.ContainerHelpers"], + ["android.support.v4.util.DebugUtils", "androidx.core.util.DebugUtils"], + ["android.support.v4.util.LogWriter", "androidx.core.util.LogWriter"], + ["android.support.v4.util.LongSparseArray", "androidx.collection.LongSparseArray"], + ["android.support.v4.util.LruCache", "androidx.collection.LruCache"], + ["android.support.v4.util.MapCollections", "androidx.collection.MapCollections"], + ["android.support.v4.util.ObjectsCompat", "androidx.core.util.ObjectsCompat"], + ["android.support.v4.util.Pair", "androidx.core.util.Pair"], + ["android.support.v4.util.PatternsCompat", "androidx.core.util.PatternsCompat"], + ["android.support.v4.util.Pools", "androidx.core.util.Pools"], + ["android.support.v4.util.Preconditions", "androidx.core.util.Preconditions"], + ["android.support.v4.util.SimpleArrayMap", "androidx.collection.SimpleArrayMap"], + ["android.support.v4.util.SparseArrayCompat", "androidx.collection.SparseArrayCompat"], + ["android.support.v4.util.TimeUtils", "androidx.core.util.TimeUtils"], + ["android.support.v4.view.AbsSavedState", "androidx.customview.view.AbsSavedState"], + ["android.support.v4.view.accessibility.AccessibilityEventCompat", "androidx.core.view.accessibility.AccessibilityEventCompat"], + ["android.support.v4.view.accessibility.AccessibilityManagerCompat", "androidx.core.view.accessibility.AccessibilityManagerCompat"], + ["android.support.v4.view.accessibility.AccessibilityNodeInfoCompat", "androidx.core.view.accessibility.AccessibilityNodeInfoCompat"], + ["android.support.v4.view.accessibility.AccessibilityNodeProviderCompat", "androidx.core.view.accessibility.AccessibilityNodeProviderCompat"], + ["android.support.v4.view.accessibility.AccessibilityRecordCompat", "androidx.core.view.accessibility.AccessibilityRecordCompat"], + ["android.support.v4.view.accessibility.AccessibilityWindowInfoCompat", "androidx.core.view.accessibility.AccessibilityWindowInfoCompat"], + ["android.support.v4.view.AccessibilityDelegateCompat", "androidx.core.view.AccessibilityDelegateCompat"], + ["android.support.v4.view.ActionProvider", "androidx.core.view.ActionProvider"], + ["android.support.v4.view.animation.FastOutLinearInInterpolator", "androidx.interpolator.view.animation.FastOutLinearInInterpolator"], + ["android.support.v4.view.animation.FastOutSlowInInterpolator", "androidx.interpolator.view.animation.FastOutSlowInInterpolator"], + ["android.support.v4.view.animation.LinearOutSlowInInterpolator", "androidx.interpolator.view.animation.LinearOutSlowInInterpolator"], + ["android.support.v4.view.animation.LookupTableInterpolator", "androidx.interpolator.view.animation.LookupTableInterpolator"], + ["android.support.v4.view.animation.PathInterpolatorApi14", "androidx.core.view.animation.PathInterpolatorApi14"], + ["android.support.v4.view.animation.PathInterpolatorCompat", "androidx.core.view.animation.PathInterpolatorCompat"], + ["android.support.v4.view.AsyncLayoutInflater", "androidx.asynclayoutinflater.view.AsyncLayoutInflater"], + ["android.support.v4.view.DisplayCutoutCompat", "androidx.core.view.DisplayCutoutCompat"], + ["android.support.v4.view.GestureDetectorCompat", "androidx.core.view.GestureDetectorCompat"], + ["android.support.v4.view.GravityCompat", "androidx.core.view.GravityCompat"], + ["android.support.v4.view.InputDeviceCompat", "androidx.core.view.InputDeviceCompat"], + ["android.support.v4.view.KeyEventDispatcher", "androidx.core.view.KeyEventDispatcher"], + ["android.support.v4.view.LayoutInflaterCompat", "androidx.core.view.LayoutInflaterCompat"], + ["android.support.v4.view.LayoutInflaterFactory", "androidx.core.view.LayoutInflaterFactory"], + ["android.support.v4.view.MarginLayoutParamsCompat", "androidx.core.view.MarginLayoutParamsCompat"], + ["android.support.v4.view.MenuCompat", "androidx.core.view.MenuCompat"], + ["android.support.v4.view.MenuItemCompat", "androidx.core.view.MenuItemCompat"], + ["android.support.v4.view.MotionEventCompat", "androidx.core.view.MotionEventCompat"], + ["android.support.v4.view.NestedScrollingChild2", "androidx.core.view.NestedScrollingChild2"], + ["android.support.v4.view.NestedScrollingChild", "androidx.core.view.NestedScrollingChild"], + ["android.support.v4.view.NestedScrollingChildHelper", "androidx.core.view.NestedScrollingChildHelper"], + ["android.support.v4.view.NestedScrollingParent2", "androidx.core.view.NestedScrollingParent2"], + ["android.support.v4.view.NestedScrollingParent", "androidx.core.view.NestedScrollingParent"], + ["android.support.v4.view.NestedScrollingParentHelper", "androidx.core.view.NestedScrollingParentHelper"], + ["android.support.v4.view.OnApplyWindowInsetsListener", "androidx.core.view.OnApplyWindowInsetsListener"], + ["android.support.v4.view.PagerAdapter", "androidx.viewpager.widget.PagerAdapter"], + ["android.support.v4.view.PagerTabStrip", "androidx.viewpager.widget.PagerTabStrip"], + ["android.support.v4.view.PagerTitleStrip", "androidx.viewpager.widget.PagerTitleStrip"], + ["android.support.v4.view.PointerIconCompat", "androidx.core.view.PointerIconCompat"], + ["android.support.v4.view.ScaleGestureDetectorCompat", "androidx.core.view.ScaleGestureDetectorCompat"], + ["android.support.v4.view.ScrollingView", "androidx.core.view.ScrollingView"], + ["android.support.v4.view.TintableBackgroundView", "androidx.core.view.TintableBackgroundView"], + ["android.support.v4.view.VelocityTrackerCompat", "androidx.core.view.VelocityTrackerCompat"], + ["android.support.v4.view.ViewCompat", "androidx.core.view.ViewCompat"], + ["android.support.v4.view.ViewConfigurationCompat", "androidx.core.view.ViewConfigurationCompat"], + ["android.support.v4.view.ViewGroupCompat", "androidx.core.view.ViewGroupCompat"], + ["android.support.v4.view.ViewPager", "androidx.viewpager.widget.ViewPager"], + ["android.support.v4.view.ViewParentCompat", "androidx.core.view.ViewParentCompat"], + ["android.support.v4.view.ViewPropertyAnimatorCompat", "androidx.core.view.ViewPropertyAnimatorCompat"], + ["android.support.v4.view.ViewPropertyAnimatorListener", "androidx.core.view.ViewPropertyAnimatorListener"], + ["android.support.v4.view.ViewPropertyAnimatorListenerAdapter", "androidx.core.view.ViewPropertyAnimatorListenerAdapter"], + ["android.support.v4.view.ViewPropertyAnimatorUpdateListener", "androidx.core.view.ViewPropertyAnimatorUpdateListener"], + ["android.support.v4.view.WindowCompat", "androidx.core.view.WindowCompat"], + ["android.support.v4.view.WindowInsetsCompat", "androidx.core.view.WindowInsetsCompat"], + ["android.support.v4.widget.AutoScrollHelper", "androidx.core.widget.AutoScrollHelper"], + ["android.support.v4.widget.AutoSizeableTextView", "androidx.core.widget.AutoSizeableTextView"], + ["android.support.v4.widget.CircleImageView", "androidx.swiperefreshlayout.widget.CircleImageView"], + ["android.support.v4.widget.CircularProgressDrawable", "androidx.swiperefreshlayout.widget.CircularProgressDrawable"], + ["android.support.v4.widget.CompoundButtonCompat", "androidx.core.widget.CompoundButtonCompat"], + ["android.support.v4.widget.ContentLoadingProgressBar", "androidx.core.widget.ContentLoadingProgressBar"], + ["android.support.v4.widget.CursorAdapter", "androidx.cursoradapter.widget.CursorAdapter"], + ["android.support.v4.widget.CursorFilter", "androidx.cursoradapter.widget.CursorFilter"], + ["android.support.v4.widget.DirectedAcyclicGraph", "androidx.coordinatorlayout.widget.DirectedAcyclicGraph"], + ["android.support.v4.widget.DrawerLayout", "androidx.drawerlayout.widget.DrawerLayout"], + ["android.support.v4.widget.EdgeEffectCompat", "androidx.core.widget.EdgeEffectCompat"], + ["android.support.v4.widget.ExploreByTouchHelper", "androidx.customview.widget.ExploreByTouchHelper"], + ["android.support.v4.widget.FocusStrategy", "androidx.customview.widget.FocusStrategy"], + ["android.support.v4.widget.ImageViewCompat", "androidx.core.widget.ImageViewCompat"], + ["android.support.v4.widget.ListPopupWindowCompat", "androidx.core.widget.ListPopupWindowCompat"], + ["android.support.v4.widget.ListViewAutoScrollHelper", "androidx.core.widget.ListViewAutoScrollHelper"], + ["android.support.v4.widget.ListViewCompat", "androidx.core.widget.ListViewCompat"], + ["android.support.v4.widget.NestedScrollView", "androidx.core.widget.NestedScrollView"], + ["android.support.v4.widget.PopupMenuCompat", "androidx.core.widget.PopupMenuCompat"], + ["android.support.v4.widget.PopupWindowCompat", "androidx.core.widget.PopupWindowCompat"], + ["android.support.v4.widget.ResourceCursorAdapter", "androidx.cursoradapter.widget.ResourceCursorAdapter"], + ["android.support.v4.widget.ScrollerCompat", "androidx.core.widget.ScrollerCompat"], + ["android.support.v4.widget.SimpleCursorAdapter", "androidx.cursoradapter.widget.SimpleCursorAdapter"], + ["android.support.v4.widget.SlidingPaneLayout", "androidx.slidingpanelayout.widget.SlidingPaneLayout"], + ["android.support.v4.widget.Space", "androidx.legacy.widget.Space"], + ["android.support.v4.widget.SwipeRefreshLayout", "androidx.swiperefreshlayout.widget.SwipeRefreshLayout"], + ["android.support.v4.widget.TextViewCompat", "androidx.core.widget.TextViewCompat"], + ["android.support.v4.widget.TintableCompoundButton", "androidx.core.widget.TintableCompoundButton"], + ["android.support.v4.widget.TintableImageSourceView", "androidx.core.widget.TintableImageSourceView"], + ["android.support.v4.widget.ViewDragHelper", "androidx.customview.widget.ViewDragHelper"], + ["android.support.v4.widget.ViewGroupUtils", "androidx.coordinatorlayout.widget.ViewGroupUtils"], + ["android.support.v7.app.ActionBar", "androidx.appcompat.app.ActionBar"], + ["android.support.v7.app.ActionBarDrawerToggle", "androidx.appcompat.app.ActionBarDrawerToggle"], + ["android.support.v7.app.ActionBarDrawerToggleHoneycomb", "androidx.appcompat.app.ActionBarDrawerToggleHoneycomb"], + ["android.support.v7.app.AlertController", "androidx.appcompat.app.AlertController"], + ["android.support.v7.app.AlertDialog", "androidx.appcompat.app.AlertDialog"], + ["android.support.v7.app.AppCompatActivity", "androidx.appcompat.app.AppCompatActivity"], + ["android.support.v7.app.AppCompatCallback", "androidx.appcompat.app.AppCompatCallback"], + ["android.support.v7.app.AppCompatDelegate", "androidx.appcompat.app.AppCompatDelegate"], + ["android.support.v7.app.AppCompatDelegateImpl", "androidx.appcompat.app.AppCompatDelegateImpl"], + ["android.support.v7.app.AppCompatDialog", "androidx.appcompat.app.AppCompatDialog"], + ["android.support.v7.app.AppCompatDialogFragment", "androidx.appcompat.app.AppCompatDialogFragment"], + ["android.support.v7.app.AppCompatViewInflater", "androidx.appcompat.app.AppCompatViewInflater"], + ["android.support.v7.app.MediaRouteActionProvider", "androidx.mediarouter.app.MediaRouteActionProvider"], + ["android.support.v7.app.MediaRouteButton", "androidx.mediarouter.app.MediaRouteButton"], + ["android.support.v7.app.MediaRouteCastDialog", "androidx.mediarouter.app.MediaRouteCastDialog"], + ["android.support.v7.app.MediaRouteChooserDialog", "androidx.mediarouter.app.MediaRouteChooserDialog"], + ["android.support.v7.app.MediaRouteChooserDialogFragment", "androidx.mediarouter.app.MediaRouteChooserDialogFragment"], + ["android.support.v7.app.MediaRouteControllerDialog", "androidx.mediarouter.app.MediaRouteControllerDialog"], + ["android.support.v7.app.MediaRouteControllerDialogFragment", "androidx.mediarouter.app.MediaRouteControllerDialogFragment"], + ["android.support.v7.app.MediaRouteDevicePickerDialog", "androidx.mediarouter.app.MediaRouteDevicePickerDialog"], + ["android.support.v7.app.MediaRouteDialogFactory", "androidx.mediarouter.app.MediaRouteDialogFactory"], + ["android.support.v7.app.MediaRouteDialogHelper", "androidx.mediarouter.app.MediaRouteDialogHelper"], + ["android.support.v7.app.MediaRouteDiscoveryFragment", "androidx.mediarouter.app.MediaRouteDiscoveryFragment"], + ["android.support.v7.app.MediaRouteExpandCollapseButton", "androidx.mediarouter.app.MediaRouteExpandCollapseButton"], + ["android.support.v7.app.MediaRouterThemeHelper", "androidx.mediarouter.app.MediaRouterThemeHelper"], + ["android.support.v7.app.MediaRouteVolumeSlider", "androidx.mediarouter.app.MediaRouteVolumeSlider"], + ["android.support.v7.app.NavItemSelectedListener", "androidx.appcompat.app.NavItemSelectedListener"], + ["android.support.v7.app.OverlayListView", "androidx.mediarouter.app.OverlayListView"], + ["android.support.v7.app.ResourcesFlusher", "androidx.appcompat.app.ResourcesFlusher"], + ["android.support.v7.app.ToolbarActionBar", "androidx.appcompat.app.ToolbarActionBar"], + ["android.support.v7.app.TwilightCalculator", "androidx.appcompat.app.TwilightCalculator"], + ["android.support.v7.app.TwilightManager", "androidx.appcompat.app.TwilightManager"], + ["android.support.v7.app.WindowDecorActionBar", "androidx.appcompat.app.WindowDecorActionBar"], + ["android.support.v7.appcompat.R", "androidx.appcompat.R"], + ["android.support.v7.cardview.R", "androidx.cardview.R"], + ["android.support.v7.content.res.AppCompatResources", "androidx.appcompat.content.res.AppCompatResources"], + ["android.support.v7.graphics.ColorCutQuantizer", "androidx.palette.graphics.ColorCutQuantizer"], + ["android.support.v7.graphics.drawable.AnimatedStateListDrawableCompat", "androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat"], + ["android.support.v7.graphics.drawable.DrawableContainer", "androidx.appcompat.graphics.drawable.DrawableContainer"], + ["android.support.v7.graphics.drawable.DrawableWrapper", "androidx.appcompat.graphics.drawable.DrawableWrapper"], + ["android.support.v7.graphics.drawable.DrawerArrowDrawable", "androidx.appcompat.graphics.drawable.DrawerArrowDrawable"], + ["android.support.v7.graphics.drawable.StateListDrawable", "androidx.appcompat.graphics.drawable.StateListDrawable"], + ["android.support.v7.graphics.Palette", "androidx.palette.graphics.Palette"], + ["android.support.v7.graphics.Target", "androidx.palette.graphics.Target"], + ["android.support.v7.gridlayout.R", "androidx.gridlayout.R"], + ["android.support.v7.internal.widget.PreferenceImageView", "androidx.preference.internal.PreferenceImageView"], + ["android.support.v7.media.MediaControlIntent", "androidx.mediarouter.media.MediaControlIntent"], + ["android.support.v7.media.MediaItemMetadata", "androidx.mediarouter.media.MediaItemMetadata"], + ["android.support.v7.media.MediaItemStatus", "androidx.mediarouter.media.MediaItemStatus"], + ["android.support.v7.media.MediaRouteDescriptor", "androidx.mediarouter.media.MediaRouteDescriptor"], + ["android.support.v7.media.MediaRouteDiscoveryRequest", "androidx.mediarouter.media.MediaRouteDiscoveryRequest"], + ["android.support.v7.media.MediaRouteProvider", "androidx.mediarouter.media.MediaRouteProvider"], + ["android.support.v7.media.MediaRouteProviderDescriptor", "androidx.mediarouter.media.MediaRouteProviderDescriptor"], + ["android.support.v7.media.MediaRouteProviderProtocol", "androidx.mediarouter.media.MediaRouteProviderProtocol"], + ["android.support.v7.media.MediaRouteProviderService", "androidx.mediarouter.media.MediaRouteProviderService"], + ["android.support.v7.media.MediaRouter", "androidx.mediarouter.media.MediaRouter"], + ["android.support.v7.media.MediaRouterApi24", "androidx.mediarouter.media.MediaRouterApi24"], + ["android.support.v7.media.MediaRouterJellybean", "androidx.mediarouter.media.MediaRouterJellybean"], + ["android.support.v7.media.MediaRouterJellybeanMr1", "androidx.mediarouter.media.MediaRouterJellybeanMr1"], + ["android.support.v7.media.MediaRouterJellybeanMr2", "androidx.mediarouter.media.MediaRouterJellybeanMr2"], + ["android.support.v7.media.MediaRouteSelector", "androidx.mediarouter.media.MediaRouteSelector"], + ["android.support.v7.media.MediaSessionStatus", "androidx.mediarouter.media.MediaSessionStatus"], + ["android.support.v7.media.RegisteredMediaRouteProvider", "androidx.mediarouter.media.RegisteredMediaRouteProvider"], + ["android.support.v7.media.RegisteredMediaRouteProviderWatcher", "androidx.mediarouter.media.RegisteredMediaRouteProviderWatcher"], + ["android.support.v7.media.RemoteControlClientCompat", "androidx.mediarouter.media.RemoteControlClientCompat"], + ["android.support.v7.media.RemotePlaybackClient", "androidx.mediarouter.media.RemotePlaybackClient"], + ["android.support.v7.media.RouteMediaPlayerConnector", "androidx.mediarouter.media.RouteMediaPlayerConnector"], + ["android.support.v7.media.SystemMediaRouteProvider", "androidx.mediarouter.media.SystemMediaRouteProvider"], + ["android.support.v7.mediarouter.R", "androidx.mediarouter.R"], + ["android.support.v7.preference.AndroidResources", "androidx.preference.AndroidResources"], + ["android.support.v7.preference.CheckBoxPreference", "androidx.preference.CheckBoxPreference"], + ["android.support.v7.preference.CollapsiblePreferenceGroupController", "androidx.preference.CollapsiblePreferenceGroupController"], + ["android.support.v7.preference.DialogPreference", "androidx.preference.DialogPreference"], + ["android.support.v7.preference.DropDownPreference", "androidx.preference.DropDownPreference"], + ["android.support.v7.preference.EditTextPreference", "androidx.preference.EditTextPreference"], + ["android.support.v7.preference.EditTextPreferenceDialogFragmentCompat", "androidx.preference.EditTextPreferenceDialogFragmentCompat"], + ["android.support.v7.preference.internal.AbstractMultiSelectListPreference", "androidx.preference.internal.AbstractMultiSelectListPreference"], + ["android.support.v7.preference.ListPreference", "androidx.preference.ListPreference"], + ["android.support.v7.preference.ListPreferenceDialogFragmentCompat", "androidx.preference.ListPreferenceDialogFragmentCompat"], + ["android.support.v7.preference.MultiSelectListPreferenceDialogFragmentCompat", "androidx.preference.MultiSelectListPreferenceDialogFragmentCompat"], + ["android.support.v7.preference.Preference", "androidx.preference.Preference"], + ["android.support.v7.preference.PreferenceCategory", "androidx.preference.PreferenceCategory"], + ["android.support.v7.preference.PreferenceDataStore", "androidx.preference.PreferenceDataStore"], + ["android.support.v7.preference.PreferenceDialogFragmentCompat", "androidx.preference.PreferenceDialogFragmentCompat"], + ["android.support.v7.preference.PreferenceFragmentCompat", "androidx.preference.PreferenceFragmentCompat"], + ["android.support.v7.preference.PreferenceGroup", "androidx.preference.PreferenceGroup"], + ["android.support.v7.preference.PreferenceGroupAdapter", "androidx.preference.PreferenceGroupAdapter"], + ["android.support.v7.preference.PreferenceInflater", "androidx.preference.PreferenceInflater"], + ["android.support.v7.preference.PreferenceManager", "androidx.preference.PreferenceManager"], + ["android.support.v7.preference.PreferenceRecyclerViewAccessibilityDelegate", "androidx.preference.PreferenceRecyclerViewAccessibilityDelegate"], + ["android.support.v7.preference.PreferenceScreen", "androidx.preference.PreferenceScreen"], + ["android.support.v7.preference.PreferenceViewHolder", "androidx.preference.PreferenceViewHolder"], + ["android.support.v7.preference.R", "androidx.preference.R"], + ["android.support.v7.preference.SeekBarPreference", "androidx.preference.SeekBarPreference"], + ["android.support.v7.preference.SwitchPreferenceCompat", "androidx.preference.SwitchPreferenceCompat"], + ["android.support.v7.preference.TwoStatePreference", "androidx.preference.TwoStatePreference"], + ["android.support.v7.preference.UnPressableLinearLayout", "androidx.preference.UnPressableLinearLayout"], + ["android.support.v7.recyclerview.extensions.AsyncDifferConfig", "androidx.recyclerview.widget.AsyncDifferConfig"], + ["android.support.v7.recyclerview.extensions.AsyncListDiffer", "androidx.recyclerview.widget.AsyncListDiffer"], + ["android.support.v7.recyclerview.extensions.ListAdapter", "androidx.recyclerview.widget.ListAdapter"], + ["android.support.v7.recyclerview.R", "androidx.recyclerview.R"], + ["android.support.v7.text.AllCapsTransformationMethod", "androidx.appcompat.text.AllCapsTransformationMethod"], + ["android.support.v7.util.AdapterListUpdateCallback", "androidx.recyclerview.widget.AdapterListUpdateCallback"], + ["android.support.v7.util.AsyncListUtil", "androidx.recyclerview.widget.AsyncListUtil"], + ["android.support.v7.util.BatchingListUpdateCallback", "androidx.recyclerview.widget.BatchingListUpdateCallback"], + ["android.support.v7.util.DiffUtil", "androidx.recyclerview.widget.DiffUtil"], + ["android.support.v7.util.ListUpdateCallback", "androidx.recyclerview.widget.ListUpdateCallback"], + ["android.support.v7.util.MessageThreadUtil", "androidx.recyclerview.widget.MessageThreadUtil"], + ["android.support.v7.util.SortedList", "androidx.recyclerview.widget.SortedList"], + ["android.support.v7.util.ThreadUtil", "androidx.recyclerview.widget.ThreadUtil"], + ["android.support.v7.util.TileList", "androidx.recyclerview.widget.TileList"], + ["android.support.v7.view.ActionBarPolicy", "androidx.appcompat.view.ActionBarPolicy"], + ["android.support.v7.view.ActionMode", "androidx.appcompat.view.ActionMode"], + ["android.support.v7.view.CollapsibleActionView", "androidx.appcompat.view.CollapsibleActionView"], + ["android.support.v7.view.ContextThemeWrapper", "androidx.appcompat.view.ContextThemeWrapper"], + ["android.support.v7.view.menu.ActionMenuItem", "androidx.appcompat.view.menu.ActionMenuItem"], + ["android.support.v7.view.menu.ActionMenuItemView", "androidx.appcompat.view.menu.ActionMenuItemView"], + ["android.support.v7.view.menu.BaseMenuPresenter", "androidx.appcompat.view.menu.BaseMenuPresenter"], + ["android.support.v7.view.menu.BaseMenuWrapper", "androidx.appcompat.view.menu.BaseMenuWrapper"], + ["android.support.v7.view.menu.BaseWrapper", "androidx.appcompat.view.menu.BaseWrapper"], + ["android.support.v7.view.menu.CascadingMenuPopup", "androidx.appcompat.view.menu.CascadingMenuPopup"], + ["android.support.v7.view.menu.ExpandedMenuView", "androidx.appcompat.view.menu.ExpandedMenuView"], + ["android.support.v7.view.menu.ListMenuItemView", "androidx.appcompat.view.menu.ListMenuItemView"], + ["android.support.v7.view.menu.ListMenuPresenter", "androidx.appcompat.view.menu.ListMenuPresenter"], + ["android.support.v7.view.menu.MenuAdapter", "androidx.appcompat.view.menu.MenuAdapter"], + ["android.support.v7.view.menu.MenuBuilder", "androidx.appcompat.view.menu.MenuBuilder"], + ["android.support.v7.view.menu.MenuDialogHelper", "androidx.appcompat.view.menu.MenuDialogHelper"], + ["android.support.v7.view.menu.MenuHelper", "androidx.appcompat.view.menu.MenuHelper"], + ["android.support.v7.view.menu.MenuItemImpl", "androidx.appcompat.view.menu.MenuItemImpl"], + ["android.support.v7.view.menu.MenuItemWrapperICS", "androidx.appcompat.view.menu.MenuItemWrapperICS"], + ["android.support.v7.view.menu.MenuItemWrapperJB", "androidx.appcompat.view.menu.MenuItemWrapperJB"], + ["android.support.v7.view.menu.MenuPopup", "androidx.appcompat.view.menu.MenuPopup"], + ["android.support.v7.view.menu.MenuPopupHelper", "androidx.appcompat.view.menu.MenuPopupHelper"], + ["android.support.v7.view.menu.MenuPresenter", "androidx.appcompat.view.menu.MenuPresenter"], + ["android.support.v7.view.menu.MenuView", "androidx.appcompat.view.menu.MenuView"], + ["android.support.v7.view.menu.MenuWrapperFactory", "androidx.appcompat.view.menu.MenuWrapperFactory"], + ["android.support.v7.view.menu.MenuWrapperICS", "androidx.appcompat.view.menu.MenuWrapperICS"], + ["android.support.v7.view.menu.ShowableListMenu", "androidx.appcompat.view.menu.ShowableListMenu"], + ["android.support.v7.view.menu.StandardMenuPopup", "androidx.appcompat.view.menu.StandardMenuPopup"], + ["android.support.v7.view.menu.SubMenuBuilder", "androidx.appcompat.view.menu.SubMenuBuilder"], + ["android.support.v7.view.menu.SubMenuWrapperICS", "androidx.appcompat.view.menu.SubMenuWrapperICS"], + ["android.support.v7.view.StandaloneActionMode", "androidx.appcompat.view.StandaloneActionMode"], + ["android.support.v7.view.SupportActionModeWrapper", "androidx.appcompat.view.SupportActionModeWrapper"], + ["android.support.v7.view.SupportMenuInflater", "androidx.appcompat.view.SupportMenuInflater"], + ["android.support.v7.view.ViewPropertyAnimatorCompatSet", "androidx.appcompat.view.ViewPropertyAnimatorCompatSet"], + ["android.support.v7.view.WindowCallbackWrapper", "androidx.appcompat.view.WindowCallbackWrapper"], + ["android.support.v7.widget.AbsActionBarView", "androidx.appcompat.widget.AbsActionBarView"], + ["android.support.v7.widget.ActionBarBackgroundDrawable", "androidx.appcompat.widget.ActionBarBackgroundDrawable"], + ["android.support.v7.widget.ActionBarContainer", "androidx.appcompat.widget.ActionBarContainer"], + ["android.support.v7.widget.ActionBarContextView", "androidx.appcompat.widget.ActionBarContextView"], + ["android.support.v7.widget.ActionBarOverlayLayout", "androidx.appcompat.widget.ActionBarOverlayLayout"], + ["android.support.v7.widget.ActionMenuPresenter", "androidx.appcompat.widget.ActionMenuPresenter"], + ["android.support.v7.widget.ActionMenuView", "androidx.appcompat.widget.ActionMenuView"], + ["android.support.v7.widget.ActivityChooserModel", "androidx.appcompat.widget.ActivityChooserModel"], + ["android.support.v7.widget.ActivityChooserView", "androidx.appcompat.widget.ActivityChooserView"], + ["android.support.v7.widget.AdapterHelper", "androidx.recyclerview.widget.AdapterHelper"], + ["android.support.v7.widget.AlertDialogLayout", "androidx.appcompat.widget.AlertDialogLayout"], + ["android.support.v7.widget.AppCompatAutoCompleteTextView", "androidx.appcompat.widget.AppCompatAutoCompleteTextView"], + ["android.support.v7.widget.AppCompatBackgroundHelper", "androidx.appcompat.widget.AppCompatBackgroundHelper"], + ["android.support.v7.widget.AppCompatButton", "androidx.appcompat.widget.AppCompatButton"], + ["android.support.v7.widget.AppCompatCheckBox", "androidx.appcompat.widget.AppCompatCheckBox"], + ["android.support.v7.widget.AppCompatCheckedTextView", "androidx.appcompat.widget.AppCompatCheckedTextView"], + ["android.support.v7.widget.AppCompatCompoundButtonHelper", "androidx.appcompat.widget.AppCompatCompoundButtonHelper"], + ["android.support.v7.widget.AppCompatDrawableManager", "androidx.appcompat.widget.AppCompatDrawableManager"], + ["android.support.v7.widget.AppCompatEditText", "androidx.appcompat.widget.AppCompatEditText"], + ["android.support.v7.widget.AppCompatHintHelper", "androidx.appcompat.widget.AppCompatHintHelper"], + ["android.support.v7.widget.AppCompatImageButton", "androidx.appcompat.widget.AppCompatImageButton"], + ["android.support.v7.widget.AppCompatImageHelper", "androidx.appcompat.widget.AppCompatImageHelper"], + ["android.support.v7.widget.AppCompatImageView", "androidx.appcompat.widget.AppCompatImageView"], + ["android.support.v7.widget.AppCompatMultiAutoCompleteTextView", "androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView"], + ["android.support.v7.widget.AppCompatPopupWindow", "androidx.appcompat.widget.AppCompatPopupWindow"], + ["android.support.v7.widget.AppCompatProgressBarHelper", "androidx.appcompat.widget.AppCompatProgressBarHelper"], + ["android.support.v7.widget.AppCompatRadioButton", "androidx.appcompat.widget.AppCompatRadioButton"], + ["android.support.v7.widget.AppCompatRatingBar", "androidx.appcompat.widget.AppCompatRatingBar"], + ["android.support.v7.widget.AppCompatSeekBar", "androidx.appcompat.widget.AppCompatSeekBar"], + ["android.support.v7.widget.AppCompatSeekBarHelper", "androidx.appcompat.widget.AppCompatSeekBarHelper"], + ["android.support.v7.widget.AppCompatSpinner", "androidx.appcompat.widget.AppCompatSpinner"], + ["android.support.v7.widget.AppCompatTextHelper", "androidx.appcompat.widget.AppCompatTextHelper"], + ["android.support.v7.widget.AppCompatTextView", "androidx.appcompat.widget.AppCompatTextView"], + ["android.support.v7.widget.AppCompatTextViewAutoSizeHelper", "androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper"], + ["android.support.v7.widget.ButtonBarLayout", "androidx.appcompat.widget.ButtonBarLayout"], + ["android.support.v7.widget.CardView", "androidx.cardview.widget.CardView"], + ["android.support.v7.widget.CardViewApi17Impl", "androidx.cardview.widget.CardViewApi17Impl"], + ["android.support.v7.widget.CardViewApi21Impl", "androidx.cardview.widget.CardViewApi21Impl"], + ["android.support.v7.widget.CardViewBaseImpl", "androidx.cardview.widget.CardViewBaseImpl"], + ["android.support.v7.widget.CardViewDelegate", "androidx.cardview.widget.CardViewDelegate"], + ["android.support.v7.widget.CardViewImpl", "androidx.cardview.widget.CardViewImpl"], + ["android.support.v7.widget.ChildHelper", "androidx.recyclerview.widget.ChildHelper"], + ["android.support.v7.widget.ContentFrameLayout", "androidx.appcompat.widget.ContentFrameLayout"], + ["android.support.v7.widget.DecorContentParent", "androidx.appcompat.widget.DecorContentParent"], + ["android.support.v7.widget.DecorToolbar", "androidx.appcompat.widget.DecorToolbar"], + ["android.support.v7.widget.DefaultItemAnimator", "androidx.recyclerview.widget.DefaultItemAnimator"], + ["android.support.v7.widget.DialogTitle", "androidx.appcompat.widget.DialogTitle"], + ["android.support.v7.widget.DividerItemDecoration", "androidx.recyclerview.widget.DividerItemDecoration"], + ["android.support.v7.widget.DrawableUtils", "androidx.appcompat.widget.DrawableUtils"], + ["android.support.v7.widget.DropDownListView", "androidx.appcompat.widget.DropDownListView"], + ["android.support.v7.widget.FastScroller", "androidx.recyclerview.widget.FastScroller"], + ["android.support.v7.widget.FitWindowsFrameLayout", "androidx.appcompat.widget.FitWindowsFrameLayout"], + ["android.support.v7.widget.FitWindowsLinearLayout", "androidx.appcompat.widget.FitWindowsLinearLayout"], + ["android.support.v7.widget.FitWindowsViewGroup", "androidx.appcompat.widget.FitWindowsViewGroup"], + ["android.support.v7.widget.ForwardingListener", "androidx.appcompat.widget.ForwardingListener"], + ["android.support.v7.widget.GapWorker", "androidx.recyclerview.widget.GapWorker"], + ["android.support.v7.widget.GridLayout", "androidx.gridlayout.widget.GridLayout"], + ["android.support.v7.widget.GridLayoutManager", "androidx.recyclerview.widget.GridLayoutManager"], + ["android.support.v7.widget.helper.ItemTouchHelper", "androidx.recyclerview.widget.ItemTouchHelper"], + ["android.support.v7.widget.helper.ItemTouchUIUtil", "androidx.recyclerview.widget.ItemTouchUIUtil"], + ["android.support.v7.widget.helper.ItemTouchUIUtilImpl", "androidx.recyclerview.widget.ItemTouchUIUtilImpl"], + ["android.support.v7.widget.LayoutState", "androidx.recyclerview.widget.LayoutState"], + ["android.support.v7.widget.LinearLayoutCompat", "androidx.appcompat.widget.LinearLayoutCompat"], + ["android.support.v7.widget.LinearLayoutManager", "androidx.recyclerview.widget.LinearLayoutManager"], + ["android.support.v7.widget.LinearSmoothScroller", "androidx.recyclerview.widget.LinearSmoothScroller"], + ["android.support.v7.widget.LinearSnapHelper", "androidx.recyclerview.widget.LinearSnapHelper"], + ["android.support.v7.widget.ListPopupWindow", "androidx.appcompat.widget.ListPopupWindow"], + ["android.support.v7.widget.MenuItemHoverListener", "androidx.appcompat.widget.MenuItemHoverListener"], + ["android.support.v7.widget.MenuPopupWindow", "androidx.appcompat.widget.MenuPopupWindow"], + ["android.support.v7.widget.OpReorderer", "androidx.recyclerview.widget.OpReorderer"], + ["android.support.v7.widget.OrientationHelper", "androidx.recyclerview.widget.OrientationHelper"], + ["android.support.v7.widget.PagerSnapHelper", "androidx.recyclerview.widget.PagerSnapHelper"], + ["android.support.v7.widget.PopupMenu", "androidx.appcompat.widget.PopupMenu"], + ["android.support.v7.widget.RecyclerView", "androidx.recyclerview.widget.RecyclerView"], + ["android.support.v7.widget.RecyclerViewAccessibilityDelegate", "androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate"], + ["android.support.v7.widget.ResourcesWrapper", "androidx.appcompat.widget.ResourcesWrapper"], + ["android.support.v7.widget.RoundRectDrawable", "androidx.cardview.widget.RoundRectDrawable"], + ["android.support.v7.widget.RoundRectDrawableWithShadow", "androidx.cardview.widget.RoundRectDrawableWithShadow"], + ["android.support.v7.widget.RtlSpacingHelper", "androidx.appcompat.widget.RtlSpacingHelper"], + ["android.support.v7.widget.ScrollbarHelper", "androidx.recyclerview.widget.ScrollbarHelper"], + ["android.support.v7.widget.ScrollingTabContainerView", "androidx.appcompat.widget.ScrollingTabContainerView"], + ["android.support.v7.widget.SearchView", "androidx.appcompat.widget.SearchView"], + ["android.support.v7.widget.ShareActionProvider", "androidx.appcompat.widget.ShareActionProvider"], + ["android.support.v7.widget.SimpleItemAnimator", "androidx.recyclerview.widget.SimpleItemAnimator"], + ["android.support.v7.widget.SnapHelper", "androidx.recyclerview.widget.SnapHelper"], + ["android.support.v7.widget.StaggeredGridLayoutManager", "androidx.recyclerview.widget.StaggeredGridLayoutManager"], + ["android.support.v7.widget.SuggestionsAdapter", "androidx.appcompat.widget.SuggestionsAdapter"], + ["android.support.v7.widget.SwitchCompat", "androidx.appcompat.widget.SwitchCompat"], + ["android.support.v7.widget.ThemedSpinnerAdapter", "androidx.appcompat.widget.ThemedSpinnerAdapter"], + ["android.support.v7.widget.ThemeUtils", "androidx.appcompat.widget.ThemeUtils"], + ["android.support.v7.widget.TintContextWrapper", "androidx.appcompat.widget.TintContextWrapper"], + ["android.support.v7.widget.TintInfo", "androidx.appcompat.widget.TintInfo"], + ["android.support.v7.widget.TintResources", "androidx.appcompat.widget.TintResources"], + ["android.support.v7.widget.TintTypedArray", "androidx.appcompat.widget.TintTypedArray"], + ["android.support.v7.widget.Toolbar", "androidx.appcompat.widget.Toolbar"], + ["android.support.v7.widget.ToolbarWidgetWrapper", "androidx.appcompat.widget.ToolbarWidgetWrapper"], + ["android.support.v7.widget.TooltipCompat", "androidx.appcompat.widget.TooltipCompat"], + ["android.support.v7.widget.TooltipCompatHandler", "androidx.appcompat.widget.TooltipCompatHandler"], + ["android.support.v7.widget.TooltipPopup", "androidx.appcompat.widget.TooltipPopup"], + ["android.support.v7.widget.util.SortedListAdapterCallback", "androidx.recyclerview.widget.SortedListAdapterCallback"], + ["android.support.v7.widget.VectorEnabledTintResources", "androidx.appcompat.widget.VectorEnabledTintResources"], + ["android.support.v7.widget.ViewBoundsCheck", "androidx.recyclerview.widget.ViewBoundsCheck"], + ["android.support.v7.widget.ViewInfoStore", "androidx.recyclerview.widget.ViewInfoStore"], + ["android.support.v7.widget.ViewStubCompat", "androidx.appcompat.widget.ViewStubCompat"], + ["android.support.v7.widget.ViewUtils", "androidx.appcompat.widget.ViewUtils"], + ["android.support.v7.widget.WithHint", "androidx.appcompat.widget.WithHint"], + ["android.support.wear.activity.ConfirmationActivity", "androidx.wear.activity.ConfirmationActivity"], + ["android.support.wear.ambient.AmbientDelegate", "androidx.wear.ambient.AmbientDelegate"], + ["android.support.wear.ambient.AmbientMode", "androidx.wear.ambient.AmbientMode"], + ["android.support.wear.ambient.AmbientModeSupport", "androidx.wear.ambient.AmbientModeSupport"], + ["android.support.wear.ambient.SharedLibraryVersion", "androidx.wear.ambient.SharedLibraryVersion"], + ["android.support.wear.ambient.WearableControllerProvider", "androidx.wear.ambient.WearableControllerProvider"], + ["android.support.wear.internal.widget.drawer.MultiPagePresenter", "androidx.wear.internal.widget.drawer.MultiPagePresenter"], + ["android.support.wear.internal.widget.drawer.MultiPageUi", "androidx.wear.internal.widget.drawer.MultiPageUi"], + ["android.support.wear.internal.widget.drawer.SinglePagePresenter", "androidx.wear.internal.widget.drawer.SinglePagePresenter"], + ["android.support.wear.internal.widget.drawer.SinglePageUi", "androidx.wear.internal.widget.drawer.SinglePageUi"], + ["android.support.wear.internal.widget.drawer.WearableNavigationDrawerPresenter", "androidx.wear.internal.widget.drawer.WearableNavigationDrawerPresenter"], + ["android.support.wear.internal.widget.ResourcesUtil", "androidx.wear.internal.widget.ResourcesUtil"], + ["android.support.wear.R", "androidx.wear.R"], + ["android.support.wear.utils.MetadataConstants", "androidx.wear.utils.MetadataConstants"], + ["android.support.wear.widget.BezierSCurveInterpolator", "androidx.wear.widget.BezierSCurveInterpolator"], + ["android.support.wear.widget.BoxInsetLayout", "androidx.wear.widget.BoxInsetLayout"], + ["android.support.wear.widget.CircledImageView", "androidx.wear.widget.CircledImageView"], + ["android.support.wear.widget.CircularProgressLayout", "androidx.wear.widget.CircularProgressLayout"], + ["android.support.wear.widget.CircularProgressLayoutController", "androidx.wear.widget.CircularProgressLayoutController"], + ["android.support.wear.widget.ConfirmationOverlay", "androidx.wear.widget.ConfirmationOverlay"], + ["android.support.wear.widget.CurvingLayoutCallback", "androidx.wear.widget.CurvingLayoutCallback"], + ["android.support.wear.widget.drawer.AbsListViewFlingWatcher", "androidx.wear.widget.drawer.AbsListViewFlingWatcher"], + ["android.support.wear.widget.drawer.FlingWatcherFactory", "androidx.wear.widget.drawer.FlingWatcherFactory"], + ["android.support.wear.widget.drawer.NestedScrollViewFlingWatcher", "androidx.wear.widget.drawer.NestedScrollViewFlingWatcher"], + ["android.support.wear.widget.drawer.PageIndicatorView", "androidx.wear.widget.drawer.PageIndicatorView"], + ["android.support.wear.widget.drawer.RecyclerViewFlingWatcher", "androidx.wear.widget.drawer.RecyclerViewFlingWatcher"], + ["android.support.wear.widget.drawer.ScrollViewFlingWatcher", "androidx.wear.widget.drawer.ScrollViewFlingWatcher"], + ["android.support.wear.widget.drawer.WearableActionDrawerMenu", "androidx.wear.widget.drawer.WearableActionDrawerMenu"], + ["android.support.wear.widget.drawer.WearableActionDrawerView", "androidx.wear.widget.drawer.WearableActionDrawerView"], + ["android.support.wear.widget.drawer.WearableDrawerController", "androidx.wear.widget.drawer.WearableDrawerController"], + ["android.support.wear.widget.drawer.WearableDrawerLayout", "androidx.wear.widget.drawer.WearableDrawerLayout"], + ["android.support.wear.widget.drawer.WearableDrawerView", "androidx.wear.widget.drawer.WearableDrawerView"], + ["android.support.wear.widget.drawer.WearableNavigationDrawerView", "androidx.wear.widget.drawer.WearableNavigationDrawerView"], + ["android.support.wear.widget.ProgressDrawable", "androidx.wear.widget.ProgressDrawable"], + ["android.support.wear.widget.ResourcesUtil", "androidx.wear.widget.ResourcesUtil"], + ["android.support.wear.widget.RoundedDrawable", "androidx.wear.widget.RoundedDrawable"], + ["android.support.wear.widget.ScrollManager", "androidx.wear.widget.ScrollManager"], + ["android.support.wear.widget.SimpleAnimatorListener", "androidx.wear.widget.SimpleAnimatorListener"], + ["android.support.wear.widget.SwipeDismissFrameLayout", "androidx.wear.widget.SwipeDismissFrameLayout"], + ["android.support.wear.widget.SwipeDismissLayout", "androidx.wear.widget.SwipeDismissLayout"], + ["android.support.wear.widget.WearableLinearLayoutManager", "androidx.wear.widget.WearableLinearLayoutManager"], + ["android.support.wear.widget.WearableRecyclerView", "androidx.wear.widget.WearableRecyclerView"], + ["com.google.android.gms.maps.model", "com.google.android.libraries.maps.model"], + ["com.google.android.gms.maps", "com.google.android.libraries.maps"] + ] + + if (!useAndroidX) { + def tmp; + def listN = list.size() + for (int i = 0; i < listN; i++) { + tmp = list[i][0] + list[i][0] = list[i][1] + list[i][1] = tmp + } + } + return list +} + +def getDependencyCvtList(useAndroidX) { + def list = [ + ["androidx.arch.core:core-common:2.0.0-rc01", "androidx.arch.core:core-common:2.0.0-rc01"], + ["androidx.arch.core:core:2.0.0-rc01", "androidx.arch.core:core:2.0.0-rc01"], + ["androidx.arch.core:core:2.0.0-rc01-testing", "androidx.arch.core:core:2.0.0-rc01-testing"], + ["androidx.arch.core:core-runtime:2.0.0-rc01", "androidx.arch.core:core-runtime:2.0.0-rc01"], + ["androidx.lifecycle:lifecycle-common:2.0.0-rc01", "androidx.lifecycle:lifecycle-common:2.0.0-rc01"], + ["androidx.lifecycle:lifecycle-common:2.0.0-rc01-java8", "androidx.lifecycle:lifecycle-common:2.0.0-rc01-java8"], + ["androidx.lifecycle:lifecycle-compiler:2.0.0-rc01", "androidx.lifecycle:lifecycle-compiler:2.0.0-rc01"], + ["androidx.lifecycle:lifecycle-extensions:2.0.0-rc01", "androidx.lifecycle:lifecycle-extensions:2.0.0-rc01"], + ["androidx.lifecycle:lifecycle-livedata:2.0.0-rc01", "androidx.lifecycle:lifecycle-livedata:2.0.0-rc01"], + ["androidx.lifecycle:lifecycle-livedata:2.0.0-rc01-core", "androidx.lifecycle:lifecycle-livedata:2.0.0-rc01-core"], + ["androidx.lifecycle:lifecycle-reactivestreams:2.0.0-rc01", "androidx.lifecycle:lifecycle-reactivestreams:2.0.0-rc01"], + ["androidx.lifecycle:lifecycle-runtime:2.0.0-rc01", "androidx.lifecycle:lifecycle-runtime:2.0.0-rc01"], + ["androidx.lifecycle:lifecycle-viewmodel:2.0.0-rc01", "androidx.lifecycle:lifecycle-viewmodel:2.0.0-rc01"], + ["androidx.paging:paging-common:2.0.0-rc01", "androidx.paging:paging-common:2.0.0-rc01"], + ["androidx.paging:paging-runtime:2.0.0-rc01", "androidx.paging:paging-runtime:2.0.0-rc01"], + ["androidx.paging:paging-rxjava2:2.0.0-rc01", "androidx.paging:paging-rxjava2:2.0.0-rc01"], + ["androidx.room:room-common:2.0.0-rc01", "androidx.room:room-common:2.0.0-rc01"], + ["androidx.room:room-compiler:2.0.0-rc01", "androidx.room:room-compiler:2.0.0-rc01"], + ["androidx.room:room-guava:2.0.0-rc01", "androidx.room:room-guava:2.0.0-rc01"], + ["androidx.room:room-migration:2.0.0-rc01", "androidx.room:room-migration:2.0.0-rc01"], + ["androidx.room:room-runtime:2.0.0-rc01", "androidx.room:room-runtime:2.0.0-rc01"], + ["androidx.room:room-rxjava2:2.0.0-rc01", "androidx.room:room-rxjava2:2.0.0-rc01"], + ["androidx.room:room-testing:2.0.0-rc01", "androidx.room:room-testing:2.0.0-rc01"], + ["androidx.sqlite:sqlite:2.0.0-rc01", "androidx.sqlite:sqlite:2.0.0-rc01"], + ["androidx.sqlite:sqlite:2.0.0-rc01-framework", "androidx.sqlite:sqlite:2.0.0-rc01-framework"], + ["androidx.constraintlayout:constraintlayout:1.1.2", "androidx.constraintlayout:constraintlayout:1.1.2"], + ["androidx.constraintlayout:constraintlayout:1.1.2-solver", "androidx.constraintlayout:constraintlayout:1.1.2-solver"], + ["androidx.test.espresso.idling:idling-concurrent:3.1.0", "androidx.test.espresso.idling:idling-concurrent:3.1.0"], + ["androidx.test.espresso.idling:idling-net:3.1.0", "androidx.test.espresso.idling:idling-net:3.1.0"], + ["androidx.test.espresso:espresso-accessibility:3.1.0", "androidx.test.espresso:espresso-accessibility:3.1.0"], + ["androidx.test.espresso:espresso-contrib:3.1.0", "androidx.test.espresso:espresso-contrib:3.1.0"], + ["androidx.test.espresso:espresso-core:3.1.0", "androidx.test.espresso:espresso-core:3.1.0"], + ["androidx.test.espresso:espresso-idling-resource:3.1.0", "androidx.test.espresso:espresso-idling-resource:3.1.0"], + ["androidx.test.espresso:espresso-intents:3.1.0", "androidx.test.espresso:espresso-intents:3.1.0"], + ["androidx.test.espresso:espresso-remote:3.1.0", "androidx.test.espresso:espresso-remote:3.1.0"], + ["androidx.test.espresso:espresso-web:3.1.0", "androidx.test.espresso:espresso-web:3.1.0"], + ["androidx.test.jank:janktesthelper:1.0.1", "androidx.test.jank:janktesthelper:1.0.1"], + ["androidx.test:test-services:1.1.0", "androidx.test:test-services:1.1.0"], + ["androidx.test.uiautomator:uiautomator:2.2.0", "androidx.test.uiautomator:uiautomator:2.2.0"], + ["androidx.test:monitor:1.1.0", "androidx.test:monitor:1.1.0"], + ["androidx.test:orchestrator:1.1.0", "androidx.test:orchestrator:1.1.0"], + ["androidx.test:rules:1.1.0", "androidx.test:rules:1.1.0"], + ["androidx.test:runner:1.1.0", "androidx.test:runner:1.1.0"], + ["androidx.vectordrawable:vectordrawable-animated:1.0.0", "androidx.vectordrawable:vectordrawable-animated:1.0.0"], + ["androidx.appcompat:appcompat:1.0.0", "androidx.appcompat:appcompat:1.0.0"], + ["androidx.asynclayoutinflater:asynclayoutinflater:1.0.0", "androidx.asynclayoutinflater:asynclayoutinflater:1.0.0"], + ["androidx.car:car:1.0.0-alpha5", "androidx.car:car:1.0.0-alpha5"], + ["androidx.car:car:1.0.0-alpha5dview-v7", "androidx.car:car:1.0.0-alpha5dview-v7"], + ["androidx.collection:collection:1.0.0", "androidx.collection:collection:1.0.0"], + ["androidx.coordinatorlayout:coordinatorlayout:1.0.0", "androidx.coordinatorlayout:coordinatorlayout:1.0.0"], + ["androidx.cursoradapter:cursoradapter:1.0.0", "androidx.cursoradapter:cursoradapter:1.0.0"], + ["androidx.browser:browser:1.0.0", "androidx.browser:browser:1.0.0"], + ["androidx.customview:customview:1.0.0", "androidx.customview:customview:1.0.0"], + ["com.google.android.material:material:1.0.0-rc01", "com.google.android.material:material:1.0.0-rc01"], + ["androidx.documentfile:documentfile:1.0.0", "androidx.documentfile:documentfile:1.0.0"], + ["androidx.drawerlayout:drawerlayout:1.0.0", "androidx.drawerlayout:drawerlayout:1.0.0"], + ["androidx.exifinterface:exifinterface:1.0.0", "androidx.exifinterface:exifinterface:1.0.0"], + ["androidx.gridlayout:gridlayout:1.0.0", "androidx.gridlayout:gridlayout:1.0.0"], + ["androidx.heifwriter:heifwriter:1.0.0", "androidx.heifwriter:heifwriter:1.0.0"], + ["androidx.interpolator:interpolator:1.0.0", "androidx.interpolator:interpolator:1.0.0"], + ["androidx.leanback:leanback:1.0.0", "androidx.leanback:leanback:1.0.0"], + ["androidx.loader:loader:1.0.0", "androidx.loader:loader:1.0.0"], + ["androidx.localbroadcastmanager:localbroadcastmanager:1.0.0", "androidx.localbroadcastmanager:localbroadcastmanager:1.0.0"], + ["androidx.media2:media2:1.0.0-alpha03", "androidx.media2:media2:1.0.0-alpha03"], + ["androidx.media2:media2:1.0.0-alpha03-exoplayer", "androidx.media2:media2:1.0.0-alpha03-exoplayer"], + ["androidx.mediarouter:mediarouter:1.0.0", "androidx.mediarouter:mediarouter:1.0.0"], + ["androidx.multidex:multidex:2.0.0", "androidx.multidex:multidex:2.0.0"], + ["androidx.multidex:multidex:2.0.0-instrumentation", "androidx.multidex:multidex:2.0.0-instrumentation"], + ["androidx.palette:palette:1.0.0", "androidx.palette:palette:1.0.0"], + ["androidx.percentlayout:percentlayout:1.0.0", "androidx.percentlayout:percentlayout:1.0.0"], + ["androidx.leanback:leanback-preference:1.0.0", "androidx.leanback:leanback-preference:1.0.0"], + ["androidx.legacy:legacy-preference-v14:1.0.0", "androidx.legacy:legacy-preference-v14:1.0.0"], + ["androidx.preference:preference:1.0.0", "androidx.preference:preference:1.0.0"], + ["androidx.print:print:1.0.0", "androidx.print:print:1.0.0"], + ["androidx.recommendation:recommendation:1.0.0", "androidx.recommendation:recommendation:1.0.0"], + ["androidx.recyclerview:recyclerview-selection:1.0.0", "androidx.recyclerview:recyclerview-selection:1.0.0"], + ["androidx.recyclerview:recyclerview:1.0.0", "androidx.recyclerview:recyclerview:1.0.0"], + ["androidx.slice:slice-builders:1.0.0", "androidx.slice:slice-builders:1.0.0"], + ["androidx.slice:slice-core:1.0.0", "androidx.slice:slice-core:1.0.0"], + ["androidx.slice:slice-view:1.0.0", "androidx.slice:slice-view:1.0.0"], + ["androidx.slidingpanelayout:slidingpanelayout:1.0.0", "androidx.slidingpanelayout:slidingpanelayout:1.0.0"], + ["androidx.annotation:annotation:1.0.0", "androidx.annotation:annotation:1.0.0"], + ["androidx.core:core:1.0.0", "androidx.core:core:1.0.0"], + ["androidx.contentpager:contentpager:1.0.0", "androidx.contentpager:contentpager:1.0.0"], + ["androidx.legacy:legacy-support-core-ui:1.0.0", "androidx.legacy:legacy-support-core-ui:1.0.0"], + ["androidx.legacy:legacy-support-core-utils:1.0.0", "androidx.legacy:legacy-support-core-utils:1.0.0"], + ["androidx.dynamicanimation:dynamicanimation:1.0.0", "androidx.dynamicanimation:dynamicanimation:1.0.0"], + ["androidx.emoji:emoji:1.0.0", "androidx.emoji:emoji:1.0.0"], + ["androidx.emoji:emoji:1.0.0-appcompat", "androidx.emoji:emoji:1.0.0-appcompat"], + ["androidx.emoji:emoji:1.0.0-bundled", "androidx.emoji:emoji:1.0.0-bundled"], + ["androidx.fragment:fragment:1.0.0", "androidx.fragment:fragment:1.0.0"], + ["androidx.media:media:1.0.0", "androidx.media:media:1.0.0"], + ["androidx.tvprovider:tvprovider:1.0.0", "androidx.tvprovider:tvprovider:1.0.0"], + ["androidx.legacy:legacy-support-v13:1.0.0", "androidx.legacy:legacy-support-v13:1.0.0"], + ["androidx.legacy:legacy-support-v4:1.0.0", "androidx.legacy:legacy-support-v4:1.0.0"], + ["androidx.vectordrawable:vectordrawable:1.0.0", "androidx.vectordrawable:vectordrawable:1.0.0"], + ["androidx.swiperefreshlayout:swiperefreshlayout:1.0.0", "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"], + ["androidx.textclassifier:textclassifier:1.0.0", "androidx.textclassifier:textclassifier:1.0.0"], + ["androidx.transition:transition:1.0.0", "androidx.transition:transition:1.0.0"], + ["androidx.versionedparcelable:versionedparcelable:1.0.0", "androidx.versionedparcelable:versionedparcelable:1.0.0"], + ["androidx.viewpager:viewpager:1.0.0", "androidx.viewpager:viewpager:1.0.0"], + ["androidx.wear:wear:1.0.0", "androidx.wear:wear:1.0.0"], + ["androidx.webkit:webkit:1.0.0", "androidx.webkit:webkit:1.0.0"] + ] + + if (!useAndroidX) { + def tmp; + def listN = list.size() + for (int i = 0; i < listN; i++) { + tmp = list[i][0] + list[i][0] = list[i][1] + list[i][1] = tmp + } + } + return list +} def searchFileInParents(target) { def searchPath = target for (int i = 0; i < 8; i++) { @@ -11,8 +2083,82 @@ def searchFileInParents(target) { } return null; } +def rewriteGradlePropertiesFile() { + def gradlePropertiesFilePath = searchFileInParents("gradle.properties") + def gradlePropertiesFile = file(gradlePropertiesFilePath) + def input = new Scanner(gradlePropertiesFile) + def buffer = new StringBuilder(); + while (input.hasNextLine()) { + def line = input.nextLine(); + if (line.contains("android.useAndroidX") || line.contains("android.enableJetifier")) { + continue; + } + buffer.append(line); + buffer.append("\n"); + } + input.close() + buffer.append("android.useAndroidX=true\n") + buffer.append("android.enableJetifier=true\n") + def output = new FileWriter(gradlePropertiesFile) + output.write(buffer.toString()) + output.close() +} +def replacePackages(file, cvtList, useAndroidX) { + def filePath = file.toPath() + def lines = java.nio.file.Files.readAllLines(filePath) + def linesN = lines.size() + def listN = cvtList.size() + def anyChanges = false + for (int i = 0; i < linesN; i++) { + def line = lines.get(i) + def needReplace = false; + if (useAndroidX && line.contains('android.')) { + needReplace = true + } else if (!useAndroidX && line.contains('android')) { + needReplace = true + } + if (needReplace) { + for (int j = 0; j < listN; j++) { + if (line.contains(cvtList[j][0])) { + anyChanges = true + line = line.replaceAll(cvtList[j][0], cvtList[j][1]) + } + } + lines.set(i, line) + } + } + + if (anyChanges) { + println(" [changed] " + file) + def fileWriter = new FileWriter(file) + def output = new BufferedWriter(fileWriter) + for (int i = 0; i < linesN; i++) { + output.writeLine(lines.get(i)) + } + output.flush() + output.close() + fileWriter.close() + } + +} +def replaceFiles(matchingPattern, cvtList, useAndroidX) { + + PatternFilterable patternSet = new PatternSet(); + patternSet.include(matchingPattern); + + def matchedFile = project.files(project.getProjectDir().getParentFile().toPath()).getAsFileTree().matching(patternSet) + matchedFile.each { file -> + if (!java.nio.file.Files.isReadable(file.toPath()) || + file.toPath().toString().contains("-pgm-custom.gradle") || + file.toPath().toString().contains("/.idea/")) { + return + } + + replacePackages(file, cvtList, useAndroidX) + } +} android { @@ -38,19 +2184,18 @@ android { if (widget.preference.size() == 0) { throw new GradleException("Please add '' to the config.xml file.") } - println("preference = " + widget.preference.size()) Properties props = new Properties() def isKeyFound = 0 - props.setProperty("ANDROIDX_CORE_VERSION", "1.3.0"); + props.setProperty("GOOGLE_MAPS_ANDROIDX_CORE_VERSION", "1.3.0"); props.setProperty("GOOGLE_MAPS_ANDROID_SDK", "maps-sdk-3.0.0-beta"); - props.setProperty("APP_COMPAT_VERSION", "1.1.0"); - props.setProperty("PLAY_SERVICES_BASEMENT_VERSION", "17.2.1"); - props.setProperty("PLAY_SERVICES_BASE_VERSION", "17.2.1"); - props.setProperty("PLAY_SERVICES_GCM_VERSION", "17.0.0"); - props.setProperty("PLAY_SERVICES_LOCATION_VERSION", "17.0.0"); - props.setProperty("ANDROID_SUPPORT_V4_VERSION", "27.1.1"); - props.setProperty("GOOGLE_MAPS_PLAY_SERVICES_VERSION", "17.0.0"); + props.setProperty("GOOGLE_MAPS_APP_COMPAT_VERSION", "1.1.0"); + props.setProperty("GOOGLE_MAPS_PLAY_SERVICES_BASEMENT_VERSION", "17.2.1"); + props.setProperty("GOOGLE_MAPS_PLAY_SERVICES_BASE_VERSION", "17.2.1"); + props.setProperty("GOOGLE_MAPS_PLAY_SERVICES_GCM_VERSION", "17.0.0"); + props.setProperty("GOOGLE_MAPS_PLAY_SERVICES_LOCATION_VERSION", "16.0.0"); + props.setProperty("GOOGLE_MAPS_ANDROID_SUPPORT_V4_VERSION", "27.1.1"); + props.setProperty("GOOGLE_MAPS_PLAY_SERVICES_VERSION", "16.1.0"); widget.preference.each { pref -> @@ -61,13 +2206,13 @@ android { isKeyFound = 1 props.setProperty(name, value) } - if (name == "ANDROIDX_CORE_VERSION" || - name == "GOOGLE_MAPS_ANDROID_SDK" || - name == "APP_COMPAT_VERSION" || - name == "PLAY_SERVICES_BASEMENT_VERSION" || - name == "PLAY_SERVICES_BASE_VERSION" || - name == "PLAY_SERVICES_GCM_VERSION" || - name == "PLAY_SERVICES_LOCATION_VERSION"|| + if (name == "GOOGLE_MAPS_ANDROIDX_CORE_VERSION" || + name == "GOOGLE_MAPS_GOOGLE_MAPS_ANDROID_SDK" || + name == "GOOGLE_MAPS_APP_COMPAT_VERSION" || + name == "GOOGLE_MAPS_PLAY_SERVICES_BASEMENT_VERSION" || + name == "GOOGLE_MAPS_PLAY_SERVICES_BASE_VERSION" || + name == "GOOGLE_MAPS_PLAY_SERVICES_GCM_VERSION" || + name == "GOOGLE_MAPS_PLAY_SERVICES_LOCATION_VERSION"|| name == "GOOGLE_MAPS_PLAY_SERVICES_VERSION") { props.setProperty(name, value) } @@ -79,7 +2224,22 @@ android { } def hasUseAndroidX = project.ext.has('android.useAndroidX') - def useAndroidX = hasUseAndroidX && 'true' == project.ext.get('android.useAndroidX') + def hasEnableJetifier = project.ext.has('android.enableJetifier') + def useAndroidX = hasUseAndroidX && hasEnableJetifier && + 'true' == project.ext.get('android.useAndroidX') && + 'true' == project.ext.get('android.enableJetifier') + + //--------------------------- + // Replace all source code + //--------------------------- + def cvtList = getConvertListe(useAndroidX) + + replaceFiles("**/AndroidManifest.xml", cvtList, useAndroidX) + replaceFiles("**/res/*.xml", cvtList, useAndroidX) + replaceFiles("**/*.java", cvtList, useAndroidX) + + def dependencyCvtList = getDependencyCvtList(useAndroidX) + replaceFiles("**/*.gradle", dependencyCvtList, useAndroidX) if (useAndroidX) { //---------- @@ -101,27 +2261,25 @@ android { } } } - dependencies { - implementation name: mapsSDK, ext: 'aar' - } //------------- // dependencies //------------- - def ANDROIDX_CORE_VERSION = props.getProperty("ANDROIDX_CORE_VERSION") - def APP_COMPAT_VERSION = props.getProperty("APP_COMPAT_VERSION") - def PLAY_SERVICES_BASEMENT_VERSION = props.getProperty("PLAY_SERVICES_BASEMENT_VERSION") - def PLAY_SERVICES_BASE_VERSION = props.getProperty("PLAY_SERVICES_BASE_VERSION") - def PLAY_SERVICES_GCM_VERSION = props.getProperty("PLAY_SERVICES_GCM_VERSION") - def PLAY_SERVICES_LOCATION_VERSION = props.getProperty("PLAY_SERVICES_LOCATION_VERSION") - - println("---->ANDROIDX_CORE_VERSION = ${ANDROIDX_CORE_VERSION}") - println("---->APP_COMPAT_VERSION = ${APP_COMPAT_VERSION}") - println("---->PLAY_SERVICES_BASEMENT_VERSION = ${PLAY_SERVICES_BASEMENT_VERSION}") - println("---->PLAY_SERVICES_BASE_VERSION = ${PLAY_SERVICES_BASE_VERSION}") - println("---->PLAY_SERVICES_GCM_VERSION = ${PLAY_SERVICES_GCM_VERSION}") - println("---->PLAY_SERVICES_LOCATION_VERSION = ${PLAY_SERVICES_LOCATION_VERSION}") + def ANDROIDX_CORE_VERSION = props.getProperty("GOOGLE_MAPS_ANDROIDX_CORE_VERSION") + def APP_COMPAT_VERSION = props.getProperty("GOOGLE_MAPS_APP_COMPAT_VERSION") + def PLAY_SERVICES_BASEMENT_VERSION = props.getProperty("GOOGLE_MAPS_PLAY_SERVICES_BASEMENT_VERSION") + def PLAY_SERVICES_BASE_VERSION = props.getProperty("GOOGLE_MAPS_PLAY_SERVICES_BASE_VERSION") + def PLAY_SERVICES_GCM_VERSION = props.getProperty("GOOGLE_MAPS_PLAY_SERVICES_GCM_VERSION") + def PLAY_SERVICES_LOCATION_VERSION = props.getProperty("GOOGLE_MAPS_PLAY_SERVICES_LOCATION_VERSION") + + println("---->GOOGLE_MAPS_ANDROIDX_CORE_VERSION = ${ANDROIDX_CORE_VERSION}") + println("---->GOOGLE_MAPS_APP_COMPAT_VERSION = ${APP_COMPAT_VERSION}") + println("---->GOOGLE_MAPS_PLAY_SERVICES_BASEMENT_VERSION = ${PLAY_SERVICES_BASEMENT_VERSION}") + println("---->GOOGLE_MAPS_PLAY_SERVICES_BASE_VERSION = ${PLAY_SERVICES_BASE_VERSION}") + println("---->GOOGLE_MAPS_PLAY_SERVICES_GCM_VERSION = ${PLAY_SERVICES_GCM_VERSION}") + println("---->GOOGLE_MAPS_PLAY_SERVICES_LOCATION_VERSION = ${PLAY_SERVICES_LOCATION_VERSION}") dependencies { + implementation name: mapsSDK, ext: 'aar' implementation "androidx.appcompat:appcompat:${APP_COMPAT_VERSION}" implementation "com.google.android.gms:play-services-basement:${PLAY_SERVICES_BASEMENT_VERSION}" implementation "com.google.android.gms:play-services-base:${PLAY_SERVICES_BASE_VERSION}" @@ -129,12 +2287,15 @@ android { implementation "com.google.android.gms:play-services-location:${PLAY_SERVICES_LOCATION_VERSION}" } } else { - def GOOGLE_MAPS_PLAY_SERVICES_VERSION = props.getProperty("GOOGLE_MAPS_PLAY_SERVICES_VERSION") - def PLAY_SERVICES_LOCATION_VERSION = props.getProperty("PLAY_SERVICES_LOCATION_VERSION") - def ANDROID_SUPPORT_V4_VERSION = props.getProperty("ANDROID_SUPPORT_V4_VERSION") + def PLAY_SERVICES_VERSION = props.getProperty("GOOGLE_MAPS_PLAY_SERVICES_VERSION") + def PLAY_SERVICES_LOCATION_VERSION = props.getProperty("GOOGLE_MAPS_PLAY_SERVICES_LOCATION_VERSION") + def ANDROID_SUPPORT_V4_VERSION = props.getProperty("GOOGLE_MAPS_ANDROID_SUPPORT_V4_VERSION") + println("---->GOOGLE_MAPS_PLAY_SERVICES_VERSION = ${PLAY_SERVICES_VERSION}") + println("---->GOOGLE_MAPS_PLAY_SERVICES_LOCATION_VERSION = ${PLAY_SERVICES_LOCATION_VERSION}") + println("---->GOOGLE_MAPS_ANDROID_SUPPORT_V4_VERSION = ${ANDROID_SUPPORT_V4_VERSION}") dependencies { - implementation "com.google.android.gms:play-services-maps:${GOOGLE_MAPS_PLAY_SERVICES_VERSION}" - implementation "com.google.android.gms:play-services-location:${GOOGLE_MAPS_PLAY_SERVICES_VERSION}" + implementation "com.google.android.gms:play-services-maps:${PLAY_SERVICES_VERSION}" + implementation "com.google.android.gms:play-services-location:${PLAY_SERVICES_LOCATION_VERSION}" implementation "com.android.support:support-core-utils:${ANDROID_SUPPORT_V4_VERSION}" } } diff --git a/src/android/plugin/google/maps/CordovaGoogleMaps.java b/src/android/plugin/google/maps/CordovaGoogleMaps.java index 5e575b793..3b97a6f2d 100644 --- a/src/android/plugin/google/maps/CordovaGoogleMaps.java +++ b/src/android/plugin/google/maps/CordovaGoogleMaps.java @@ -43,6 +43,7 @@ import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Set; + @SuppressWarnings("deprecation") public class CordovaGoogleMaps extends CordovaPlugin implements ViewTreeObserver.OnScrollChangedListener{ private final String TAG = "GoogleMapsPlugin"; @@ -83,86 +84,86 @@ public void run() { // ------------------------------ // Check of Google Play Services // ------------------------------ -// int checkGooglePlayServices = GooglePlayServicesUtil.isGooglePlayServicesAvailable(activity); -// -// Log.d(TAG, "----> checkGooglePlayServices = " + (ConnectionResult.SUCCESS == checkGooglePlayServices)); -// -// if (checkGooglePlayServices != ConnectionResult.SUCCESS) { -// // google play services is missing!!!! -// /* -// * Returns status code indicating whether there was an error. Can be one -// * of following in ConnectionResult: SUCCESS, SERVICE_MISSING, -// * SERVICE_VERSION_UPDATE_REQUIRED, SERVICE_DISABLED, SERVICE_INVALID. -// */ -// Log.e(TAG, "---Google Play Services is not available: " + GooglePlayServicesUtil.getErrorString(checkGooglePlayServices)); -// -// boolean isNeedToUpdate = false; -// -// String errorMsg = PluginUtil.getPgmStrings(activity, "pgm_google_play_error"); -// switch (checkGooglePlayServices) { -// case ConnectionResult.DEVELOPER_ERROR: -// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_developer_error"); -// break; -// case ConnectionResult.INTERNAL_ERROR: -// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_internal_error"); -// break; -// case ConnectionResult.INVALID_ACCOUNT: -// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_invalid_account"); -// break; -// case ConnectionResult.LICENSE_CHECK_FAILED: -// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_license_check_failed"); -// break; -// case ConnectionResult.NETWORK_ERROR: -// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_network_error"); -// break; -// case ConnectionResult.SERVICE_DISABLED: -// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_disabled"); -// break; -// case ConnectionResult.SERVICE_INVALID: -// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_invalid"); -// isNeedToUpdate = true; -// break; -// case ConnectionResult.SERVICE_MISSING: -// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_missing"); -// isNeedToUpdate = true; -// break; -// case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED: -// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_update_required"); -// isNeedToUpdate = true; -// break; -// case ConnectionResult.SIGN_IN_REQUIRED: -// errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_sign_in_required"); -// break; -// default: -// isNeedToUpdate = true; -// break; -// } -// -// final boolean finalIsNeedToUpdate = isNeedToUpdate; -// AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(activity); -// alertDialogBuilder -// .setMessage(errorMsg) -// .setCancelable(false) -// .setPositiveButton(PluginUtil.getPgmStrings(activity,"pgm_google_close_button"), new DialogInterface.OnClickListener() { -// public void onClick(DialogInterface dialog,int id) { -// dialog.dismiss(); -// if (finalIsNeedToUpdate) { -// try { -// activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.google.android.gms"))); -// } catch (android.content.ActivityNotFoundException anfe) { -// activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=com.google.android.gms"))); -// } -// } -// } -// }); -// AlertDialog alertDialog = alertDialogBuilder.create(); -// -// // show it -// alertDialog.show(); -// -// Log.e(TAG, "Google Play Services is not available."); -// return; -// } + int checkGooglePlayServices = GooglePlayServicesUtil.isGooglePlayServicesAvailable(activity); + + Log.d(TAG, "----> checkGooglePlayServices = " + (ConnectionResult.SUCCESS == checkGooglePlayServices)); + + if (checkGooglePlayServices != ConnectionResult.SUCCESS) { + // google play services is missing!!!! + /* + * Returns status code indicating whether there was an error. Can be one + * of following in ConnectionResult: SUCCESS, SERVICE_MISSING, + * SERVICE_VERSION_UPDATE_REQUIRED, SERVICE_DISABLED, SERVICE_INVALID. + */ + Log.e(TAG, "---Google Play Services is not available: " + GooglePlayServicesUtil.getErrorString(checkGooglePlayServices)); + + boolean isNeedToUpdate = false; + + String errorMsg = PluginUtil.getPgmStrings(activity, "pgm_google_play_error"); + switch (checkGooglePlayServices) { + case ConnectionResult.DEVELOPER_ERROR: + errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_developer_error"); + break; + case ConnectionResult.INTERNAL_ERROR: + errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_internal_error"); + break; + case ConnectionResult.INVALID_ACCOUNT: + errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_invalid_account"); + break; + case ConnectionResult.LICENSE_CHECK_FAILED: + errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_license_check_failed"); + break; + case ConnectionResult.NETWORK_ERROR: + errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_network_error"); + break; + case ConnectionResult.SERVICE_DISABLED: + errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_disabled"); + break; + case ConnectionResult.SERVICE_INVALID: + errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_invalid"); + isNeedToUpdate = true; + break; + case ConnectionResult.SERVICE_MISSING: + errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_missing"); + isNeedToUpdate = true; + break; + case ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED: + errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_service_update_required"); + isNeedToUpdate = true; + break; + case ConnectionResult.SIGN_IN_REQUIRED: + errorMsg = PluginUtil.getPgmStrings(activity,"pgm_google_play_sign_in_required"); + break; + default: + isNeedToUpdate = true; + break; + } + + final boolean finalIsNeedToUpdate = isNeedToUpdate; + AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(activity); + alertDialogBuilder + .setMessage(errorMsg) + .setCancelable(false) + .setPositiveButton(PluginUtil.getPgmStrings(activity,"pgm_google_close_button"), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int id) { + dialog.dismiss(); + if (finalIsNeedToUpdate) { + try { + activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.google.android.gms"))); + } catch (android.content.ActivityNotFoundException anfe) { + activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=com.google.android.gms"))); + } + } + } + }); + AlertDialog alertDialog = alertDialogBuilder.create(); + + // show it + alertDialog.show(); + + Log.e(TAG, "Google Play Services is not available."); + return; + } webView.getView().setBackgroundColor(Color.TRANSPARENT); webView.getView().setOverScrollMode(View.OVER_SCROLL_NEVER); @@ -182,13 +183,13 @@ public void run() { AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(activity); alertDialogBuilder - .setMessage(PluginUtil.getPgmStrings(activity,"pgm_api_key_error")) - .setCancelable(false) - .setPositiveButton(PluginUtil.getPgmStrings(activity,"pgm_google_close_button"), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog,int id) { - dialog.dismiss(); - } - }); + .setMessage(PluginUtil.getPgmStrings(activity,"pgm_api_key_error")) + .setCancelable(false) + .setPositiveButton(PluginUtil.getPgmStrings(activity,"pgm_google_close_button"), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog,int id) { + dialog.dismiss(); + } + }); AlertDialog alertDialog = alertDialogBuilder.create(); // show it @@ -356,13 +357,13 @@ public void putHtmlElements(final JSONArray args, final CallbackContext callback final JSONObject elements = args.getJSONObject(0); if (mPluginLayout == null) { - callbackContext.success(); - return; + callbackContext.success(); + return; } //Log.d(TAG, "--->stopFlag = " + mPluginLayout.stopFlag + ", mPluginLayout.needUpdatePosition = " + mPluginLayout.needUpdatePosition); if (!mPluginLayout.stopFlag || mPluginLayout.needUpdatePosition) { - mPluginLayout.putHTMLElements(elements); + mPluginLayout.putHTMLElements(elements); } //mPluginLayout.updateMapPositions(); @@ -544,7 +545,7 @@ public void onDestroy() { } - /** + /** * Called by the system when the device configuration changes while your activity is running. * * @param newConfig The new device configuration diff --git a/src/android/plugin/google/maps/PluginEnvironment.java b/src/android/plugin/google/maps/PluginEnvironment.java index 1867c1952..56505db30 100644 --- a/src/android/plugin/google/maps/PluginEnvironment.java +++ b/src/android/plugin/google/maps/PluginEnvironment.java @@ -73,17 +73,6 @@ public void isAvailable(final JSONArray args, final CallbackContext callbackCont return; } - // ------------------------------ - // Check of Google Maps Android API v2 - // ------------------------------ - try { - @SuppressWarnings({ "rawtypes" }) - Class GoogleMapsClass = Class.forName("com.google.android.gms.maps.model.GoogleMap"); - } catch (Exception e) { - Log.e("GoogleMaps", "Error", e); - callbackContext.error(e.getMessage()); - return; - } callbackContext.success(); } From 3fc504a29cbc2288fa49d66163eb494b5032a46f Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Sat, 30 May 2020 00:11:18 -0700 Subject: [PATCH 40/50] update version number --- package.json | 2 +- plugin.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 3a6e20d1b..f4cb1134a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-googlemaps", - "version": "2.8.0-20200528-2358", + "version": "2.8.0-20200530-0010", "description": "Google Maps native SDK for Android and iOS, and Google Maps JavaScript API v3 for browser.", "cordova": { "id": "cordova-plugin-googlemaps", diff --git a/plugin.xml b/plugin.xml index 89801d7a8..483b9a0b3 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - + cordova-plugin-googlemaps From 8cd0c258af4e92a283d0c957cb9febd188d971f0 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Sat, 30 May 2020 16:21:01 -0700 Subject: [PATCH 41/50] Use cordova-androidx-build as dependency plugin --- package.json | 2 +- plugin.xml | 5 +- src/android/frameworks/pgm-custom.gradle | 2091 +--------------------- 3 files changed, 10 insertions(+), 2088 deletions(-) diff --git a/package.json b/package.json index f4cb1134a..d60377031 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-googlemaps", - "version": "2.8.0-20200530-0010", + "version": "2.8.0-20200530-1546", "description": "Google Maps native SDK for Android and iOS, and Google Maps JavaScript API v3 for browser.", "cordova": { "id": "cordova-plugin-googlemaps", diff --git a/plugin.xml b/plugin.xml index 483b9a0b3..07780cc94 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - + cordova-plugin-googlemaps @@ -301,6 +301,9 @@ + + + diff --git a/src/android/frameworks/pgm-custom.gradle b/src/android/frameworks/pgm-custom.gradle index 7c98161ef..fe980ec59 100644 --- a/src/android/frameworks/pgm-custom.gradle +++ b/src/android/frameworks/pgm-custom.gradle @@ -1,1941 +1,5 @@ def getConvertListe(useAndroidX) { def list = [ - ["android.arch.core.executor.AppToolkitTaskExecutor", "androidx.arch.core.executor.AppToolkitTaskExecutor"], - ["android.arch.core.executor.ArchTaskExecutor", "androidx.arch.core.executor.ArchTaskExecutor"], - ["android.arch.core.executor.DefaultTaskExecutor", "androidx.arch.core.executor.DefaultTaskExecutor"], - ["android.arch.core.executor.JunitTaskExecutorRule", "androidx.arch.core.executor.JunitTaskExecutorRule"], - ["android.arch.core.executor.TaskExecutor", "androidx.arch.core.executor.TaskExecutor"], - ["android.arch.core.executor.TaskExecutorWithFakeMainThread", "androidx.arch.core.executor.TaskExecutorWithFakeMainThread"], - ["android.arch.core.executor.testing.CountingTaskExecutorRule", "androidx.arch.core.executor.testing.CountingTaskExecutorRule"], - ["android.arch.core.executor.testing.InstantTaskExecutorRule", "androidx.arch.core.executor.testing.InstantTaskExecutorRule"], - ["android.arch.core.internal.FastSafeIterableMap", "androidx.arch.core.internal.FastSafeIterableMap"], - ["android.arch.core.internal.SafeIterableMap", "androidx.arch.core.internal.SafeIterableMap"], - ["android.arch.core.util.Function", "androidx.arch.core.util.Function"], - ["android.arch.lifecycle.AndroidViewModel", "androidx.lifecycle.AndroidViewModel"], - ["android.arch.lifecycle.ClassesInfoCache", "androidx.lifecycle.ClassesInfoCache"], - ["android.arch.lifecycle.CompositeGeneratedAdaptersObserver", "androidx.lifecycle.CompositeGeneratedAdaptersObserver"], - ["android.arch.lifecycle.ComputableLiveData", "androidx.lifecycle.ComputableLiveData"], - ["android.arch.lifecycle.DefaultLifecycleObserver", "androidx.lifecycle.DefaultLifecycleObserver"], - ["android.arch.lifecycle.Elements_extKt", "androidx.lifecycle.Elements_extKt"], - ["android.arch.lifecycle.EmptyActivityLifecycleCallbacks", "androidx.lifecycle.EmptyActivityLifecycleCallbacks"], - ["android.arch.lifecycle.ErrorMessages", "androidx.lifecycle.ErrorMessages"], - ["android.arch.lifecycle.FullLifecycleObserver", "androidx.lifecycle.FullLifecycleObserver"], - ["android.arch.lifecycle.FullLifecycleObserverAdapter", "androidx.lifecycle.FullLifecycleObserverAdapter"], - ["android.arch.lifecycle.GeneratedAdapter", "androidx.lifecycle.GeneratedAdapter"], - ["android.arch.lifecycle.GenericLifecycleObserver", "androidx.lifecycle.GenericLifecycleObserver"], - ["android.arch.lifecycle.HolderFragment", "androidx.lifecycle.HolderFragment"], - ["android.arch.lifecycle.Input_collectorKt", "androidx.lifecycle.Input_collectorKt"], - ["android.arch.lifecycle.Lifecycle", "androidx.lifecycle.Lifecycle"], - ["android.arch.lifecycle.LifecycleDispatcher", "androidx.lifecycle.LifecycleDispatcher"], - ["android.arch.lifecycle.LifecycleObserver", "androidx.lifecycle.LifecycleObserver"], - ["android.arch.lifecycle.LifecycleOwner", "androidx.lifecycle.LifecycleOwner"], - ["android.arch.lifecycle.LifecycleProcessor", "androidx.lifecycle.LifecycleProcessor"], - ["android.arch.lifecycle.LifecycleRegistry", "androidx.lifecycle.LifecycleRegistry"], - ["android.arch.lifecycle.LifecycleRegistryOwner", "androidx.lifecycle.LifecycleRegistryOwner"], - ["android.arch.lifecycle.LifecycleService", "androidx.lifecycle.LifecycleService"], - ["android.arch.lifecycle.Lifecycling", "androidx.lifecycle.Lifecycling"], - ["android.arch.lifecycle.LiveData", "androidx.lifecycle.LiveData"], - ["android.arch.lifecycle.LiveDataReactiveStreams", "androidx.lifecycle.LiveDataReactiveStreams"], - ["android.arch.lifecycle.MediatorLiveData", "androidx.lifecycle.MediatorLiveData"], - ["android.arch.lifecycle.MethodCallsLogger", "androidx.lifecycle.MethodCallsLogger"], - ["android.arch.lifecycle.model.AdapterClass", "androidx.lifecycle.model.AdapterClass"], - ["android.arch.lifecycle.model.AdapterClassKt", "androidx.lifecycle.model.AdapterClassKt"], - ["android.arch.lifecycle.model.EventMethod", "androidx.lifecycle.model.EventMethod"], - ["android.arch.lifecycle.model.EventMethodCall", "androidx.lifecycle.model.EventMethodCall"], - ["android.arch.lifecycle.model.InputModel", "androidx.lifecycle.model.InputModel"], - ["android.arch.lifecycle.model.LifecycleObserverInfo", "androidx.lifecycle.model.LifecycleObserverInfo"], - ["android.arch.lifecycle.MutableLiveData", "androidx.lifecycle.MutableLiveData"], - ["android.arch.lifecycle.Observer", "androidx.lifecycle.Observer"], - ["android.arch.lifecycle.ObserversCollector", "androidx.lifecycle.ObserversCollector"], - ["android.arch.lifecycle.OnLifecycleEvent", "androidx.lifecycle.OnLifecycleEvent"], - ["android.arch.lifecycle.ProcessLifecycleOwner", "androidx.lifecycle.ProcessLifecycleOwner"], - ["android.arch.lifecycle.ProcessLifecycleOwnerInitializer", "androidx.lifecycle.ProcessLifecycleOwnerInitializer"], - ["android.arch.lifecycle.ReflectiveGenericLifecycleObserver", "androidx.lifecycle.ReflectiveGenericLifecycleObserver"], - ["android.arch.lifecycle.ReportFragment", "androidx.lifecycle.ReportFragment"], - ["android.arch.lifecycle.ServiceLifecycleDispatcher", "androidx.lifecycle.ServiceLifecycleDispatcher"], - ["android.arch.lifecycle.SingleGeneratedAdapterObserver", "androidx.lifecycle.SingleGeneratedAdapterObserver"], - ["android.arch.lifecycle.TransformationKt", "androidx.lifecycle.TransformationKt"], - ["android.arch.lifecycle.Transformations", "androidx.lifecycle.Transformations"], - ["android.arch.lifecycle.Validator", "androidx.lifecycle.Validator"], - ["android.arch.lifecycle.ViewModel", "androidx.lifecycle.ViewModel"], - ["android.arch.lifecycle.ViewModelProvider", "androidx.lifecycle.ViewModelProvider"], - ["android.arch.lifecycle.ViewModelProviders", "androidx.lifecycle.ViewModelProviders"], - ["android.arch.lifecycle.ViewModelStore", "androidx.lifecycle.ViewModelStore"], - ["android.arch.lifecycle.ViewModelStoreOwner", "androidx.lifecycle.ViewModelStoreOwner"], - ["android.arch.lifecycle.ViewModelStores", "androidx.lifecycle.ViewModelStores"], - ["android.arch.lifecycle.WriterKt", "androidx.lifecycle.WriterKt"], - ["android.arch.paging.AsyncPagedListDiffer", "androidx.paging.AsyncPagedListDiffer"], - ["android.arch.paging.ContiguousDataSource", "androidx.paging.ContiguousDataSource"], - ["android.arch.paging.ContiguousPagedList", "androidx.paging.ContiguousPagedList"], - ["android.arch.paging.DataSource", "androidx.paging.DataSource"], - ["android.arch.paging.ItemKeyedDataSource", "androidx.paging.ItemKeyedDataSource"], - ["android.arch.paging.ListDataSource", "androidx.paging.ListDataSource"], - ["android.arch.paging.LivePagedListBuilder", "androidx.paging.LivePagedListBuilder"], - ["android.arch.paging.LivePagedListProvider", "androidx.paging.LivePagedListProvider"], - ["android.arch.paging.PagedList", "androidx.paging.PagedList"], - ["android.arch.paging.PagedListAdapter", "androidx.paging.PagedListAdapter"], - ["android.arch.paging.PagedStorage", "androidx.paging.PagedStorage"], - ["android.arch.paging.PagedStorageDiffHelper", "androidx.paging.PagedStorageDiffHelper"], - ["android.arch.paging.PageKeyedDataSource", "androidx.paging.PageKeyedDataSource"], - ["android.arch.paging.PageResult", "androidx.paging.PageResult"], - ["android.arch.paging.PositionalDataSource", "androidx.paging.PositionalDataSource"], - ["android.arch.paging.RxPagedListBuilder", "androidx.paging.RxPagedListBuilder"], - ["android.arch.paging.SnapshotPagedList", "androidx.paging.SnapshotPagedList"], - ["android.arch.paging.TiledDataSource", "androidx.paging.TiledDataSource"], - ["android.arch.paging.TiledPagedList", "androidx.paging.TiledPagedList"], - ["android.arch.paging.WrapperItemKeyedDataSource", "androidx.paging.WrapperItemKeyedDataSource"], - ["android.arch.paging.WrapperPageKeyedDataSource", "androidx.paging.WrapperPageKeyedDataSource"], - ["android.arch.paging.WrapperPositionalDataSource", "androidx.paging.WrapperPositionalDataSource"], - ["android.arch.persistence.db.framework.FrameworkSQLiteDatabase", "androidx.sqlite.db.framework.FrameworkSQLiteDatabase"], - ["android.arch.persistence.db.framework.FrameworkSQLiteOpenHelper", "androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper"], - ["android.arch.persistence.db.framework.FrameworkSQLiteOpenHelperFactory", "androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory"], - ["android.arch.persistence.db.framework.FrameworkSQLiteProgram", "androidx.sqlite.db.framework.FrameworkSQLiteProgram"], - ["android.arch.persistence.db.framework.FrameworkSQLiteStatement", "androidx.sqlite.db.framework.FrameworkSQLiteStatement"], - ["android.arch.persistence.db.SimpleSQLiteQuery", "androidx.sqlite.db.SimpleSQLiteQuery"], - ["android.arch.persistence.db.SupportSQLiteDatabase", "androidx.sqlite.db.SupportSQLiteDatabase"], - ["android.arch.persistence.db.SupportSQLiteOpenHelper", "androidx.sqlite.db.SupportSQLiteOpenHelper"], - ["android.arch.persistence.db.SupportSQLiteProgram", "androidx.sqlite.db.SupportSQLiteProgram"], - ["android.arch.persistence.db.SupportSQLiteQuery", "androidx.sqlite.db.SupportSQLiteQuery"], - ["android.arch.persistence.db.SupportSQLiteQueryBuilder", "androidx.sqlite.db.SupportSQLiteQueryBuilder"], - ["android.arch.persistence.db.SupportSQLiteStatement", "androidx.sqlite.db.SupportSQLiteStatement"], - ["android.arch.persistence.room.ColumnInfo", "androidx.room.ColumnInfo"], - ["android.arch.persistence.room.Dao", "androidx.room.Dao"], - ["android.arch.persistence.room.Database", "androidx.room.Database"], - ["android.arch.persistence.room.DatabaseConfiguration", "androidx.room.DatabaseConfiguration"], - ["android.arch.persistence.room.Delete", "androidx.room.Delete"], - ["android.arch.persistence.room.Embedded", "androidx.room.Embedded"], - ["android.arch.persistence.room.EmptyResultSetException", "androidx.room.EmptyResultSetException"], - ["android.arch.persistence.room.Entity", "androidx.room.Entity"], - ["android.arch.persistence.room.EntityDeletionOrUpdateAdapter", "androidx.room.EntityDeletionOrUpdateAdapter"], - ["android.arch.persistence.room.EntityInsertionAdapter", "androidx.room.EntityInsertionAdapter"], - ["android.arch.persistence.room.ext.AndroidTypeNames", "androidx.room.ext.AndroidTypeNames"], - ["android.arch.persistence.room.ext.ArchTypeNames", "androidx.room.ext.ArchTypeNames"], - ["android.arch.persistence.room.ext.CommonTypeNames", "androidx.room.ext.CommonTypeNames"], - ["android.arch.persistence.room.ext.Element_extKt", "androidx.room.ext.Element_extKt"], - ["android.arch.persistence.room.ext.GuavaBaseTypeNames", "androidx.room.ext.GuavaBaseTypeNames"], - ["android.arch.persistence.room.ext.GuavaUtilConcurrentTypeNames", "androidx.room.ext.GuavaUtilConcurrentTypeNames"], - ["android.arch.persistence.room.ext.Javapoet_extKt", "androidx.room.ext.Javapoet_extKt"], - ["android.arch.persistence.room.ext.KotlinMetadataProcessor", "androidx.room.ext.KotlinMetadataProcessor"], - ["android.arch.persistence.room.ext.LifecyclesTypeNames", "androidx.room.ext.LifecyclesTypeNames"], - ["android.arch.persistence.room.ext.PagingTypeNames", "androidx.room.ext.PagingTypeNames"], - ["android.arch.persistence.room.ext.ReactiveStreamsTypeNames", "androidx.room.ext.ReactiveStreamsTypeNames"], - ["android.arch.persistence.room.ext.RoomGuavaTypeNames", "androidx.room.ext.RoomGuavaTypeNames"], - ["android.arch.persistence.room.ext.RoomRxJava2TypeNames", "androidx.room.ext.RoomRxJava2TypeNames"], - ["android.arch.persistence.room.ext.RoomTypeNames", "androidx.room.ext.RoomTypeNames"], - ["android.arch.persistence.room.ext.RxJava2TypeNames", "androidx.room.ext.RxJava2TypeNames"], - ["android.arch.persistence.room.ext.SupportDbTypeNames", "androidx.room.ext.SupportDbTypeNames"], - ["android.arch.persistence.room.ForeignKey", "androidx.room.ForeignKey"], - ["android.arch.persistence.room.guava.GuavaRoom", "androidx.room.guava.GuavaRoom"], - ["android.arch.persistence.room.Ignore", "androidx.room.Ignore"], - ["android.arch.persistence.room.Index", "androidx.room.Index"], - ["android.arch.persistence.room.Insert", "androidx.room.Insert"], - ["android.arch.persistence.room.InvalidationTracker", "androidx.room.InvalidationTracker"], - ["android.arch.persistence.room.log.RLog", "androidx.room.log.RLog"], - ["android.arch.persistence.room.migration.bundle.BundleUtil", "androidx.room.migration.bundle.BundleUtil"], - ["android.arch.persistence.room.migration.bundle.DatabaseBundle", "androidx.room.migration.bundle.DatabaseBundle"], - ["android.arch.persistence.room.migration.bundle.EntityBundle", "androidx.room.migration.bundle.EntityBundle"], - ["android.arch.persistence.room.migration.bundle.FieldBundle", "androidx.room.migration.bundle.FieldBundle"], - ["android.arch.persistence.room.migration.bundle.ForeignKeyBundle", "androidx.room.migration.bundle.ForeignKeyBundle"], - ["android.arch.persistence.room.migration.bundle.IndexBundle", "androidx.room.migration.bundle.IndexBundle"], - ["android.arch.persistence.room.migration.bundle.PrimaryKeyBundle", "androidx.room.migration.bundle.PrimaryKeyBundle"], - ["android.arch.persistence.room.migration.bundle.SchemaBundle", "androidx.room.migration.bundle.SchemaBundle"], - ["android.arch.persistence.room.migration.bundle.SchemaEquality", "androidx.room.migration.bundle.SchemaEquality"], - ["android.arch.persistence.room.migration.bundle.SchemaEqualityUtil", "androidx.room.migration.bundle.SchemaEqualityUtil"], - ["android.arch.persistence.room.migration.Migration", "androidx.room.migration.Migration"], - ["android.arch.persistence.room.OnConflictStrategy", "androidx.room.OnConflictStrategy"], - ["android.arch.persistence.room.paging.LimitOffsetDataSource", "androidx.room.paging.LimitOffsetDataSource"], - ["android.arch.persistence.room.parser.Collate", "androidx.room.parser.Collate"], - ["android.arch.persistence.room.parser.ParsedQuery", "androidx.room.parser.ParsedQuery"], - ["android.arch.persistence.room.parser.ParserErrors", "androidx.room.parser.ParserErrors"], - ["android.arch.persistence.room.parser.QueryType", "androidx.room.parser.QueryType"], - ["android.arch.persistence.room.parser.QueryVisitor", "androidx.room.parser.QueryVisitor"], - ["android.arch.persistence.room.parser.Section", "androidx.room.parser.Section"], - ["android.arch.persistence.room.parser.SectionType", "androidx.room.parser.SectionType"], - ["android.arch.persistence.room.parser.SQLiteBaseListener", "androidx.room.parser.SQLiteBaseListener"], - ["android.arch.persistence.room.parser.SQLiteBaseVisitor", "androidx.room.parser.SQLiteBaseVisitor"], - ["android.arch.persistence.room.parser.SQLiteLexer", "androidx.room.parser.SQLiteLexer"], - ["android.arch.persistence.room.parser.SQLiteListener", "androidx.room.parser.SQLiteListener"], - ["android.arch.persistence.room.parser.SQLiteParser", "androidx.room.parser.SQLiteParser"], - ["android.arch.persistence.room.parser.SQLiteVisitor", "androidx.room.parser.SQLiteVisitor"], - ["android.arch.persistence.room.parser.SqlParser", "androidx.room.parser.SqlParser"], - ["android.arch.persistence.room.parser.SQLTypeAffinity", "androidx.room.parser.SQLTypeAffinity"], - ["android.arch.persistence.room.parser.Table", "androidx.room.parser.Table"], - ["android.arch.persistence.room.preconditions.Checks", "androidx.room.preconditions.Checks"], - ["android.arch.persistence.room.PrimaryKey", "androidx.room.PrimaryKey"], - ["android.arch.persistence.room.processor.cache.Cache", "androidx.room.processor.cache.Cache"], - ["android.arch.persistence.room.processor.Context", "androidx.room.processor.Context"], - ["android.arch.persistence.room.processor.CustomConverterProcessor", "androidx.room.processor.CustomConverterProcessor"], - ["android.arch.persistence.room.processor.DaoProcessor", "androidx.room.processor.DaoProcessor"], - ["android.arch.persistence.room.processor.DatabaseProcessor", "androidx.room.processor.DatabaseProcessor"], - ["android.arch.persistence.room.processor.DeletionMethodProcessor", "androidx.room.processor.DeletionMethodProcessor"], - ["android.arch.persistence.room.processor.EntityProcessor", "androidx.room.processor.EntityProcessor"], - ["android.arch.persistence.room.processor.FieldProcessor", "androidx.room.processor.FieldProcessor"], - ["android.arch.persistence.room.processor.InsertionMethodProcessor", "androidx.room.processor.InsertionMethodProcessor"], - ["android.arch.persistence.room.processor.OnConflictProcessor", "androidx.room.processor.OnConflictProcessor"], - ["android.arch.persistence.room.processor.PojoMethodProcessor", "androidx.room.processor.PojoMethodProcessor"], - ["android.arch.persistence.room.processor.PojoProcessor", "androidx.room.processor.PojoProcessor"], - ["android.arch.persistence.room.processor.ProcessorErrors", "androidx.room.processor.ProcessorErrors"], - ["android.arch.persistence.room.processor.QueryMethodProcessor", "androidx.room.processor.QueryMethodProcessor"], - ["android.arch.persistence.room.processor.QueryParameterProcessor", "androidx.room.processor.QueryParameterProcessor"], - ["android.arch.persistence.room.processor.RawQueryMethodProcessor", "androidx.room.processor.RawQueryMethodProcessor"], - ["android.arch.persistence.room.processor.ShortcutMethodProcessor", "androidx.room.processor.ShortcutMethodProcessor"], - ["android.arch.persistence.room.processor.ShortcutParameterProcessor", "androidx.room.processor.ShortcutParameterProcessor"], - ["android.arch.persistence.room.processor.SuppressWarningProcessor", "androidx.room.processor.SuppressWarningProcessor"], - ["android.arch.persistence.room.processor.TransactionMethodProcessor", "androidx.room.processor.TransactionMethodProcessor"], - ["android.arch.persistence.room.processor.UpdateMethodProcessor", "androidx.room.processor.UpdateMethodProcessor"], - ["android.arch.persistence.room.Query", "androidx.room.Query"], - ["android.arch.persistence.room.RawQuery", "androidx.room.RawQuery"], - ["android.arch.persistence.room.Relation", "androidx.room.Relation"], - ["android.arch.persistence.room.Room", "androidx.room.Room"], - ["android.arch.persistence.room.RoomDatabase", "androidx.room.RoomDatabase"], - ["android.arch.persistence.room.RoomMasterTable", "androidx.room.RoomMasterTable"], - ["android.arch.persistence.room.RoomOpenHelper", "androidx.room.RoomOpenHelper"], - ["android.arch.persistence.room.RoomProcessor", "androidx.room.RoomProcessor"], - ["android.arch.persistence.room.RoomSQLiteQuery", "androidx.room.RoomSQLiteQuery"], - ["android.arch.persistence.room.RoomWarnings", "androidx.room.RoomWarnings"], - ["android.arch.persistence.room.RxRoom", "androidx.room.RxRoom"], - ["android.arch.persistence.room.SharedSQLiteStatement", "androidx.room.SharedSQLiteStatement"], - ["android.arch.persistence.room.SkipQueryVerification", "androidx.room.SkipQueryVerification"], - ["android.arch.persistence.room.solver.binderprovider.CursorQueryResultBinderProvider", "androidx.room.solver.binderprovider.CursorQueryResultBinderProvider"], - ["android.arch.persistence.room.solver.binderprovider.DataSourceFactoryQueryResultBinderProvider", "androidx.room.solver.binderprovider.DataSourceFactoryQueryResultBinderProvider"], - ["android.arch.persistence.room.solver.binderprovider.DataSourceQueryResultBinderProvider", "androidx.room.solver.binderprovider.DataSourceQueryResultBinderProvider"], - ["android.arch.persistence.room.solver.binderprovider.FlowableQueryResultBinderProvider", "androidx.room.solver.binderprovider.FlowableQueryResultBinderProvider"], - ["android.arch.persistence.room.solver.binderprovider.GuavaListenableFutureQueryResultBinderProvider", "androidx.room.solver.binderprovider.GuavaListenableFutureQueryResultBinderProvider"], - ["android.arch.persistence.room.solver.binderprovider.InstantQueryResultBinderProvider", "androidx.room.solver.binderprovider.InstantQueryResultBinderProvider"], - ["android.arch.persistence.room.solver.binderprovider.LiveDataQueryResultBinderProvider", "androidx.room.solver.binderprovider.LiveDataQueryResultBinderProvider"], - ["android.arch.persistence.room.solver.binderprovider.RxCallableQueryResultBinderProvider", "androidx.room.solver.binderprovider.RxCallableQueryResultBinderProvider"], - ["android.arch.persistence.room.solver.binderprovider.RxMaybeQueryResultBinderProvider", "androidx.room.solver.binderprovider.RxMaybeQueryResultBinderProvider"], - ["android.arch.persistence.room.solver.binderprovider.RxSingleQueryResultBinderProvider", "androidx.room.solver.binderprovider.RxSingleQueryResultBinderProvider"], - ["android.arch.persistence.room.solver.CodeGenScope", "androidx.room.solver.CodeGenScope"], - ["android.arch.persistence.room.solver.ObservableQueryResultBinderProvider", "androidx.room.solver.ObservableQueryResultBinderProvider"], - ["android.arch.persistence.room.solver.query.parameter.ArrayQueryParameterAdapter", "androidx.room.solver.query.parameter.ArrayQueryParameterAdapter"], - ["android.arch.persistence.room.solver.query.parameter.BasicQueryParameterAdapter", "androidx.room.solver.query.parameter.BasicQueryParameterAdapter"], - ["android.arch.persistence.room.solver.query.parameter.CollectionQueryParameterAdapter", "androidx.room.solver.query.parameter.CollectionQueryParameterAdapter"], - ["android.arch.persistence.room.solver.query.parameter.QueryParameterAdapter", "androidx.room.solver.query.parameter.QueryParameterAdapter"], - ["android.arch.persistence.room.solver.query.result.ArrayQueryResultAdapter", "androidx.room.solver.query.result.ArrayQueryResultAdapter"], - ["android.arch.persistence.room.solver.query.result.BaseObservableQueryResultBinder", "androidx.room.solver.query.result.BaseObservableQueryResultBinder"], - ["android.arch.persistence.room.solver.query.result.CursorQueryResultBinder", "androidx.room.solver.query.result.CursorQueryResultBinder"], - ["android.arch.persistence.room.solver.query.result.DataSourceFactoryQueryResultBinder", "androidx.room.solver.query.result.DataSourceFactoryQueryResultBinder"], - ["android.arch.persistence.room.solver.query.result.EntityRowAdapter", "androidx.room.solver.query.result.EntityRowAdapter"], - ["android.arch.persistence.room.solver.query.result.FlowableQueryResultBinder", "androidx.room.solver.query.result.FlowableQueryResultBinder"], - ["android.arch.persistence.room.solver.query.result.GuavaListenableFutureQueryResultBinder", "androidx.room.solver.query.result.GuavaListenableFutureQueryResultBinder"], - ["android.arch.persistence.room.solver.query.result.GuavaOptionalQueryResultAdapter", "androidx.room.solver.query.result.GuavaOptionalQueryResultAdapter"], - ["android.arch.persistence.room.solver.query.result.InstantQueryResultBinder", "androidx.room.solver.query.result.InstantQueryResultBinder"], - ["android.arch.persistence.room.solver.query.result.ListQueryResultAdapter", "androidx.room.solver.query.result.ListQueryResultAdapter"], - ["android.arch.persistence.room.solver.query.result.LiveDataQueryResultBinder", "androidx.room.solver.query.result.LiveDataQueryResultBinder"], - ["android.arch.persistence.room.solver.query.result.OptionalQueryResultAdapter", "androidx.room.solver.query.result.OptionalQueryResultAdapter"], - ["android.arch.persistence.room.solver.query.result.PojoRowAdapter", "androidx.room.solver.query.result.PojoRowAdapter"], - ["android.arch.persistence.room.solver.query.result.PositionalDataSourceQueryResultBinder", "androidx.room.solver.query.result.PositionalDataSourceQueryResultBinder"], - ["android.arch.persistence.room.solver.query.result.QueryResultAdapter", "androidx.room.solver.query.result.QueryResultAdapter"], - ["android.arch.persistence.room.solver.query.result.QueryResultBinder", "androidx.room.solver.query.result.QueryResultBinder"], - ["android.arch.persistence.room.solver.query.result.RowAdapter", "androidx.room.solver.query.result.RowAdapter"], - ["android.arch.persistence.room.solver.query.result.RxCallableQueryResultBinder", "androidx.room.solver.query.result.RxCallableQueryResultBinder"], - ["android.arch.persistence.room.solver.query.result.SingleColumnRowAdapter", "androidx.room.solver.query.result.SingleColumnRowAdapter"], - ["android.arch.persistence.room.solver.query.result.SingleEntityQueryResultAdapter", "androidx.room.solver.query.result.SingleEntityQueryResultAdapter"], - ["android.arch.persistence.room.solver.query.result.TransactionWrapper", "androidx.room.solver.query.result.TransactionWrapper"], - ["android.arch.persistence.room.solver.query.result.TransactionWrapperKt", "androidx.room.solver.query.result.TransactionWrapperKt"], - ["android.arch.persistence.room.solver.QueryResultBinderProvider", "androidx.room.solver.QueryResultBinderProvider"], - ["android.arch.persistence.room.solver.TypeAdapterStore", "androidx.room.solver.TypeAdapterStore"], - ["android.arch.persistence.room.solver.types.BoxedBooleanToBoxedIntConverter", "androidx.room.solver.types.BoxedBooleanToBoxedIntConverter"], - ["android.arch.persistence.room.solver.types.BoxedPrimitiveColumnTypeAdapter", "androidx.room.solver.types.BoxedPrimitiveColumnTypeAdapter"], - ["android.arch.persistence.room.solver.types.ByteArrayColumnTypeAdapter", "androidx.room.solver.types.ByteArrayColumnTypeAdapter"], - ["android.arch.persistence.room.solver.types.ColumnTypeAdapter", "androidx.room.solver.types.ColumnTypeAdapter"], - ["android.arch.persistence.room.solver.types.CompositeAdapter", "androidx.room.solver.types.CompositeAdapter"], - ["android.arch.persistence.room.solver.types.CompositeTypeConverter", "androidx.room.solver.types.CompositeTypeConverter"], - ["android.arch.persistence.room.solver.types.CursorValueReader", "androidx.room.solver.types.CursorValueReader"], - ["android.arch.persistence.room.solver.types.CustomTypeConverterWrapper", "androidx.room.solver.types.CustomTypeConverterWrapper"], - ["android.arch.persistence.room.solver.types.NoOpConverter", "androidx.room.solver.types.NoOpConverter"], - ["android.arch.persistence.room.solver.types.PrimitiveBooleanToIntConverter", "androidx.room.solver.types.PrimitiveBooleanToIntConverter"], - ["android.arch.persistence.room.solver.types.PrimitiveColumnTypeAdapter", "androidx.room.solver.types.PrimitiveColumnTypeAdapter"], - ["android.arch.persistence.room.solver.types.StatementValueBinder", "androidx.room.solver.types.StatementValueBinder"], - ["android.arch.persistence.room.solver.types.StringColumnTypeAdapter", "androidx.room.solver.types.StringColumnTypeAdapter"], - ["android.arch.persistence.room.solver.types.TypeConverter", "androidx.room.solver.types.TypeConverter"], - ["android.arch.persistence.room.testing.MigrationTestHelper", "androidx.room.testing.MigrationTestHelper"], - ["android.arch.persistence.room.Transaction", "androidx.room.Transaction"], - ["android.arch.persistence.room.TypeConverter", "androidx.room.TypeConverter"], - ["android.arch.persistence.room.TypeConverters", "androidx.room.TypeConverters"], - ["android.arch.persistence.room.Update", "androidx.room.Update"], - ["android.arch.persistence.room.util.StringUtil", "androidx.room.util.StringUtil"], - ["android.arch.persistence.room.util.TableInfo", "androidx.room.util.TableInfo"], - ["android.arch.persistence.room.verifier.ColumnInfo", "androidx.room.verifier.ColumnInfo"], - ["android.arch.persistence.room.verifier.DatabaseVerificaitonErrors", "androidx.room.verifier.DatabaseVerificaitonErrors"], - ["android.arch.persistence.room.verifier.DatabaseVerifier", "androidx.room.verifier.DatabaseVerifier"], - ["android.arch.persistence.room.verifier.QueryResultInfo", "androidx.room.verifier.QueryResultInfo"], - ["android.arch.persistence.room.vo.CallType", "androidx.room.vo.CallType"], - ["android.arch.persistence.room.vo.Constructor", "androidx.room.vo.Constructor"], - ["android.arch.persistence.room.vo.CustomTypeConverter", "androidx.room.vo.CustomTypeConverter"], - ["android.arch.persistence.room.vo.Dao", "androidx.room.vo.Dao"], - ["android.arch.persistence.room.vo.DaoMethod", "androidx.room.vo.DaoMethod"], - ["android.arch.persistence.room.vo.Database", "androidx.room.vo.Database"], - ["android.arch.persistence.room.vo.DeletionMethod", "androidx.room.vo.DeletionMethod"], - ["android.arch.persistence.room.vo.EmbeddedField", "androidx.room.vo.EmbeddedField"], - ["android.arch.persistence.room.vo.Entity", "androidx.room.vo.Entity"], - ["android.arch.persistence.room.vo.Field", "androidx.room.vo.Field"], - ["android.arch.persistence.room.vo.FieldGetter", "androidx.room.vo.FieldGetter"], - ["android.arch.persistence.room.vo.FieldSetter", "androidx.room.vo.FieldSetter"], - ["android.arch.persistence.room.vo.FieldWithIndex", "androidx.room.vo.FieldWithIndex"], - ["android.arch.persistence.room.vo.ForeignKey", "androidx.room.vo.ForeignKey"], - ["android.arch.persistence.room.vo.ForeignKeyAction", "androidx.room.vo.ForeignKeyAction"], - ["android.arch.persistence.room.vo.HasSchemaIdentity", "androidx.room.vo.HasSchemaIdentity"], - ["android.arch.persistence.room.vo.Index", "androidx.room.vo.Index"], - ["android.arch.persistence.room.vo.InsertionMethod", "androidx.room.vo.InsertionMethod"], - ["android.arch.persistence.room.vo.Pojo", "androidx.room.vo.Pojo"], - ["android.arch.persistence.room.vo.PojoMethod", "androidx.room.vo.PojoMethod"], - ["android.arch.persistence.room.vo.PrimaryKey", "androidx.room.vo.PrimaryKey"], - ["android.arch.persistence.room.vo.QueryMethod", "androidx.room.vo.QueryMethod"], - ["android.arch.persistence.room.vo.QueryParameter", "androidx.room.vo.QueryParameter"], - ["android.arch.persistence.room.vo.RawQueryMethod", "androidx.room.vo.RawQueryMethod"], - ["android.arch.persistence.room.vo.Relation", "androidx.room.vo.Relation"], - ["android.arch.persistence.room.vo.RelationCollector", "androidx.room.vo.RelationCollector"], - ["android.arch.persistence.room.vo.SchemaIdentityKey", "androidx.room.vo.SchemaIdentityKey"], - ["android.arch.persistence.room.vo.ShortcutMethod", "androidx.room.vo.ShortcutMethod"], - ["android.arch.persistence.room.vo.ShortcutQueryParameter", "androidx.room.vo.ShortcutQueryParameter"], - ["android.arch.persistence.room.vo.TransactionMethod", "androidx.room.vo.TransactionMethod"], - ["android.arch.persistence.room.vo.UpdateMethod", "androidx.room.vo.UpdateMethod"], - ["android.arch.persistence.room.vo.Warning", "androidx.room.vo.Warning"], - ["android.arch.persistence.room.writer.ClassWriter", "androidx.room.writer.ClassWriter"], - ["android.arch.persistence.room.writer.DaoWriter", "androidx.room.writer.DaoWriter"], - ["android.arch.persistence.room.writer.DatabaseWriter", "androidx.room.writer.DatabaseWriter"], - ["android.arch.persistence.room.writer.EntityCursorConverterWriter", "androidx.room.writer.EntityCursorConverterWriter"], - ["android.arch.persistence.room.writer.EntityDeleteComparator", "androidx.room.writer.EntityDeleteComparator"], - ["android.arch.persistence.room.writer.EntityDeletionAdapterWriter", "androidx.room.writer.EntityDeletionAdapterWriter"], - ["android.arch.persistence.room.writer.EntityInsertionAdapterWriter", "androidx.room.writer.EntityInsertionAdapterWriter"], - ["android.arch.persistence.room.writer.EntityUpdateAdapterWriter", "androidx.room.writer.EntityUpdateAdapterWriter"], - ["android.arch.persistence.room.writer.FieldReadWriteWriter", "androidx.room.writer.FieldReadWriteWriter"], - ["android.arch.persistence.room.writer.PreparedStatementWriter", "androidx.room.writer.PreparedStatementWriter"], - ["android.arch.persistence.room.writer.QueryWriter", "androidx.room.writer.QueryWriter"], - ["android.arch.persistence.room.writer.RelationCollectorMethodWriter", "androidx.room.writer.RelationCollectorMethodWriter"], - ["android.arch.persistence.room.writer.SQLiteOpenHelperWriter", "androidx.room.writer.SQLiteOpenHelperWriter"], - ["android.arch.persistence.room.writer.TableInfoValidationWriter", "androidx.room.writer.TableInfoValidationWriter"], - ["android.databinding.adapters.AbsListViewBindingAdapter", "androidx.databinding.adapters.AbsListViewBindingAdapter"], - ["android.databinding.adapters.AbsSeekBarBindingAdapter", "androidx.databinding.adapters.AbsSeekBarBindingAdapter"], - ["android.databinding.adapters.AbsSpinnerBindingAdapter", "androidx.databinding.adapters.AbsSpinnerBindingAdapter"], - ["android.databinding.adapters.ActionMenuViewBindingAdapter", "androidx.databinding.adapters.ActionMenuViewBindingAdapter"], - ["android.databinding.adapters.AdapterViewBindingAdapter", "androidx.databinding.adapters.AdapterViewBindingAdapter"], - ["android.databinding.adapters.AutoCompleteTextViewBindingAdapter", "androidx.databinding.adapters.AutoCompleteTextViewBindingAdapter"], - ["android.databinding.adapters.CalendarViewBindingAdapter", "androidx.databinding.adapters.CalendarViewBindingAdapter"], - ["android.databinding.adapters.CardViewBindingAdapter", "androidx.databinding.adapters.CardViewBindingAdapter"], - ["android.databinding.adapters.CheckedTextViewBindingAdapter", "androidx.databinding.adapters.CheckedTextViewBindingAdapter"], - ["android.databinding.adapters.ChronometerBindingAdapter", "androidx.databinding.adapters.ChronometerBindingAdapter"], - ["android.databinding.adapters.CompoundButtonBindingAdapter", "androidx.databinding.adapters.CompoundButtonBindingAdapter"], - ["android.databinding.adapters.Converters", "androidx.databinding.adapters.Converters"], - ["android.databinding.adapters.DatePickerBindingAdapter", "androidx.databinding.adapters.DatePickerBindingAdapter"], - ["android.databinding.adapters.ExpandableListViewBindingAdapter", "androidx.databinding.adapters.ExpandableListViewBindingAdapter"], - ["android.databinding.adapters.FrameLayoutBindingAdapter", "androidx.databinding.adapters.FrameLayoutBindingAdapter"], - ["android.databinding.adapters.ImageViewBindingAdapter", "androidx.databinding.adapters.ImageViewBindingAdapter"], - ["android.databinding.adapters.LinearLayoutBindingAdapter", "androidx.databinding.adapters.LinearLayoutBindingAdapter"], - ["android.databinding.adapters.ListenerUtil", "androidx.databinding.adapters.ListenerUtil"], - ["android.databinding.adapters.NumberPickerBindingAdapter", "androidx.databinding.adapters.NumberPickerBindingAdapter"], - ["android.databinding.adapters.ObservableListAdapter", "androidx.databinding.adapters.ObservableListAdapter"], - ["android.databinding.adapters.ProgressBarBindingAdapter", "androidx.databinding.adapters.ProgressBarBindingAdapter"], - ["android.databinding.adapters.RadioGroupBindingAdapter", "androidx.databinding.adapters.RadioGroupBindingAdapter"], - ["android.databinding.adapters.RatingBarBindingAdapter", "androidx.databinding.adapters.RatingBarBindingAdapter"], - ["android.databinding.adapters.SearchViewBindingAdapter", "androidx.databinding.adapters.SearchViewBindingAdapter"], - ["android.databinding.adapters.SeekBarBindingAdapter", "androidx.databinding.adapters.SeekBarBindingAdapter"], - ["android.databinding.adapters.SpinnerBindingAdapter", "androidx.databinding.adapters.SpinnerBindingAdapter"], - ["android.databinding.adapters.SwitchBindingAdapter", "androidx.databinding.adapters.SwitchBindingAdapter"], - ["android.databinding.adapters.SwitchCompatBindingAdapter", "androidx.databinding.adapters.SwitchCompatBindingAdapter"], - ["android.databinding.adapters.TabHostBindingAdapter", "androidx.databinding.adapters.TabHostBindingAdapter"], - ["android.databinding.adapters.TableLayoutBindingAdapter", "androidx.databinding.adapters.TableLayoutBindingAdapter"], - ["android.databinding.adapters.TabWidgetBindingAdapter", "androidx.databinding.adapters.TabWidgetBindingAdapter"], - ["android.databinding.adapters.TextViewBindingAdapter", "androidx.databinding.adapters.TextViewBindingAdapter"], - ["android.databinding.adapters.TimePickerBindingAdapter", "androidx.databinding.adapters.TimePickerBindingAdapter"], - ["android.databinding.adapters.ToolbarBindingAdapter", "androidx.databinding.adapters.ToolbarBindingAdapter"], - ["android.databinding.adapters.VideoViewBindingAdapter", "androidx.databinding.adapters.VideoViewBindingAdapter"], - ["android.databinding.adapters.ViewBindingAdapter", "androidx.databinding.adapters.ViewBindingAdapter"], - ["android.databinding.adapters.ViewGroupBindingAdapter", "androidx.databinding.adapters.ViewGroupBindingAdapter"], - ["android.databinding.adapters.ViewStubBindingAdapter", "androidx.databinding.adapters.ViewStubBindingAdapter"], - ["android.databinding.adapters.ZoomControlsBindingAdapter", "androidx.databinding.adapters.ZoomControlsBindingAdapter"], - ["android.databinding.BaseObservable", "androidx.databinding.BaseObservable"], - ["android.databinding.BaseObservableField", "androidx.databinding.BaseObservableField"], - ["android.databinding.Bindable", "androidx.databinding.Bindable"], - ["android.databinding.BindingAdapter", "androidx.databinding.BindingAdapter"], - ["android.databinding.BindingBuildInfo", "androidx.databinding.BindingBuildInfo"], - ["android.databinding.BindingConversion", "androidx.databinding.BindingConversion"], - ["android.databinding.BindingMethod", "androidx.databinding.BindingMethod"], - ["android.databinding.BindingMethods", "androidx.databinding.BindingMethods"], - ["android.databinding.CallbackRegistry", "androidx.databinding.CallbackRegistry"], - ["android.databinding.DataBinderMapper", "androidx.databinding.DataBinderMapper"], - ["android.databinding.DataBinderMapperImpl", "androidx.databinding.DataBinderMapperImpl"], - ["android.databinding.DataBindingComponent", "androidx.databinding.DataBindingComponent"], - ["android.databinding.DataBindingUtil", "androidx.databinding.DataBindingUtil"], - ["android.databinding.InverseBindingAdapter", "androidx.databinding.InverseBindingAdapter"], - ["android.databinding.InverseBindingListener", "androidx.databinding.InverseBindingListener"], - ["android.databinding.InverseBindingMethod", "androidx.databinding.InverseBindingMethod"], - ["android.databinding.InverseBindingMethods", "androidx.databinding.InverseBindingMethods"], - ["android.databinding.InverseMethod", "androidx.databinding.InverseMethod"], - ["android.databinding.ListChangeRegistry", "androidx.databinding.ListChangeRegistry"], - ["android.databinding.MapChangeRegistry", "androidx.databinding.MapChangeRegistry"], - ["android.databinding.MergedDataBinderMapper", "androidx.databinding.MergedDataBinderMapper"], - ["android.databinding.Observable", "androidx.databinding.Observable"], - ["android.databinding.ObservableArrayList", "androidx.databinding.ObservableArrayList"], - ["android.databinding.ObservableArrayMap", "androidx.databinding.ObservableArrayMap"], - ["android.databinding.ObservableBoolean", "androidx.databinding.ObservableBoolean"], - ["android.databinding.ObservableByte", "androidx.databinding.ObservableByte"], - ["android.databinding.ObservableChar", "androidx.databinding.ObservableChar"], - ["android.databinding.ObservableDouble", "androidx.databinding.ObservableDouble"], - ["android.databinding.ObservableField", "androidx.databinding.ObservableField"], - ["android.databinding.ObservableFloat", "androidx.databinding.ObservableFloat"], - ["android.databinding.ObservableInt", "androidx.databinding.ObservableInt"], - ["android.databinding.ObservableList", "androidx.databinding.ObservableList"], - ["android.databinding.ObservableLong", "androidx.databinding.ObservableLong"], - ["android.databinding.ObservableMap", "androidx.databinding.ObservableMap"], - ["android.databinding.ObservableParcelable", "androidx.databinding.ObservableParcelable"], - ["android.databinding.ObservableShort", "androidx.databinding.ObservableShort"], - ["android.databinding.OnRebindCallback", "androidx.databinding.OnRebindCallback"], - ["android.databinding.PropertyChangeRegistry", "androidx.databinding.PropertyChangeRegistry"], - ["android.databinding.Untaggable", "androidx.databinding.Untaggable"], - ["android.databinding.ViewDataBinding", "androidx.databinding.ViewDataBinding"], - ["android.databinding.ViewStubProxy", "androidx.databinding.ViewStubProxy"], - ["android.support.animation.AnimationHandler", "androidx.dynamicanimation.animation.AnimationHandler"], - ["android.support.animation.DynamicAnimation", "androidx.dynamicanimation.animation.DynamicAnimation"], - ["android.support.animation.FlingAnimation", "androidx.dynamicanimation.animation.FlingAnimation"], - ["android.support.animation.FloatPropertyCompat", "androidx.dynamicanimation.animation.FloatPropertyCompat"], - ["android.support.animation.FloatValueHolder", "androidx.dynamicanimation.animation.FloatValueHolder"], - ["android.support.animation.Force", "androidx.dynamicanimation.animation.Force"], - ["android.support.animation.SpringAnimation", "androidx.dynamicanimation.animation.SpringAnimation"], - ["android.support.animation.SpringForce", "androidx.dynamicanimation.animation.SpringForce"], - ["android.support.annotation.AnimatorRes", "androidx.annotation.AnimatorRes"], - ["android.support.annotation.AnimRes", "androidx.annotation.AnimRes"], - ["android.support.annotation.AnyRes", "androidx.annotation.AnyRes"], - ["android.support.annotation.AnyThread", "androidx.annotation.AnyThread"], - ["android.support.annotation.ArrayRes", "androidx.annotation.ArrayRes"], - ["android.support.annotation.AttrRes", "androidx.annotation.AttrRes"], - ["android.support.annotation.BinderThread", "androidx.annotation.BinderThread"], - ["android.support.annotation.BoolRes", "androidx.annotation.BoolRes"], - ["android.support.annotation.CallSuper", "androidx.annotation.CallSuper"], - ["android.support.annotation.CheckResult", "androidx.annotation.CheckResult"], - ["android.support.annotation.ColorInt", "androidx.annotation.ColorInt"], - ["android.support.annotation.ColorLong", "androidx.annotation.ColorLong"], - ["android.support.annotation.ColorRes", "androidx.annotation.ColorRes"], - ["android.support.annotation.DimenRes", "androidx.annotation.DimenRes"], - ["android.support.annotation.Dimension", "androidx.annotation.Dimension"], - ["android.support.annotation.DrawableRes", "androidx.annotation.DrawableRes"], - ["android.support.annotation.FloatRange", "androidx.annotation.FloatRange"], - ["android.support.annotation.FontRes", "androidx.annotation.FontRes"], - ["android.support.annotation.FractionRes", "androidx.annotation.FractionRes"], - ["android.support.annotation.GuardedBy", "androidx.annotation.GuardedBy"], - ["android.support.annotation.HalfFloat", "androidx.annotation.HalfFloat"], - ["android.support.annotation.IdRes", "androidx.annotation.IdRes"], - ["android.support.annotation.IntDef", "androidx.annotation.IntDef"], - ["android.support.annotation.IntegerRes", "androidx.annotation.IntegerRes"], - ["android.support.annotation.InterpolatorRes", "androidx.annotation.InterpolatorRes"], - ["android.support.annotation.IntRange", "androidx.annotation.IntRange"], - ["android.support.annotation.Keep", "androidx.annotation.Keep"], - ["android.support.annotation.LayoutRes", "androidx.annotation.LayoutRes"], - ["android.support.annotation.LongDef", "androidx.annotation.LongDef"], - ["android.support.annotation.MainThread", "androidx.annotation.MainThread"], - ["android.support.annotation.MenuRes", "androidx.annotation.MenuRes"], - ["android.support.annotation.NavigationRes", "androidx.annotation.NavigationRes"], - ["android.support.annotation.NonNull", "androidx.annotation.NonNull"], - ["android.support.annotation.Nullable", "androidx.annotation.Nullable"], - ["android.support.annotation.PluralsRes", "androidx.annotation.PluralsRes"], - ["android.support.annotation.Px", "androidx.annotation.Px"], - ["android.support.annotation.RawRes", "androidx.annotation.RawRes"], - ["android.support.annotation.RequiresApi", "androidx.annotation.RequiresApi"], - ["android.support.annotation.RequiresFeature", "androidx.annotation.RequiresFeature"], - ["android.support.annotation.RequiresPermission", "androidx.annotation.RequiresPermission"], - ["android.support.annotation.RestrictTo", "androidx.annotation.RestrictTo"], - ["android.support.annotation.Size", "androidx.annotation.Size"], - ["android.support.annotation.StringDef", "androidx.annotation.StringDef"], - ["android.support.annotation.StringRes", "androidx.annotation.StringRes"], - ["android.support.annotation.StyleableRes", "androidx.annotation.StyleableRes"], - ["android.support.annotation.StyleRes", "androidx.annotation.StyleRes"], - ["android.support.annotation.TransitionRes", "androidx.annotation.TransitionRes"], - ["android.support.annotation.UiThread", "androidx.annotation.UiThread"], - ["android.support.annotation.VisibleForTesting", "androidx.annotation.VisibleForTesting"], - ["android.support.annotation.WorkerThread", "androidx.annotation.WorkerThread"], - ["android.support.annotation.XmlRes", "androidx.annotation.XmlRes"], - ["android.support.app.recommendation.ContentRecommendation", "androidx.recommendation.app.ContentRecommendation"], - ["android.support.app.recommendation.RecommendationExtender", "androidx.recommendation.app.RecommendationExtender"], - ["android.support.compat.R", "androidx.core.R"], - ["android.support.constraint.Barrier", "androidx.constraintlayout.widget.Barrier"], - ["android.support.constraint.ConstraintHelper", "androidx.constraintlayout.widget.ConstraintHelper"], - ["android.support.constraint.ConstraintLayout", "androidx.constraintlayout.widget.ConstraintLayout"], - ["android.support.constraint.Constraints", "androidx.constraintlayout.widget.Constraints"], - ["android.support.constraint.ConstraintSet", "androidx.constraintlayout.widget.ConstraintSet"], - ["android.support.constraint.Group", "androidx.constraintlayout.widget.Group"], - ["android.support.constraint.Guideline", "androidx.constraintlayout.widget.Guideline"], - ["android.support.constraint.Placeholder", "androidx.constraintlayout.widget.Placeholder"], - ["android.support.constraint.R", "androidx.constraintlayout.widget.R"], - ["android.support.constraint.solver.ArrayLinkedVariables", "androidx.constraintlayout.solver.ArrayLinkedVariables"], - ["android.support.constraint.solver.ArrayRow", "androidx.constraintlayout.solver.ArrayRow"], - ["android.support.constraint.solver.Cache", "androidx.constraintlayout.solver.Cache"], - ["android.support.constraint.solver.GoalRow", "androidx.constraintlayout.solver.GoalRow"], - ["android.support.constraint.solver.LinearSystem", "androidx.constraintlayout.solver.LinearSystem"], - ["android.support.constraint.solver.Metrics", "androidx.constraintlayout.solver.Metrics"], - ["android.support.constraint.solver.Pools", "androidx.constraintlayout.solver.Pools"], - ["android.support.constraint.solver.SolverVariable", "androidx.constraintlayout.solver.SolverVariable"], - ["android.support.constraint.solver.widgets.Analyzer", "androidx.constraintlayout.solver.widgets.Analyzer"], - ["android.support.constraint.solver.widgets.Barrier", "androidx.constraintlayout.solver.widgets.Barrier"], - ["android.support.constraint.solver.widgets.Chain", "androidx.constraintlayout.solver.widgets.Chain"], - ["android.support.constraint.solver.widgets.ChainHead", "androidx.constraintlayout.solver.widgets.ChainHead"], - ["android.support.constraint.solver.widgets.ConstraintAnchor", "androidx.constraintlayout.solver.widgets.ConstraintAnchor"], - ["android.support.constraint.solver.widgets.ConstraintHorizontalLayout", "androidx.constraintlayout.solver.widgets.ConstraintHorizontalLayout"], - ["android.support.constraint.solver.widgets.ConstraintTableLayout", "androidx.constraintlayout.solver.widgets.ConstraintTableLayout"], - ["android.support.constraint.solver.widgets.ConstraintWidget", "androidx.constraintlayout.solver.widgets.ConstraintWidget"], - ["android.support.constraint.solver.widgets.ConstraintWidgetContainer", "androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer"], - ["android.support.constraint.solver.widgets.ConstraintWidgetGroup", "androidx.constraintlayout.solver.widgets.ConstraintWidgetGroup"], - ["android.support.constraint.solver.widgets.Guideline", "androidx.constraintlayout.solver.widgets.Guideline"], - ["android.support.constraint.solver.widgets.Helper", "androidx.constraintlayout.solver.widgets.Helper"], - ["android.support.constraint.solver.widgets.Optimizer", "androidx.constraintlayout.solver.widgets.Optimizer"], - ["android.support.constraint.solver.widgets.Rectangle", "androidx.constraintlayout.solver.widgets.Rectangle"], - ["android.support.constraint.solver.widgets.ResolutionAnchor", "androidx.constraintlayout.solver.widgets.ResolutionAnchor"], - ["android.support.constraint.solver.widgets.ResolutionDimension", "androidx.constraintlayout.solver.widgets.ResolutionDimension"], - ["android.support.constraint.solver.widgets.ResolutionNode", "androidx.constraintlayout.solver.widgets.ResolutionNode"], - ["android.support.constraint.solver.widgets.Snapshot", "androidx.constraintlayout.solver.widgets.Snapshot"], - ["android.support.constraint.solver.widgets.WidgetContainer", "androidx.constraintlayout.solver.widgets.WidgetContainer"], - ["android.support.content.ContentPager", "androidx.contentpager.content.ContentPager"], - ["android.support.content.InMemoryCursor", "androidx.contentpager.content.InMemoryCursor"], - ["android.support.content.LoaderQueryRunner", "androidx.contentpager.content.LoaderQueryRunner"], - ["android.support.content.Query", "androidx.contentpager.content.Query"], - ["android.support.coordinatorlayout.R", "androidx.coordinatorlayout.R"], - ["android.support.customtabs.CustomTabsCallback", "androidx.browser.customtabs.CustomTabsCallback"], - ["android.support.customtabs.CustomTabsClient", "androidx.browser.customtabs.CustomTabsClient"], - ["android.support.customtabs.CustomTabsIntent", "androidx.browser.customtabs.CustomTabsIntent"], - ["android.support.customtabs.CustomTabsService", "androidx.browser.customtabs.CustomTabsService"], - ["android.support.customtabs.CustomTabsServiceConnection", "androidx.browser.customtabs.CustomTabsServiceConnection"], - ["android.support.customtabs.CustomTabsSession", "androidx.browser.customtabs.CustomTabsSession"], - ["android.support.customtabs.CustomTabsSessionToken", "androidx.browser.customtabs.CustomTabsSessionToken"], - ["android.support.customtabs.ICustomTabsCallback", "android.support.customtabs.ICustomTabsCallback"], - ["android.support.customtabs.ICustomTabsService", "android.support.customtabs.ICustomTabsService"], - ["android.support.customtabs.IPostMessageService", "android.support.customtabs.IPostMessageService"], - ["android.support.customtabs.PostMessageService", "androidx.browser.customtabs.PostMessageService"], - ["android.support.customtabs.PostMessageServiceConnection", "androidx.browser.customtabs.PostMessageServiceConnection"], - ["android.support.customtabs.R", "androidx.browser.R"], - ["android.support.customtabs.TrustedWebUtils", "androidx.browser.customtabs.TrustedWebUtils"], - ["android.support.design.animation.AnimationUtils", "com.google.android.material.animation.AnimationUtils"], - ["android.support.design.animation.AnimatorSetCompat", "com.google.android.material.animation.AnimatorSetCompat"], - ["android.support.design.animation.ArgbEvaluatorCompat", "com.google.android.material.animation.ArgbEvaluatorCompat"], - ["android.support.design.animation.ChildrenAlphaProperty", "com.google.android.material.animation.ChildrenAlphaProperty"], - ["android.support.design.animation.DrawableAlphaProperty", "com.google.android.material.animation.DrawableAlphaProperty"], - ["android.support.design.animation.ImageMatrixProperty", "com.google.android.material.animation.ImageMatrixProperty"], - ["android.support.design.animation.MatrixEvaluator", "com.google.android.material.animation.MatrixEvaluator"], - ["android.support.design.animation.MotionSpec", "com.google.android.material.animation.MotionSpec"], - ["android.support.design.animation.MotionTiming", "com.google.android.material.animation.MotionTiming"], - ["android.support.design.animation.Positioning", "com.google.android.material.animation.Positioning"], - ["android.support.design.behavior.HideBottomViewOnScrollBehavior", "com.google.android.material.behavior.HideBottomViewOnScrollBehavior"], - ["android.support.design.bottomappbar.BottomAppBar", "com.google.android.material.bottomappbar.BottomAppBar"], - ["android.support.design.bottomappbar.BottomAppBarTopEdgeTreatment", "com.google.android.material.bottomappbar.BottomAppBarTopEdgeTreatment"], - ["android.support.design.bottomnavigation.LabelVisibilityMode", "com.google.android.material.bottomnavigation.LabelVisibilityMode"], - ["android.support.design.button.MaterialButton", "com.google.android.material.button.MaterialButton"], - ["android.support.design.button.MaterialButtonBackgroundDrawable", "com.google.android.material.button.MaterialButtonBackgroundDrawable"], - ["android.support.design.button.MaterialButtonHelper", "com.google.android.material.button.MaterialButtonHelper"], - ["android.support.design.canvas.CanvasCompat", "com.google.android.material.canvas.CanvasCompat"], - ["android.support.design.card.MaterialCardView", "com.google.android.material.card.MaterialCardView"], - ["android.support.design.card.MaterialCardViewHelper", "com.google.android.material.card.MaterialCardViewHelper"], - ["android.support.design.chip.Chip", "com.google.android.material.chip.Chip"], - ["android.support.design.chip.ChipDrawable", "com.google.android.material.chip.ChipDrawable"], - ["android.support.design.chip.ChipGroup", "com.google.android.material.chip.ChipGroup"], - ["android.support.design.circularreveal.cardview.CircularRevealCardView", "com.google.android.material.circularreveal.cardview.CircularRevealCardView"], - ["android.support.design.circularreveal.CircularRevealCompat", "com.google.android.material.circularreveal.CircularRevealCompat"], - ["android.support.design.circularreveal.CircularRevealFrameLayout", "com.google.android.material.circularreveal.CircularRevealFrameLayout"], - ["android.support.design.circularreveal.CircularRevealGridLayout", "com.google.android.material.circularreveal.CircularRevealGridLayout"], - ["android.support.design.circularreveal.CircularRevealHelper", "com.google.android.material.circularreveal.CircularRevealHelper"], - ["android.support.design.circularreveal.CircularRevealLinearLayout", "com.google.android.material.circularreveal.CircularRevealLinearLayout"], - ["android.support.design.circularreveal.CircularRevealRelativeLayout", "com.google.android.material.circularreveal.CircularRevealRelativeLayout"], - ["android.support.design.circularreveal.CircularRevealWidget", "com.google.android.material.circularreveal.CircularRevealWidget"], - ["android.support.design.circularreveal.coordinatorlayout.CircularRevealCoordinatorLayout", "com.google.android.material.circularreveal.coordinatorlayout.CircularRevealCoordinatorLayout"], - ["android.support.design.drawable.DrawableUtils", "com.google.android.material.drawable.DrawableUtils"], - ["android.support.design.expandable.ExpandableTransformationWidget", "com.google.android.material.expandable.ExpandableTransformationWidget"], - ["android.support.design.expandable.ExpandableWidget", "com.google.android.material.expandable.ExpandableWidget"], - ["android.support.design.expandable.ExpandableWidgetHelper", "com.google.android.material.expandable.ExpandableWidgetHelper"], - ["android.support.design.internal.BaselineLayout", "com.google.android.material.internal.BaselineLayout"], - ["android.support.design.internal.BottomNavigationItemView", "com.google.android.material.bottomnavigation.BottomNavigationItemView"], - ["android.support.design.internal.BottomNavigationMenu", "com.google.android.material.bottomnavigation.BottomNavigationMenu"], - ["android.support.design.internal.BottomNavigationMenuView", "com.google.android.material.bottomnavigation.BottomNavigationMenuView"], - ["android.support.design.internal.BottomNavigationPresenter", "com.google.android.material.bottomnavigation.BottomNavigationPresenter"], - ["android.support.design.internal.Experimental", "com.google.android.material.internal.Experimental"], - ["android.support.design.internal.FlowLayout", "com.google.android.material.internal.FlowLayout"], - ["android.support.design.internal.ForegroundLinearLayout", "com.google.android.material.internal.ForegroundLinearLayout"], - ["android.support.design.internal.NavigationMenu", "com.google.android.material.internal.NavigationMenu"], - ["android.support.design.internal.NavigationMenuItemView", "com.google.android.material.internal.NavigationMenuItemView"], - ["android.support.design.internal.NavigationMenuPresenter", "com.google.android.material.internal.NavigationMenuPresenter"], - ["android.support.design.internal.NavigationMenuView", "com.google.android.material.internal.NavigationMenuView"], - ["android.support.design.internal.NavigationSubMenu", "com.google.android.material.internal.NavigationSubMenu"], - ["android.support.design.internal.ParcelableSparseArray", "com.google.android.material.internal.ParcelableSparseArray"], - ["android.support.design.internal.ScrimInsetsFrameLayout", "com.google.android.material.internal.ScrimInsetsFrameLayout"], - ["android.support.design.internal.TextScale", "com.google.android.material.internal.TextScale"], - ["android.support.design.internal.ThemeEnforcement", "com.google.android.material.internal.ThemeEnforcement"], - ["android.support.design.internal.ViewUtils", "com.google.android.material.internal.ViewUtils"], - ["android.support.design.R", "com.google.android.material.R"], - ["android.support.design.resources.MaterialResources", "com.google.android.material.resources.MaterialResources"], - ["android.support.design.resources.TextAppearance", "com.google.android.material.resources.TextAppearance"], - ["android.support.design.resources.TextAppearanceConfig", "com.google.android.material.resources.TextAppearanceConfig"], - ["android.support.design.ripple.RippleUtils", "com.google.android.material.ripple.RippleUtils"], - ["android.support.design.shape.CornerTreatment", "com.google.android.material.shape.CornerTreatment"], - ["android.support.design.shape.CutCornerTreatment", "com.google.android.material.shape.CutCornerTreatment"], - ["android.support.design.shape.EdgeTreatment", "com.google.android.material.shape.EdgeTreatment"], - ["android.support.design.shape.InterpolateOnScrollPositionChangeHelper", "com.google.android.material.shape.InterpolateOnScrollPositionChangeHelper"], - ["android.support.design.shape.MaterialShapeDrawable", "com.google.android.material.shape.MaterialShapeDrawable"], - ["android.support.design.shape.RoundedCornerTreatment", "com.google.android.material.shape.RoundedCornerTreatment"], - ["android.support.design.shape.ShapePath", "com.google.android.material.shape.ShapePath"], - ["android.support.design.shape.ShapePathModel", "com.google.android.material.shape.ShapePathModel"], - ["android.support.design.shape.TriangleEdgeTreatment", "com.google.android.material.shape.TriangleEdgeTreatment"], - ["android.support.design.snackbar.ContentViewCallback", "com.google.android.material.snackbar.ContentViewCallback"], - ["android.support.design.stateful.ExtendableSavedState", "com.google.android.material.stateful.ExtendableSavedState"], - ["android.support.design.theme.MaterialComponentsViewInflater", "com.google.android.material.theme.MaterialComponentsViewInflater"], - ["android.support.design.transformation.ExpandableBehavior", "com.google.android.material.transformation.ExpandableBehavior"], - ["android.support.design.transformation.ExpandableTransformationBehavior", "com.google.android.material.transformation.ExpandableTransformationBehavior"], - ["android.support.design.transformation.FabTransformationBehavior", "com.google.android.material.transformation.FabTransformationBehavior"], - ["android.support.design.transformation.FabTransformationScrimBehavior", "com.google.android.material.transformation.FabTransformationScrimBehavior"], - ["android.support.design.transformation.FabTransformationSheetBehavior", "com.google.android.material.transformation.FabTransformationSheetBehavior"], - ["android.support.design.transformation.TransformationChildCard", "com.google.android.material.transformation.TransformationChildCard"], - ["android.support.design.transformation.TransformationChildLayout", "com.google.android.material.transformation.TransformationChildLayout"], - ["android.support.design.widget.AppBarLayout", "com.google.android.material.appbar.AppBarLayout"], - ["android.support.design.widget.BaseTransientBottomBar", "com.google.android.material.snackbar.BaseTransientBottomBar"], - ["android.support.design.widget.BottomNavigationView", "com.google.android.material.bottomnavigation.BottomNavigationView"], - ["android.support.design.widget.BottomSheetBehavior", "com.google.android.material.bottomsheet.BottomSheetBehavior"], - ["android.support.design.widget.BottomSheetDialog", "com.google.android.material.bottomsheet.BottomSheetDialog"], - ["android.support.design.widget.BottomSheetDialogFragment", "com.google.android.material.bottomsheet.BottomSheetDialogFragment"], - ["android.support.design.widget.CheckableImageButton", "com.google.android.material.internal.CheckableImageButton"], - ["android.support.design.widget.CircularBorderDrawable", "com.google.android.material.internal.CircularBorderDrawable"], - ["android.support.design.widget.CircularBorderDrawableLollipop", "com.google.android.material.internal.CircularBorderDrawableLollipop"], - ["android.support.design.widget.CollapsingTextHelper", "com.google.android.material.internal.CollapsingTextHelper"], - ["android.support.design.widget.CollapsingToolbarLayout", "com.google.android.material.appbar.CollapsingToolbarLayout"], - ["android.support.design.widget.CoordinatorLayout", "androidx.coordinatorlayout.widget.CoordinatorLayout"], - ["android.support.design.widget.CutoutDrawable", "com.google.android.material.textfield.CutoutDrawable"], - ["android.support.design.widget.DescendantOffsetUtils", "com.google.android.material.internal.DescendantOffsetUtils"], - ["android.support.design.widget.DrawableUtils", "com.google.android.material.internal.DrawableUtils"], - ["android.support.design.widget.FloatingActionButton", "com.google.android.material.floatingactionbutton.FloatingActionButton"], - ["android.support.design.widget.FloatingActionButtonImpl", "com.google.android.material.floatingactionbutton.FloatingActionButtonImpl"], - ["android.support.design.widget.FloatingActionButtonImplLollipop", "com.google.android.material.floatingactionbutton.FloatingActionButtonImplLollipop"], - ["android.support.design.widget.HeaderBehavior", "com.google.android.material.appbar.HeaderBehavior"], - ["android.support.design.widget.HeaderScrollingViewBehavior", "com.google.android.material.appbar.HeaderScrollingViewBehavior"], - ["android.support.design.widget.IndicatorViewController", "com.google.android.material.textfield.IndicatorViewController"], - ["android.support.design.widget.MathUtils", "com.google.android.material.math.MathUtils"], - ["android.support.design.widget.NavigationView", "com.google.android.material.navigation.NavigationView"], - ["android.support.design.widget.ShadowDrawableWrapper", "com.google.android.material.shadow.ShadowDrawableWrapper"], - ["android.support.design.widget.ShadowViewDelegate", "com.google.android.material.shadow.ShadowViewDelegate"], - ["android.support.design.widget.Snackbar", "com.google.android.material.snackbar.Snackbar"], - ["android.support.design.widget.SnackbarContentLayout", "com.google.android.material.snackbar.SnackbarContentLayout"], - ["android.support.design.widget.SnackbarManager", "com.google.android.material.snackbar.SnackbarManager"], - ["android.support.design.widget.StateListAnimator", "com.google.android.material.internal.StateListAnimator"], - ["android.support.design.widget.SwipeDismissBehavior", "com.google.android.material.behavior.SwipeDismissBehavior"], - ["android.support.design.widget.TabItem", "com.google.android.material.tabs.TabItem"], - ["android.support.design.widget.TabLayout", "com.google.android.material.tabs.TabLayout"], - ["android.support.design.widget.TextInputEditText", "com.google.android.material.textfield.TextInputEditText"], - ["android.support.design.widget.TextInputLayout", "com.google.android.material.textfield.TextInputLayout"], - ["android.support.design.widget.ViewOffsetBehavior", "com.google.android.material.appbar.ViewOffsetBehavior"], - ["android.support.design.widget.ViewOffsetHelper", "com.google.android.material.appbar.ViewOffsetHelper"], - ["android.support.design.widget.ViewUtilsLollipop", "com.google.android.material.appbar.ViewUtilsLollipop"], - ["android.support.design.widget.VisibilityAwareImageButton", "com.google.android.material.internal.VisibilityAwareImageButton"], - ["android.support.graphics.drawable.AndroidResources", "androidx.vectordrawable.graphics.drawable.AndroidResources"], - ["android.support.graphics.drawable.Animatable2Compat", "androidx.vectordrawable.graphics.drawable.Animatable2Compat"], - ["android.support.graphics.drawable.AnimatedVectorDrawableCompat", "androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat"], - ["android.support.graphics.drawable.AnimationUtilsCompat", "androidx.vectordrawable.graphics.drawable.AnimationUtilsCompat"], - ["android.support.graphics.drawable.AnimatorInflaterCompat", "androidx.vectordrawable.graphics.drawable.AnimatorInflaterCompat"], - ["android.support.graphics.drawable.ArgbEvaluator", "androidx.vectordrawable.graphics.drawable.ArgbEvaluator"], - ["android.support.graphics.drawable.PathInterpolatorCompat", "androidx.vectordrawable.graphics.drawable.PathInterpolatorCompat"], - ["android.support.graphics.drawable.VectorDrawableCommon", "androidx.vectordrawable.graphics.drawable.VectorDrawableCommon"], - ["android.support.graphics.drawable.VectorDrawableCompat", "androidx.vectordrawable.graphics.drawable.VectorDrawableCompat"], - ["android.support.media.ExifInterface", "androidx.exifinterface.media.ExifInterface"], - ["android.support.media.tv.BasePreviewProgram", "androidx.tvprovider.media.tv.BasePreviewProgram"], - ["android.support.media.tv.BaseProgram", "androidx.tvprovider.media.tv.BaseProgram"], - ["android.support.media.tv.Channel", "androidx.tvprovider.media.tv.Channel"], - ["android.support.media.tv.ChannelLogoUtils", "androidx.tvprovider.media.tv.ChannelLogoUtils"], - ["android.support.media.tv.CollectionUtils", "androidx.tvprovider.media.tv.CollectionUtils"], - ["android.support.media.tv.PreviewChannel", "androidx.tvprovider.media.tv.PreviewChannel"], - ["android.support.media.tv.PreviewChannelHelper", "androidx.tvprovider.media.tv.PreviewChannelHelper"], - ["android.support.media.tv.PreviewProgram", "androidx.tvprovider.media.tv.PreviewProgram"], - ["android.support.media.tv.Program", "androidx.tvprovider.media.tv.Program"], - ["android.support.media.tv.TvContractCompat", "androidx.tvprovider.media.tv.TvContractCompat"], - ["android.support.media.tv.TvContractUtils", "androidx.tvprovider.media.tv.TvContractUtils"], - ["android.support.media.tv.WatchNextProgram", "androidx.tvprovider.media.tv.WatchNextProgram"], - ["android.support.media2.BaseRemoteMediaPlayerConnector", "android.support.media2.BaseRemoteMediaPlayerConnector"], - ["android.support.media2.DataSourceDesc2", "android.support.media2.DataSourceDesc2"], - ["android.support.media2.MediaPlayerConnector", "android.support.media2.MediaPlayerConnector"], - ["android.support.media2.MediaPlaylistAgent", "android.support.media2.MediaPlaylistAgent"], - ["android.support.media2.MediaSession2", "android.support.media2.MediaSession2"], - ["android.support.mediacompat.R", "androidx.media.R"], - ["android.support.multidex.MultiDex", "androidx.multidex.MultiDex"], - ["android.support.multidex.MultiDexApplication", "androidx.multidex.MultiDexApplication"], - ["android.support.multidex.MultiDexExtractor", "androidx.multidex.MultiDexExtractor"], - ["android.support.multidex.ZipUtil", "androidx.multidex.ZipUtil"], - ["android.support.percent.PercentFrameLayout", "androidx.percentlayout.widget.PercentFrameLayout"], - ["android.support.percent.PercentLayoutHelper", "androidx.percentlayout.widget.PercentLayoutHelper"], - ["android.support.percent.PercentRelativeLayout", "androidx.percentlayout.widget.PercentRelativeLayout"], - ["android.support.percent.R", "androidx.percentlayout.R"], - ["android.support.test.annotation.Beta", "androidx.test.annotation.Beta"], - ["android.support.test.annotation.UiThreadTest", "androidx.test.annotation.UiThreadTest"], - ["android.support.test.espresso.accessibility.AccessibilityChecks", "androidx.test.espresso.accessibility.AccessibilityChecks"], - ["android.support.test.espresso.action.AdapterDataLoaderAction", "androidx.test.espresso.action.AdapterDataLoaderAction"], - ["android.support.test.espresso.action.AdapterDataLoaderActionRemoteMsg", "androidx.test.espresso.action.AdapterDataLoaderActionRemoteMsg"], - ["android.support.test.espresso.action.AdapterViewProtocol", "androidx.test.espresso.action.AdapterViewProtocol"], - ["android.support.test.espresso.action.AdapterViewProtocols", "androidx.test.espresso.action.AdapterViewProtocols"], - ["android.support.test.espresso.action.CloseKeyboardAction", "androidx.test.espresso.action.CloseKeyboardAction"], - ["android.support.test.espresso.action.CoordinatesProvider", "androidx.test.espresso.action.CoordinatesProvider"], - ["android.support.test.espresso.action.EditorAction", "androidx.test.espresso.action.EditorAction"], - ["android.support.test.espresso.action.EspressoKey", "androidx.test.espresso.action.EspressoKey"], - ["android.support.test.espresso.action.GeneralClickAction", "androidx.test.espresso.action.GeneralClickAction"], - ["android.support.test.espresso.action.GeneralClickActionRemoteMessage", "androidx.test.espresso.action.GeneralClickActionRemoteMessage"], - ["android.support.test.espresso.action.GeneralLocation", "androidx.test.espresso.action.GeneralLocation"], - ["android.support.test.espresso.action.GeneralLocationRemoteMessage", "androidx.test.espresso.action.GeneralLocationRemoteMessage"], - ["android.support.test.espresso.action.GeneralSwipeAction", "androidx.test.espresso.action.GeneralSwipeAction"], - ["android.support.test.espresso.action.GeneralSwipeActionRemoteMessage", "androidx.test.espresso.action.GeneralSwipeActionRemoteMessage"], - ["android.support.test.espresso.action.KeyEventAction", "androidx.test.espresso.action.KeyEventAction"], - ["android.support.test.espresso.action.KeyEventActionBase", "androidx.test.espresso.action.KeyEventActionBase"], - ["android.support.test.espresso.action.MotionEvents", "androidx.test.espresso.action.MotionEvents"], - ["android.support.test.espresso.action.OpenLinkAction", "androidx.test.espresso.action.OpenLinkAction"], - ["android.support.test.espresso.action.PrecisionDescriber", "androidx.test.espresso.action.PrecisionDescriber"], - ["android.support.test.espresso.action.Press", "androidx.test.espresso.action.Press"], - ["android.support.test.espresso.action.PressBackAction", "androidx.test.espresso.action.PressBackAction"], - ["android.support.test.espresso.action.PressRemoteMessage", "androidx.test.espresso.action.PressRemoteMessage"], - ["android.support.test.espresso.action.RemoteViewActions", "androidx.test.espresso.action.RemoteViewActions"], - ["android.support.test.espresso.action.RepeatActionUntilViewState", "androidx.test.espresso.action.RepeatActionUntilViewState"], - ["android.support.test.espresso.action.ReplaceTextAction", "androidx.test.espresso.action.ReplaceTextAction"], - ["android.support.test.espresso.action.ScrollToAction", "androidx.test.espresso.action.ScrollToAction"], - ["android.support.test.espresso.action.Swipe", "androidx.test.espresso.action.Swipe"], - ["android.support.test.espresso.action.Swiper", "androidx.test.espresso.action.Swiper"], - ["android.support.test.espresso.action.SwipeRemoteMessage", "androidx.test.espresso.action.SwipeRemoteMessage"], - ["android.support.test.espresso.action.Tap", "androidx.test.espresso.action.Tap"], - ["android.support.test.espresso.action.Tapper", "androidx.test.espresso.action.Tapper"], - ["android.support.test.espresso.action.TapRemoteMessage", "androidx.test.espresso.action.TapRemoteMessage"], - ["android.support.test.espresso.action.TranslatedCoordinatesProvider", "androidx.test.espresso.action.TranslatedCoordinatesProvider"], - ["android.support.test.espresso.action.TranslatedCoordinatesProviderRemoteMessage", "androidx.test.espresso.action.TranslatedCoordinatesProviderRemoteMessage"], - ["android.support.test.espresso.action.TypeTextAction", "androidx.test.espresso.action.TypeTextAction"], - ["android.support.test.espresso.action.ViewActions", "androidx.test.espresso.action.ViewActions"], - ["android.support.test.espresso.AmbiguousViewMatcherException", "androidx.test.espresso.AmbiguousViewMatcherException"], - ["android.support.test.espresso.AppNotIdleException", "androidx.test.espresso.AppNotIdleException"], - ["android.support.test.espresso.assertion.LayoutAssertions", "androidx.test.espresso.assertion.LayoutAssertions"], - ["android.support.test.espresso.assertion.PositionAssertions", "androidx.test.espresso.assertion.PositionAssertions"], - ["android.support.test.espresso.assertion.RemoteViewAssertions", "androidx.test.espresso.assertion.RemoteViewAssertions"], - ["android.support.test.espresso.assertion.ViewAssertions", "androidx.test.espresso.assertion.ViewAssertions"], - ["android.support.test.espresso.base.ActiveRootLister", "androidx.test.espresso.base.ActiveRootLister"], - ["android.support.test.espresso.base.AsyncTaskPoolMonitor", "androidx.test.espresso.base.AsyncTaskPoolMonitor"], - ["android.support.test.espresso.base.BaseLayerModule_FailureHandlerHolder_Factory", "androidx.test.espresso.base.BaseLayerModule_FailureHandlerHolder_Factory"], - ["android.support.test.espresso.base.BaseLayerModule_ProvideActiveRootListerFactory", "androidx.test.espresso.base.BaseLayerModule_ProvideActiveRootListerFactory"], - ["android.support.test.espresso.base.BaseLayerModule_ProvideCompatAsyncTaskMonitorFactory", "androidx.test.espresso.base.BaseLayerModule_ProvideCompatAsyncTaskMonitorFactory"], - ["android.support.test.espresso.base.BaseLayerModule_ProvideDynamicNotiferFactory", "androidx.test.espresso.base.BaseLayerModule_ProvideDynamicNotiferFactory"], - ["android.support.test.espresso.base.BaseLayerModule_ProvideEventInjectorFactory", "androidx.test.espresso.base.BaseLayerModule_ProvideEventInjectorFactory"], - ["android.support.test.espresso.base.BaseLayerModule_ProvideFailureHanderFactory", "androidx.test.espresso.base.BaseLayerModule_ProvideFailureHanderFactory"], - ["android.support.test.espresso.base.BaseLayerModule_ProvideFailureHandlerFactory", "androidx.test.espresso.base.BaseLayerModule_ProvideFailureHandlerFactory"], - ["android.support.test.espresso.base.BaseLayerModule_ProvideLifecycleMonitorFactory", "androidx.test.espresso.base.BaseLayerModule_ProvideLifecycleMonitorFactory"], - ["android.support.test.espresso.base.BaseLayerModule_ProvideMainLooperFactory", "androidx.test.espresso.base.BaseLayerModule_ProvideMainLooperFactory"], - ["android.support.test.espresso.base.BaseLayerModule_ProvideMainThreadExecutorFactory", "androidx.test.espresso.base.BaseLayerModule_ProvideMainThreadExecutorFactory"], - ["android.support.test.espresso.base.BaseLayerModule_ProvideRemoteExecutorFactory", "androidx.test.espresso.base.BaseLayerModule_ProvideRemoteExecutorFactory"], - ["android.support.test.espresso.base.BaseLayerModule_ProvideSdkAsyncTaskMonitorFactory", "androidx.test.espresso.base.BaseLayerModule_ProvideSdkAsyncTaskMonitorFactory"], - ["android.support.test.espresso.base.BaseLayerModule_ProvideTargetContextFactory", "androidx.test.espresso.base.BaseLayerModule_ProvideTargetContextFactory"], - ["android.support.test.espresso.base.BaseLayerModule", "androidx.test.espresso.base.BaseLayerModule"], - ["android.support.test.espresso.base.CompatAsyncTask", "androidx.test.espresso.base.CompatAsyncTask"], - ["android.support.test.espresso.base.Default", "androidx.test.espresso.base.Default"], - ["android.support.test.espresso.base.DefaultFailureHandler", "androidx.test.espresso.base.DefaultFailureHandler"], - ["android.support.test.espresso.base.EventInjectionStrategy", "androidx.test.espresso.base.EventInjectionStrategy"], - ["android.support.test.espresso.base.EventInjector", "androidx.test.espresso.base.EventInjector"], - ["android.support.test.espresso.base.IdleNotifier", "androidx.test.espresso.base.IdleNotifier"], - ["android.support.test.espresso.base.IdlingResourceRegistry_Factory", "androidx.test.espresso.base.IdlingResourceRegistry_Factory"], - ["android.support.test.espresso.base.IdlingResourceRegistry", "androidx.test.espresso.base.IdlingResourceRegistry"], - ["android.support.test.espresso.base.IdlingUiController", "androidx.test.espresso.base.IdlingUiController"], - ["android.support.test.espresso.base.InputManagerEventInjectionStrategy", "androidx.test.espresso.base.InputManagerEventInjectionStrategy"], - ["android.support.test.espresso.base.Interrogator", "androidx.test.espresso.base.Interrogator"], - ["android.support.test.espresso.base.InterruptableUiController", "androidx.test.espresso.base.InterruptableUiController"], - ["android.support.test.espresso.base.LooperIdlingResourceInterrogationHandler", "androidx.test.espresso.base.LooperIdlingResourceInterrogationHandler"], - ["android.support.test.espresso.base.MainThread", "androidx.test.espresso.base.MainThread"], - ["android.support.test.espresso.base.NoopIdleNotificationCallbackIdleNotifierProvider", "androidx.test.espresso.base.NoopIdleNotificationCallbackIdleNotifierProvider"], - ["android.support.test.espresso.base.NoopRunnableIdleNotifier", "androidx.test.espresso.base.NoopRunnableIdleNotifier"], - ["android.support.test.espresso.base.RootsOracle_Factory", "androidx.test.espresso.base.RootsOracle_Factory"], - ["android.support.test.espresso.base.RootsOracle", "androidx.test.espresso.base.RootsOracle"], - ["android.support.test.espresso.base.RootViewPicker_Factory", "androidx.test.espresso.base.RootViewPicker_Factory"], - ["android.support.test.espresso.base.RootViewPicker_RootResultFetcher_Factory", "androidx.test.espresso.base.RootViewPicker_RootResultFetcher_Factory"], - ["android.support.test.espresso.base.RootViewPicker", "androidx.test.espresso.base.RootViewPicker"], - ["android.support.test.espresso.base.RootViewPickerScope", "androidx.test.espresso.base.RootViewPickerScope"], - ["android.support.test.espresso.base.SdkAsyncTask", "androidx.test.espresso.base.SdkAsyncTask"], - ["android.support.test.espresso.base.ThreadPoolExecutorExtractor_Factory", "androidx.test.espresso.base.ThreadPoolExecutorExtractor_Factory"], - ["android.support.test.espresso.base.ThreadPoolExecutorExtractor", "androidx.test.espresso.base.ThreadPoolExecutorExtractor"], - ["android.support.test.espresso.base.UiControllerImpl_Factory", "androidx.test.espresso.base.UiControllerImpl_Factory"], - ["android.support.test.espresso.base.UiControllerImpl", "androidx.test.espresso.base.UiControllerImpl"], - ["android.support.test.espresso.base.UiControllerModule", "androidx.test.espresso.base.UiControllerModule"], - ["android.support.test.espresso.base.ViewFinderImpl_Factory", "androidx.test.espresso.base.ViewFinderImpl_Factory"], - ["android.support.test.espresso.base.ViewFinderImpl", "androidx.test.espresso.base.ViewFinderImpl"], - ["android.support.test.espresso.base.WindowManagerEventInjectionStrategy", "androidx.test.espresso.base.WindowManagerEventInjectionStrategy"], - ["android.support.test.espresso.BaseLayerComponent", "androidx.test.espresso.BaseLayerComponent"], - ["android.support.test.espresso.contrib.AccessibilityChecks", "androidx.test.espresso.contrib.AccessibilityChecks"], - ["android.support.test.espresso.contrib.ActivityResultMatchers", "androidx.test.espresso.contrib.ActivityResultMatchers"], - ["android.support.test.espresso.contrib.Checks", "androidx.test.espresso.contrib.Checks"], - ["android.support.test.espresso.contrib.DrawerActions", "androidx.test.espresso.contrib.DrawerActions"], - ["android.support.test.espresso.contrib.DrawerMatchers", "androidx.test.espresso.contrib.DrawerMatchers"], - ["android.support.test.espresso.contrib.NavigationViewActions", "androidx.test.espresso.contrib.NavigationViewActions"], - ["android.support.test.espresso.contrib.PickerActions", "androidx.test.espresso.contrib.PickerActions"], - ["android.support.test.espresso.contrib.RecyclerViewActions", "androidx.test.espresso.contrib.RecyclerViewActions"], - ["android.support.test.espresso.contrib.ViewPagerActions", "androidx.test.espresso.contrib.ViewPagerActions"], - ["android.support.test.espresso.DaggerBaseLayerComponent", "androidx.test.espresso.DaggerBaseLayerComponent"], - ["android.support.test.espresso.DataInteraction", "androidx.test.espresso.DataInteraction"], - ["android.support.test.espresso.DataInteractionRemote", "androidx.test.espresso.DataInteractionRemote"], - ["android.support.test.espresso.Espresso", "androidx.test.espresso.Espresso"], - ["android.support.test.espresso.EspressoException", "androidx.test.espresso.EspressoException"], - ["android.support.test.espresso.FailureHandler", "androidx.test.espresso.FailureHandler"], - ["android.support.test.espresso.GraphHolder", "androidx.test.espresso.GraphHolder"], - ["android.support.test.espresso.idling.concurrent.IdlingScheduledThreadPoolExecutor", "androidx.test.espresso.idling.concurrent.IdlingScheduledThreadPoolExecutor"], - ["android.support.test.espresso.idling.concurrent.IdlingThreadPoolExecutor", "androidx.test.espresso.idling.concurrent.IdlingThreadPoolExecutor"], - ["android.support.test.espresso.idling.CountingIdlingResource", "androidx.test.espresso.idling.CountingIdlingResource"], - ["android.support.test.espresso.idling.net.UriIdlingResource", "androidx.test.espresso.idling.net.UriIdlingResource"], - ["android.support.test.espresso.IdlingPolicies", "androidx.test.espresso.IdlingPolicies"], - ["android.support.test.espresso.IdlingPolicy", "androidx.test.espresso.IdlingPolicy"], - ["android.support.test.espresso.IdlingRegistry", "androidx.test.espresso.IdlingRegistry"], - ["android.support.test.espresso.IdlingResource", "androidx.test.espresso.IdlingResource"], - ["android.support.test.espresso.IdlingResourceTimeoutException", "androidx.test.espresso.IdlingResourceTimeoutException"], - ["android.support.test.espresso.InjectEventSecurityException", "androidx.test.espresso.InjectEventSecurityException"], - ["android.support.test.espresso.intent.ActivityResultFunction", "androidx.test.espresso.intent.ActivityResultFunction"], - ["android.support.test.espresso.intent.Checks", "androidx.test.espresso.intent.Checks"], - ["android.support.test.espresso.intent.Intents", "androidx.test.espresso.intent.Intents"], - ["android.support.test.espresso.intent.matcher.BundleMatchers", "androidx.test.espresso.intent.matcher.BundleMatchers"], - ["android.support.test.espresso.intent.matcher.ComponentNameMatchers", "androidx.test.espresso.intent.matcher.ComponentNameMatchers"], - ["android.support.test.espresso.intent.matcher.IntentMatchers", "androidx.test.espresso.intent.matcher.IntentMatchers"], - ["android.support.test.espresso.intent.matcher.UriMatchers", "androidx.test.espresso.intent.matcher.UriMatchers"], - ["android.support.test.espresso.intent.OngoingStubbing", "androidx.test.espresso.intent.OngoingStubbing"], - ["android.support.test.espresso.intent.ResettingStubber", "androidx.test.espresso.intent.ResettingStubber"], - ["android.support.test.espresso.intent.ResettingStubberImpl", "androidx.test.espresso.intent.ResettingStubberImpl"], - ["android.support.test.espresso.intent.ResolvedIntent", "androidx.test.espresso.intent.ResolvedIntent"], - ["android.support.test.espresso.intent.ResolvedIntentImpl", "androidx.test.espresso.intent.ResolvedIntentImpl"], - ["android.support.test.espresso.intent.rule.IntentsTestRule", "androidx.test.espresso.intent.rule.IntentsTestRule"], - ["android.support.test.espresso.intent.VerifiableIntent", "androidx.test.espresso.intent.VerifiableIntent"], - ["android.support.test.espresso.intent.VerifiableIntentImpl", "androidx.test.espresso.intent.VerifiableIntentImpl"], - ["android.support.test.espresso.intent.VerificationMode", "androidx.test.espresso.intent.VerificationMode"], - ["android.support.test.espresso.intent.VerificationModes", "androidx.test.espresso.intent.VerificationModes"], - ["android.support.test.espresso.InteractionResultsHandler", "androidx.test.espresso.InteractionResultsHandler"], - ["android.support.test.espresso.matcher.BoundedMatcher", "androidx.test.espresso.matcher.BoundedMatcher"], - ["android.support.test.espresso.matcher.CursorMatchers", "androidx.test.espresso.matcher.CursorMatchers"], - ["android.support.test.espresso.matcher.HasBackgroundMatcher", "androidx.test.espresso.matcher.HasBackgroundMatcher"], - ["android.support.test.espresso.matcher.LayoutMatchers", "androidx.test.espresso.matcher.LayoutMatchers"], - ["android.support.test.espresso.matcher.PreferenceMatchers", "androidx.test.espresso.matcher.PreferenceMatchers"], - ["android.support.test.espresso.matcher.RemoteHamcrestCoreMatchers13", "androidx.test.espresso.matcher.RemoteHamcrestCoreMatchers13"], - ["android.support.test.espresso.matcher.RemoteRootMatchers", "androidx.test.espresso.matcher.RemoteRootMatchers"], - ["android.support.test.espresso.matcher.RemoteViewMatchers", "androidx.test.espresso.matcher.RemoteViewMatchers"], - ["android.support.test.espresso.matcher.RootMatchers", "androidx.test.espresso.matcher.RootMatchers"], - ["android.support.test.espresso.matcher.ViewMatchers", "androidx.test.espresso.matcher.ViewMatchers"], - ["android.support.test.espresso.NoActivityResumedException", "androidx.test.espresso.NoActivityResumedException"], - ["android.support.test.espresso.NoMatchingRootException", "androidx.test.espresso.NoMatchingRootException"], - ["android.support.test.espresso.NoMatchingViewException", "androidx.test.espresso.NoMatchingViewException"], - ["android.support.test.espresso.PerformException", "androidx.test.espresso.PerformException"], - ["android.support.test.espresso.proto.action.ViewActions", "androidx.test.espresso.proto.action.ViewActions"], - ["android.support.test.espresso.proto.assertion.ViewAssertions", "androidx.test.espresso.proto.assertion.ViewAssertions"], - ["android.support.test.espresso.proto.matcher.RootMatchers", "androidx.test.espresso.proto.matcher.RootMatchers"], - ["android.support.test.espresso.proto.matcher.ViewMatchers", "androidx.test.espresso.proto.matcher.ViewMatchers"], - ["android.support.test.espresso.proto.matcher13.HamcrestMatchersv13", "androidx.test.espresso.proto.matcher13.HamcrestMatchersv13"], - ["android.support.test.espresso.proto.UiInteraction", "androidx.test.espresso.proto.UiInteraction"], - ["android.support.test.espresso.remote.annotation.RemoteMsgConstructor", "androidx.test.espresso.remote.annotation.RemoteMsgConstructor"], - ["android.support.test.espresso.remote.annotation.RemoteMsgField", "androidx.test.espresso.remote.annotation.RemoteMsgField"], - ["android.support.test.espresso.remote.AnyToTypeConverter", "androidx.test.espresso.remote.AnyToTypeConverter"], - ["android.support.test.espresso.remote.Bindable", "androidx.test.espresso.remote.Bindable"], - ["android.support.test.espresso.remote.BuilderReflector", "androidx.test.espresso.remote.BuilderReflector"], - ["android.support.test.espresso.remote.ByteStringToParcelableConverter", "androidx.test.espresso.remote.ByteStringToParcelableConverter"], - ["android.support.test.espresso.remote.ByteStringToTypeConverter", "androidx.test.espresso.remote.ByteStringToTypeConverter"], - ["android.support.test.espresso.remote.ConstructorInvocation", "androidx.test.espresso.remote.ConstructorInvocation"], - ["android.support.test.espresso.remote.Converter", "androidx.test.espresso.remote.Converter"], - ["android.support.test.espresso.remote.EspressoRemote", "androidx.test.espresso.remote.EspressoRemote"], - ["android.support.test.espresso.remote.EspressoRemoteMessage", "androidx.test.espresso.remote.EspressoRemoteMessage"], - ["android.support.test.espresso.remote.FieldDescriptor", "androidx.test.espresso.remote.FieldDescriptor"], - ["android.support.test.espresso.remote.GenericRemoteMessage", "androidx.test.espresso.remote.GenericRemoteMessage"], - ["android.support.test.espresso.remote.IInteractionExecutionStatus", "androidx.test.espresso.remote.IInteractionExecutionStatus"], - ["android.support.test.espresso.remote.InteractionRequest", "androidx.test.espresso.remote.InteractionRequest"], - ["android.support.test.espresso.remote.InteractionResponse", "androidx.test.espresso.remote.InteractionResponse"], - ["android.support.test.espresso.remote.MethodInvocation", "androidx.test.espresso.remote.MethodInvocation"], - ["android.support.test.espresso.remote.NoopRemoteInteraction", "androidx.test.espresso.remote.NoopRemoteInteraction"], - ["android.support.test.espresso.remote.NoRemoteEspressoInstanceException", "androidx.test.espresso.remote.NoRemoteEspressoInstanceException"], - ["android.support.test.espresso.remote.ParcelableToByteStringConverter", "androidx.test.espresso.remote.ParcelableToByteStringConverter"], - ["android.support.test.espresso.remote.ProtoReflector", "androidx.test.espresso.remote.ProtoReflector"], - ["android.support.test.espresso.remote.ProtoUtils", "androidx.test.espresso.remote.ProtoUtils"], - ["android.support.test.espresso.remote.RemoteDescriptor", "androidx.test.espresso.remote.RemoteDescriptor"], - ["android.support.test.espresso.remote.RemoteDescriptorRegistry", "androidx.test.espresso.remote.RemoteDescriptorRegistry"], - ["android.support.test.espresso.remote.RemoteEspressoException", "androidx.test.espresso.remote.RemoteEspressoException"], - ["android.support.test.espresso.remote.RemoteInteraction", "androidx.test.espresso.remote.RemoteInteraction"], - ["android.support.test.espresso.remote.RemoteInteractionRegistry", "androidx.test.espresso.remote.RemoteInteractionRegistry"], - ["android.support.test.espresso.remote.RemoteMessageDeserializer", "androidx.test.espresso.remote.RemoteMessageDeserializer"], - ["android.support.test.espresso.remote.RemoteMessageSerializer", "androidx.test.espresso.remote.RemoteMessageSerializer"], - ["android.support.test.espresso.remote.RemoteProtocolException", "androidx.test.espresso.remote.RemoteProtocolException"], - ["android.support.test.espresso.remote.TypeProtoConverters", "androidx.test.espresso.remote.TypeProtoConverters"], - ["android.support.test.espresso.remote.TypeToAnyConverter", "androidx.test.espresso.remote.TypeToAnyConverter"], - ["android.support.test.espresso.remote.TypeToByteStringConverter", "androidx.test.espresso.remote.TypeToByteStringConverter"], - ["android.support.test.espresso.Root", "androidx.test.espresso.Root"], - ["android.support.test.espresso.UiController", "androidx.test.espresso.UiController"], - ["android.support.test.espresso.util.ActivityLifecycles", "androidx.test.espresso.util.ActivityLifecycles"], - ["android.support.test.espresso.util.EspressoOptional", "androidx.test.espresso.util.EspressoOptional"], - ["android.support.test.espresso.util.HumanReadables", "androidx.test.espresso.util.HumanReadables"], - ["android.support.test.espresso.util.TreeIterables", "androidx.test.espresso.util.TreeIterables"], - ["android.support.test.espresso.ViewAction", "androidx.test.espresso.ViewAction"], - ["android.support.test.espresso.ViewAssertion", "androidx.test.espresso.ViewAssertion"], - ["android.support.test.espresso.ViewFinder", "androidx.test.espresso.ViewFinder"], - ["android.support.test.espresso.ViewInteraction_Factory", "androidx.test.espresso.ViewInteraction_Factory"], - ["android.support.test.espresso.ViewInteraction", "androidx.test.espresso.ViewInteraction"], - ["android.support.test.espresso.ViewInteractionComponent", "androidx.test.espresso.ViewInteractionComponent"], - ["android.support.test.espresso.ViewInteractionModule_ProvideNeedsActivityFactory", "androidx.test.espresso.ViewInteractionModule_ProvideNeedsActivityFactory"], - ["android.support.test.espresso.ViewInteractionModule_ProvideRemoteInteractionFactory", "androidx.test.espresso.ViewInteractionModule_ProvideRemoteInteractionFactory"], - ["android.support.test.espresso.ViewInteractionModule_ProvideRootMatcherFactory", "androidx.test.espresso.ViewInteractionModule_ProvideRootMatcherFactory"], - ["android.support.test.espresso.ViewInteractionModule_ProvideRootViewFactory", "androidx.test.espresso.ViewInteractionModule_ProvideRootViewFactory"], - ["android.support.test.espresso.ViewInteractionModule_ProvideViewFinderFactory", "androidx.test.espresso.ViewInteractionModule_ProvideViewFinderFactory"], - ["android.support.test.espresso.ViewInteractionModule_ProvideViewMatcherFactory", "androidx.test.espresso.ViewInteractionModule_ProvideViewMatcherFactory"], - ["android.support.test.espresso.ViewInteractionModule", "androidx.test.espresso.ViewInteractionModule"], - ["android.support.test.espresso.web.action.AtomAction", "androidx.test.espresso.web.action.AtomAction"], - ["android.support.test.espresso.web.action.AtomActionRemoteMessage", "androidx.test.espresso.web.action.AtomActionRemoteMessage"], - ["android.support.test.espresso.web.action.EnableJavascriptAction", "androidx.test.espresso.web.action.EnableJavascriptAction"], - ["android.support.test.espresso.web.action.EvaluationAtom", "androidx.test.espresso.web.action.EvaluationAtom"], - ["android.support.test.espresso.web.action.IAtomActionResultPropagator", "androidx.test.espresso.web.action.IAtomActionResultPropagator"], - ["android.support.test.espresso.web.action.JavascriptEvaluation", "androidx.test.espresso.web.action.JavascriptEvaluation"], - ["android.support.test.espresso.web.action.RemoteWebActions", "androidx.test.espresso.web.action.RemoteWebActions"], - ["android.support.test.espresso.web.assertion.ByteStringToDocumentConverter", "androidx.test.espresso.web.assertion.ByteStringToDocumentConverter"], - ["android.support.test.espresso.web.assertion.CheckResultWebAssertionRemoteMessage", "androidx.test.espresso.web.assertion.CheckResultWebAssertionRemoteMessage"], - ["android.support.test.espresso.web.assertion.CompressorDecompressor", "androidx.test.espresso.web.assertion.CompressorDecompressor"], - ["android.support.test.espresso.web.assertion.DocumentProtoConverters", "androidx.test.espresso.web.assertion.DocumentProtoConverters"], - ["android.support.test.espresso.web.assertion.DocumentToByteStringConverter", "androidx.test.espresso.web.assertion.DocumentToByteStringConverter"], - ["android.support.test.espresso.web.assertion.RemoteWebViewAssertions", "androidx.test.espresso.web.assertion.RemoteWebViewAssertions"], - ["android.support.test.espresso.web.assertion.TagSoupDocumentParser", "androidx.test.espresso.web.assertion.TagSoupDocumentParser"], - ["android.support.test.espresso.web.assertion.WebAssertion", "androidx.test.espresso.web.assertion.WebAssertion"], - ["android.support.test.espresso.web.assertion.WebViewAssertions", "androidx.test.espresso.web.assertion.WebViewAssertions"], - ["android.support.test.espresso.web.matcher.AmbiguousElementMatcherException", "androidx.test.espresso.web.matcher.AmbiguousElementMatcherException"], - ["android.support.test.espresso.web.matcher.DomMatchers", "androidx.test.espresso.web.matcher.DomMatchers"], - ["android.support.test.espresso.web.matcher.RemoteWebMatchers", "androidx.test.espresso.web.matcher.RemoteWebMatchers"], - ["android.support.test.espresso.web.model.Atom", "androidx.test.espresso.web.model.Atom"], - ["android.support.test.espresso.web.model.Atoms", "androidx.test.espresso.web.model.Atoms"], - ["android.support.test.espresso.web.model.ElementReference", "androidx.test.espresso.web.model.ElementReference"], - ["android.support.test.espresso.web.model.Evaluation", "androidx.test.espresso.web.model.Evaluation"], - ["android.support.test.espresso.web.model.JSONAble", "androidx.test.espresso.web.model.JSONAble"], - ["android.support.test.espresso.web.model.ModelCodec", "androidx.test.espresso.web.model.ModelCodec"], - ["android.support.test.espresso.web.model.RemoteWebModelAtoms", "androidx.test.espresso.web.model.RemoteWebModelAtoms"], - ["android.support.test.espresso.web.model.ScriptWithArgsSimpleAtomRemoteMessage", "androidx.test.espresso.web.model.ScriptWithArgsSimpleAtomRemoteMessage"], - ["android.support.test.espresso.web.model.SimpleAtom", "androidx.test.espresso.web.model.SimpleAtom"], - ["android.support.test.espresso.web.model.TransformingAtom", "androidx.test.espresso.web.model.TransformingAtom"], - ["android.support.test.espresso.web.model.WindowReference", "androidx.test.espresso.web.model.WindowReference"], - ["android.support.test.espresso.web.proto.action.WebActions", "androidx.test.espresso.web.proto.action.WebActions"], - ["android.support.test.espresso.web.proto.assertion.WebAssertions", "androidx.test.espresso.web.proto.assertion.WebAssertions"], - ["android.support.test.espresso.web.proto.matcher.RemoteWebMatchers", "androidx.test.espresso.web.proto.matcher.RemoteWebMatchers"], - ["android.support.test.espresso.web.proto.model.WebModelAtoms", "androidx.test.espresso.web.proto.model.WebModelAtoms"], - ["android.support.test.espresso.web.proto.sugar.WebSugar", "androidx.test.espresso.web.proto.sugar.WebSugar"], - ["android.support.test.espresso.web.proto.webdriver.WebWebdriverAtoms", "androidx.test.espresso.web.proto.webdriver.WebWebdriverAtoms"], - ["android.support.test.espresso.web.sugar.RemoteWebSugar", "androidx.test.espresso.web.sugar.RemoteWebSugar"], - ["android.support.test.espresso.web.sugar.Web", "androidx.test.espresso.web.sugar.Web"], - ["android.support.test.espresso.web.webdriver.DriverAtoms", "androidx.test.espresso.web.webdriver.DriverAtoms"], - ["android.support.test.espresso.web.webdriver.Locator", "androidx.test.espresso.web.webdriver.Locator"], - ["android.support.test.espresso.web.webdriver.RemoteWebDriverAtoms", "androidx.test.espresso.web.webdriver.RemoteWebDriverAtoms"], - ["android.support.test.espresso.web.webdriver.WebDriverAtomScripts", "androidx.test.espresso.web.webdriver.WebDriverAtomScripts"], - ["android.support.test.filters.FlakyTest", "androidx.test.filters.FlakyTest"], - ["android.support.test.filters.LargeTest", "androidx.test.filters.LargeTest"], - ["android.support.test.filters.MediumTest", "androidx.test.filters.MediumTest"], - ["android.support.test.filters.RequiresDevice", "androidx.test.filters.RequiresDevice"], - ["android.support.test.filters.SdkSuppress", "androidx.test.filters.SdkSuppress"], - ["android.support.test.filters.SmallTest", "androidx.test.filters.SmallTest"], - ["android.support.test.filters.Suppress", "androidx.test.filters.Suppress"], - ["android.support.test.InstrumentationRegistry", "androidx.test.InstrumentationRegistry"], - ["android.support.test.jank.GfxMonitor", "androidx.test.jank.GfxMonitor"], - ["android.support.test.jank.JankTest", "androidx.test.jank.JankTest"], - ["android.support.test.jank.JankTestBase", "androidx.test.jank.JankTestBase"], - ["android.support.test.jank.WindowAnimationFrameStatsMonitor", "androidx.test.jank.WindowAnimationFrameStatsMonitor"], - ["android.support.test.jank.WindowContentFrameStatsMonitor", "androidx.test.jank.WindowContentFrameStatsMonitor"], - ["android.support.test.orchestrator.callback.OrchestratorCallback", "androidx.test.orchestrator.callback.OrchestratorCallback"], - ["android.support.test.orchestrator.instrumentationlistener.OrchestratedInstrumentationListener", "androidx.test.orchestrator.instrumentationlistener.OrchestratedInstrumentationListener"], - ["android.support.test.orchestrator.junit.BundleJUnitUtils", "androidx.test.orchestrator.junit.BundleJUnitUtils"], - ["android.support.test.orchestrator.junit.ParcelableDescription", "androidx.test.orchestrator.junit.ParcelableDescription"], - ["android.support.test.orchestrator.junit.ParcelableFailure", "androidx.test.orchestrator.junit.ParcelableFailure"], - ["android.support.test.orchestrator.junit.ParcelableResult", "androidx.test.orchestrator.junit.ParcelableResult"], - ["android.support.test.orchestrator.listeners.OrchestrationListenerManager", "androidx.test.orchestrator.listeners.OrchestrationListenerManager"], - ["android.support.test.orchestrator.listeners.OrchestrationRunListener", "androidx.test.orchestrator.listeners.OrchestrationRunListener"], - ["android.support.test.orchestrator.listeners.result.ITestRunListener", "androidx.test.orchestrator.listeners.result.ITestRunListener"], - ["android.support.test.orchestrator.listeners.result.TestIdentifier", "androidx.test.orchestrator.listeners.result.TestIdentifier"], - ["android.support.test.orchestrator.listeners.result.TestResult", "androidx.test.orchestrator.listeners.result.TestResult"], - ["android.support.test.orchestrator.listeners.result.TestRunResult", "androidx.test.orchestrator.listeners.result.TestRunResult"], - ["android.support.test.rule.ActivityTestRule", "androidx.test.rule.ActivityTestRule"], - ["android.support.test.rule.DisableOnAndroidDebug", "androidx.test.rule.DisableOnAndroidDebug"], - ["android.support.test.rule.GrantPermissionRule", "androidx.test.rule.GrantPermissionRule"], - ["android.support.test.rule.logging.AtraceLogger", "androidx.test.rule.logging.AtraceLogger"], - ["android.support.test.rule.PortForwardingRule", "androidx.test.rule.PortForwardingRule"], - ["android.support.test.rule.provider.DatabaseArgs", "androidx.test.rule.provider.DatabaseArgs"], - ["android.support.test.rule.provider.DelegatingContext", "androidx.test.rule.provider.DelegatingContext"], - ["android.support.test.rule.provider.ProviderArgs", "androidx.test.rule.provider.ProviderArgs"], - ["android.support.test.rule.provider.ProviderTestRule", "androidx.test.rule.provider.ProviderTestRule"], - ["android.support.test.rule.ServiceTestRule", "androidx.test.rule.ServiceTestRule"], - ["android.support.test.rule.UiThreadTestRule", "androidx.test.rule.UiThreadTestRule"], - ["android.support.test.runner.AndroidJUnit4", "androidx.test.runner.AndroidJUnit4"], - ["android.support.test.runner.AndroidJUnitRunner", "androidx.test.runner.AndroidJUnitRunner"], - ["android.support.test.runner.intent.IntentCallback", "androidx.test.runner.intent.IntentCallback"], - ["android.support.test.runner.intent.IntentMonitor", "androidx.test.runner.intent.IntentMonitor"], - ["android.support.test.runner.intent.IntentMonitorRegistry", "androidx.test.runner.intent.IntentMonitorRegistry"], - ["android.support.test.runner.intent.IntentStubber", "androidx.test.runner.intent.IntentStubber"], - ["android.support.test.runner.intent.IntentStubberRegistry", "androidx.test.runner.intent.IntentStubberRegistry"], - ["android.support.test.runner.intercepting.InterceptingActivityFactory", "androidx.test.runner.intercepting.InterceptingActivityFactory"], - ["android.support.test.runner.intercepting.SingleActivityFactory", "androidx.test.runner.intercepting.SingleActivityFactory"], - ["android.support.test.runner.lifecycle.ActivityLifecycleCallback", "androidx.test.runner.lifecycle.ActivityLifecycleCallback"], - ["android.support.test.runner.lifecycle.ActivityLifecycleMonitor", "androidx.test.runner.lifecycle.ActivityLifecycleMonitor"], - ["android.support.test.runner.lifecycle.ActivityLifecycleMonitorRegistry", "androidx.test.runner.lifecycle.ActivityLifecycleMonitorRegistry"], - ["android.support.test.runner.lifecycle.ApplicationLifecycleCallback", "androidx.test.runner.lifecycle.ApplicationLifecycleCallback"], - ["android.support.test.runner.lifecycle.ApplicationLifecycleMonitor", "androidx.test.runner.lifecycle.ApplicationLifecycleMonitor"], - ["android.support.test.runner.lifecycle.ApplicationLifecycleMonitorRegistry", "androidx.test.runner.lifecycle.ApplicationLifecycleMonitorRegistry"], - ["android.support.test.runner.lifecycle.ApplicationStage", "androidx.test.runner.lifecycle.ApplicationStage"], - ["android.support.test.runner.lifecycle.Stage", "androidx.test.runner.lifecycle.Stage"], - ["android.support.test.runner.MonitoringInstrumentation", "androidx.test.runner.MonitoringInstrumentation"], - ["android.support.test.runner.permission.GrantPermissionCallable", "androidx.test.runner.permission.GrantPermissionCallable"], - ["android.support.test.runner.permission.PermissionRequester", "androidx.test.runner.permission.PermissionRequester"], - ["android.support.test.runner.permission.RequestPermissionCallable", "androidx.test.runner.permission.RequestPermissionCallable"], - ["android.support.test.runner.permission.ShellCommand", "androidx.test.runner.permission.ShellCommand"], - ["android.support.test.runner.permission.UiAutomationShellCommand", "androidx.test.runner.permission.UiAutomationShellCommand"], - ["android.support.test.runner.screenshot.BasicScreenCaptureProcessor", "androidx.test.runner.screenshot.BasicScreenCaptureProcessor"], - ["android.support.test.runner.screenshot.ScreenCapture", "androidx.test.runner.screenshot.ScreenCapture"], - ["android.support.test.runner.screenshot.ScreenCaptureProcessor", "androidx.test.runner.screenshot.ScreenCaptureProcessor"], - ["android.support.test.runner.screenshot.Screenshot", "androidx.test.runner.screenshot.Screenshot"], - ["android.support.test.runner.screenshot.TakeScreenshotCallable", "androidx.test.runner.screenshot.TakeScreenshotCallable"], - ["android.support.test.runner.screenshot.UiAutomationWrapper", "androidx.test.runner.screenshot.UiAutomationWrapper"], - ["android.support.test.runner.UsageTrackerFacilitator", "androidx.test.runner.UsageTrackerFacilitator"], - ["android.support.test.uiautomator.AccessibilityNodeInfoDumper", "androidx.test.uiautomator.AccessibilityNodeInfoDumper"], - ["android.support.test.uiautomator.AccessibilityNodeInfoHelper", "androidx.test.uiautomator.AccessibilityNodeInfoHelper"], - ["android.support.test.uiautomator.By", "androidx.test.uiautomator.By"], - ["android.support.test.uiautomator.ByMatcher", "androidx.test.uiautomator.ByMatcher"], - ["android.support.test.uiautomator.BySelector", "androidx.test.uiautomator.BySelector"], - ["android.support.test.uiautomator.Condition", "androidx.test.uiautomator.Condition"], - ["android.support.test.uiautomator.Configurator", "androidx.test.uiautomator.Configurator"], - ["android.support.test.uiautomator.Direction", "androidx.test.uiautomator.Direction"], - ["android.support.test.uiautomator.EventCondition", "androidx.test.uiautomator.EventCondition"], - ["android.support.test.uiautomator.GestureController", "androidx.test.uiautomator.GestureController"], - ["android.support.test.uiautomator.Gestures", "androidx.test.uiautomator.Gestures"], - ["android.support.test.uiautomator.IAutomationSupport", "androidx.test.uiautomator.IAutomationSupport"], - ["android.support.test.uiautomator.InstrumentationAutomationSupport", "androidx.test.uiautomator.InstrumentationAutomationSupport"], - ["android.support.test.uiautomator.InteractionController", "androidx.test.uiautomator.InteractionController"], - ["android.support.test.uiautomator.PointerGesture", "androidx.test.uiautomator.PointerGesture"], - ["android.support.test.uiautomator.QueryController", "androidx.test.uiautomator.QueryController"], - ["android.support.test.uiautomator.Searchable", "androidx.test.uiautomator.Searchable"], - ["android.support.test.uiautomator.SearchCondition", "androidx.test.uiautomator.SearchCondition"], - ["android.support.test.uiautomator.StaleObjectException", "androidx.test.uiautomator.StaleObjectException"], - ["android.support.test.uiautomator.Tracer", "androidx.test.uiautomator.Tracer"], - ["android.support.test.uiautomator.UiAutomatorInstrumentationTestRunner", "androidx.test.uiautomator.UiAutomatorInstrumentationTestRunner"], - ["android.support.test.uiautomator.UiAutomatorTestCase", "androidx.test.uiautomator.UiAutomatorTestCase"], - ["android.support.test.uiautomator.UiCollection", "androidx.test.uiautomator.UiCollection"], - ["android.support.test.uiautomator.UiDevice", "androidx.test.uiautomator.UiDevice"], - ["android.support.test.uiautomator.UiObject2", "androidx.test.uiautomator.UiObject2"], - ["android.support.test.uiautomator.UiObject2Condition", "androidx.test.uiautomator.UiObject2Condition"], - ["android.support.test.uiautomator.UiObject", "androidx.test.uiautomator.UiObject"], - ["android.support.test.uiautomator.UiObjectNotFoundException", "androidx.test.uiautomator.UiObjectNotFoundException"], - ["android.support.test.uiautomator.UiScrollable", "androidx.test.uiautomator.UiScrollable"], - ["android.support.test.uiautomator.UiSelector", "androidx.test.uiautomator.UiSelector"], - ["android.support.test.uiautomator.UiWatcher", "androidx.test.uiautomator.UiWatcher"], - ["android.support.test.uiautomator.Until", "androidx.test.uiautomator.Until"], - ["android.support.test.uiautomator.WaitMixin", "androidx.test.uiautomator.WaitMixin"], - ["android.support.text.emoji.bundled.BundledEmojiCompatConfig", "androidx.emoji.bundled.BundledEmojiCompatConfig"], - ["android.support.text.emoji.EmojiCompat", "androidx.emoji.text.EmojiCompat"], - ["android.support.text.emoji.EmojiMetadata", "androidx.emoji.text.EmojiMetadata"], - ["android.support.text.emoji.EmojiProcessor", "androidx.emoji.text.EmojiProcessor"], - ["android.support.text.emoji.EmojiSpan", "androidx.emoji.text.EmojiSpan"], - ["android.support.text.emoji.FontRequestEmojiCompatConfig", "androidx.emoji.text.FontRequestEmojiCompatConfig"], - ["android.support.text.emoji.MetadataListReader", "androidx.emoji.text.MetadataListReader"], - ["android.support.text.emoji.MetadataRepo", "androidx.emoji.text.MetadataRepo"], - ["android.support.text.emoji.R", "androidx.emoji.R"], - ["android.support.text.emoji.TypefaceEmojiSpan", "androidx.emoji.text.TypefaceEmojiSpan"], - ["android.support.text.emoji.widget.EditTextAttributeHelper", "androidx.emoji.widget.EditTextAttributeHelper"], - ["android.support.text.emoji.widget.EmojiAppCompatButton", "androidx.emoji.widget.EmojiAppCompatButton"], - ["android.support.text.emoji.widget.EmojiAppCompatEditText", "androidx.emoji.widget.EmojiAppCompatEditText"], - ["android.support.text.emoji.widget.EmojiAppCompatTextView", "androidx.emoji.widget.EmojiAppCompatTextView"], - ["android.support.text.emoji.widget.EmojiButton", "androidx.emoji.widget.EmojiButton"], - ["android.support.text.emoji.widget.EmojiEditableFactory", "androidx.emoji.widget.EmojiEditableFactory"], - ["android.support.text.emoji.widget.EmojiEditText", "androidx.emoji.widget.EmojiEditText"], - ["android.support.text.emoji.widget.EmojiEditTextHelper", "androidx.emoji.widget.EmojiEditTextHelper"], - ["android.support.text.emoji.widget.EmojiExtractEditText", "androidx.emoji.widget.EmojiExtractEditText"], - ["android.support.text.emoji.widget.EmojiExtractTextLayout", "androidx.emoji.widget.EmojiExtractTextLayout"], - ["android.support.text.emoji.widget.EmojiInputConnection", "androidx.emoji.widget.EmojiInputConnection"], - ["android.support.text.emoji.widget.EmojiInputFilter", "androidx.emoji.widget.EmojiInputFilter"], - ["android.support.text.emoji.widget.EmojiKeyListener", "androidx.emoji.widget.EmojiKeyListener"], - ["android.support.text.emoji.widget.EmojiTextView", "androidx.emoji.widget.EmojiTextView"], - ["android.support.text.emoji.widget.EmojiTextViewHelper", "androidx.emoji.widget.EmojiTextViewHelper"], - ["android.support.text.emoji.widget.EmojiTextWatcher", "androidx.emoji.widget.EmojiTextWatcher"], - ["android.support.text.emoji.widget.EmojiTransformationMethod", "androidx.emoji.widget.EmojiTransformationMethod"], - ["android.support.text.emoji.widget.ExtractButtonCompat", "androidx.emoji.widget.ExtractButtonCompat"], - ["android.support.text.emoji.widget.SpannableBuilder", "androidx.emoji.widget.SpannableBuilder"], - ["android.support.transition.AnimatorUtils", "androidx.transition.AnimatorUtils"], - ["android.support.transition.ArcMotion", "androidx.transition.ArcMotion"], - ["android.support.transition.AutoTransition", "androidx.transition.AutoTransition"], - ["android.support.transition.ChangeBounds", "androidx.transition.ChangeBounds"], - ["android.support.transition.ChangeClipBounds", "androidx.transition.ChangeClipBounds"], - ["android.support.transition.ChangeImageTransform", "androidx.transition.ChangeImageTransform"], - ["android.support.transition.ChangeScroll", "androidx.transition.ChangeScroll"], - ["android.support.transition.ChangeTransform", "androidx.transition.ChangeTransform"], - ["android.support.transition.CircularPropagation", "androidx.transition.CircularPropagation"], - ["android.support.transition.Explode", "androidx.transition.Explode"], - ["android.support.transition.Fade", "androidx.transition.Fade"], - ["android.support.transition.FloatArrayEvaluator", "androidx.transition.FloatArrayEvaluator"], - ["android.support.transition.FragmentTransitionSupport", "androidx.transition.FragmentTransitionSupport"], - ["android.support.transition.GhostViewApi14", "androidx.transition.GhostViewApi14"], - ["android.support.transition.GhostViewApi21", "androidx.transition.GhostViewApi21"], - ["android.support.transition.GhostViewImpl", "androidx.transition.GhostViewImpl"], - ["android.support.transition.GhostViewUtils", "androidx.transition.GhostViewUtils"], - ["android.support.transition.ImageViewUtils", "androidx.transition.ImageViewUtils"], - ["android.support.transition.MatrixUtils", "androidx.transition.MatrixUtils"], - ["android.support.transition.ObjectAnimatorUtils", "androidx.transition.ObjectAnimatorUtils"], - ["android.support.transition.PathMotion", "androidx.transition.PathMotion"], - ["android.support.transition.PathProperty", "androidx.transition.PathProperty"], - ["android.support.transition.PatternPathMotion", "androidx.transition.PatternPathMotion"], - ["android.support.transition.PropertyValuesHolderUtils", "androidx.transition.PropertyValuesHolderUtils"], - ["android.support.transition.R", "androidx.transition.R"], - ["android.support.transition.RectEvaluator", "androidx.transition.RectEvaluator"], - ["android.support.transition.Scene", "androidx.transition.Scene"], - ["android.support.transition.SidePropagation", "androidx.transition.SidePropagation"], - ["android.support.transition.Slide", "androidx.transition.Slide"], - ["android.support.transition.Styleable", "androidx.transition.Styleable"], - ["android.support.transition.Transition", "androidx.transition.Transition"], - ["android.support.transition.TransitionInflater", "androidx.transition.TransitionInflater"], - ["android.support.transition.TransitionListenerAdapter", "androidx.transition.TransitionListenerAdapter"], - ["android.support.transition.TransitionManager", "androidx.transition.TransitionManager"], - ["android.support.transition.TransitionPropagation", "androidx.transition.TransitionPropagation"], - ["android.support.transition.TransitionSet", "androidx.transition.TransitionSet"], - ["android.support.transition.TransitionUtils", "androidx.transition.TransitionUtils"], - ["android.support.transition.TransitionValues", "androidx.transition.TransitionValues"], - ["android.support.transition.TransitionValuesMaps", "androidx.transition.TransitionValuesMaps"], - ["android.support.transition.TranslationAnimationCreator", "androidx.transition.TranslationAnimationCreator"], - ["android.support.transition.ViewGroupOverlayApi14", "androidx.transition.ViewGroupOverlayApi14"], - ["android.support.transition.ViewGroupOverlayApi18", "androidx.transition.ViewGroupOverlayApi18"], - ["android.support.transition.ViewGroupOverlayImpl", "androidx.transition.ViewGroupOverlayImpl"], - ["android.support.transition.ViewGroupUtils", "androidx.transition.ViewGroupUtils"], - ["android.support.transition.ViewGroupUtilsApi14", "androidx.transition.ViewGroupUtilsApi14"], - ["android.support.transition.ViewGroupUtilsApi18", "androidx.transition.ViewGroupUtilsApi18"], - ["android.support.transition.ViewOverlayApi14", "androidx.transition.ViewOverlayApi14"], - ["android.support.transition.ViewOverlayApi18", "androidx.transition.ViewOverlayApi18"], - ["android.support.transition.ViewOverlayImpl", "androidx.transition.ViewOverlayImpl"], - ["android.support.transition.ViewUtils", "androidx.transition.ViewUtils"], - ["android.support.transition.ViewUtilsApi19", "androidx.transition.ViewUtilsApi19"], - ["android.support.transition.ViewUtilsApi21", "androidx.transition.ViewUtilsApi21"], - ["android.support.transition.ViewUtilsApi22", "androidx.transition.ViewUtilsApi22"], - ["android.support.transition.ViewUtilsBase", "androidx.transition.ViewUtilsBase"], - ["android.support.transition.Visibility", "androidx.transition.Visibility"], - ["android.support.transition.VisibilityPropagation", "androidx.transition.VisibilityPropagation"], - ["android.support.transition.WindowIdApi14", "androidx.transition.WindowIdApi14"], - ["android.support.transition.WindowIdApi18", "androidx.transition.WindowIdApi18"], - ["android.support.transition.WindowIdImpl", "androidx.transition.WindowIdImpl"], - ["android.support.v13.app.ActivityCompat", "androidx.legacy.app.ActivityCompat"], - ["android.support.v13.app.FragmentCompat", "androidx.legacy.app.FragmentCompat"], - ["android.support.v13.app.FragmentPagerAdapter", "androidx.legacy.app.FragmentPagerAdapter"], - ["android.support.v13.app.FragmentStatePagerAdapter", "androidx.legacy.app.FragmentStatePagerAdapter"], - ["android.support.v13.app.FragmentTabHost", "androidx.legacy.app.FragmentTabHost"], - ["android.support.v13.view.DragAndDropPermissionsCompat", "androidx.core.view.DragAndDropPermissionsCompat"], - ["android.support.v13.view.DragStartHelper", "androidx.core.view.DragStartHelper"], - ["android.support.v13.view.inputmethod.EditorInfoCompat", "androidx.core.view.inputmethod.EditorInfoCompat"], - ["android.support.v13.view.inputmethod.InputConnectionCompat", "androidx.core.view.inputmethod.InputConnectionCompat"], - ["android.support.v13.view.inputmethod.InputContentInfoCompat", "androidx.core.view.inputmethod.InputContentInfoCompat"], - ["android.support.v13.view.ViewCompat", "androidx.legacy.view.ViewCompat"], - ["android.support.v14.preference.EditTextPreferenceDialogFragment", "androidx.preference.EditTextPreferenceDialogFragment"], - ["android.support.v14.preference.ListPreferenceDialogFragment", "androidx.preference.ListPreferenceDialogFragment"], - ["android.support.v14.preference.MultiSelectListPreference", "androidx.preference.MultiSelectListPreference"], - ["android.support.v14.preference.MultiSelectListPreferenceDialogFragment", "androidx.preference.MultiSelectListPreferenceDialogFragment"], - ["android.support.v14.preference.PreferenceDialogFragment", "androidx.preference.PreferenceDialogFragment"], - ["android.support.v14.preference.PreferenceFragment", "androidx.preference.PreferenceFragment"], - ["android.support.v14.preference.SwitchPreference", "androidx.preference.SwitchPreference"], - ["android.support.v17.internal.widget.OutlineOnlyWithChildrenFrameLayout", "androidx.leanback.preference.internal.OutlineOnlyWithChildrenFrameLayout"], - ["android.support.v17.leanback.animation.LogAccelerateInterpolator", "androidx.leanback.animation.LogAccelerateInterpolator"], - ["android.support.v17.leanback.animation.LogDecelerateInterpolator", "androidx.leanback.animation.LogDecelerateInterpolator"], - ["android.support.v17.leanback.app.BackgroundFragment", "androidx.leanback.app.BackgroundFragment"], - ["android.support.v17.leanback.app.BackgroundManager", "androidx.leanback.app.BackgroundManager"], - ["android.support.v17.leanback.app.BaseFragment", "androidx.leanback.app.BaseFragment"], - ["android.support.v17.leanback.app.BaseRowFragment", "androidx.leanback.app.BaseRowFragment"], - ["android.support.v17.leanback.app.BaseRowSupportFragment", "androidx.leanback.app.BaseRowSupportFragment"], - ["android.support.v17.leanback.app.BaseSupportFragment", "androidx.leanback.app.BaseSupportFragment"], - ["android.support.v17.leanback.app.BrandedFragment", "androidx.leanback.app.BrandedFragment"], - ["android.support.v17.leanback.app.BrandedSupportFragment", "androidx.leanback.app.BrandedSupportFragment"], - ["android.support.v17.leanback.app.BrowseFragment", "androidx.leanback.app.BrowseFragment"], - ["android.support.v17.leanback.app.BrowseSupportFragment", "androidx.leanback.app.BrowseSupportFragment"], - ["android.support.v17.leanback.app.DetailsBackgroundVideoHelper", "androidx.leanback.app.DetailsBackgroundVideoHelper"], - ["android.support.v17.leanback.app.DetailsFragment", "androidx.leanback.app.DetailsFragment"], - ["android.support.v17.leanback.app.DetailsFragmentBackgroundController", "androidx.leanback.app.DetailsFragmentBackgroundController"], - ["android.support.v17.leanback.app.DetailsSupportFragment", "androidx.leanback.app.DetailsSupportFragment"], - ["android.support.v17.leanback.app.DetailsSupportFragmentBackgroundController", "androidx.leanback.app.DetailsSupportFragmentBackgroundController"], - ["android.support.v17.leanback.app.ErrorFragment", "androidx.leanback.app.ErrorFragment"], - ["android.support.v17.leanback.app.ErrorSupportFragment", "androidx.leanback.app.ErrorSupportFragment"], - ["android.support.v17.leanback.app.FragmentUtil", "androidx.leanback.app.FragmentUtil"], - ["android.support.v17.leanback.app.GuidedStepFragment", "androidx.leanback.app.GuidedStepFragment"], - ["android.support.v17.leanback.app.GuidedStepRootLayout", "androidx.leanback.app.GuidedStepRootLayout"], - ["android.support.v17.leanback.app.GuidedStepSupportFragment", "androidx.leanback.app.GuidedStepSupportFragment"], - ["android.support.v17.leanback.app.HeadersFragment", "androidx.leanback.app.HeadersFragment"], - ["android.support.v17.leanback.app.HeadersSupportFragment", "androidx.leanback.app.HeadersSupportFragment"], - ["android.support.v17.leanback.app.ListRowDataAdapter", "androidx.leanback.app.ListRowDataAdapter"], - ["android.support.v17.leanback.app.OnboardingFragment", "androidx.leanback.app.OnboardingFragment"], - ["android.support.v17.leanback.app.OnboardingSupportFragment", "androidx.leanback.app.OnboardingSupportFragment"], - ["android.support.v17.leanback.app.PermissionHelper", "androidx.leanback.app.PermissionHelper"], - ["android.support.v17.leanback.app.PlaybackFragment", "androidx.leanback.app.PlaybackFragment"], - ["android.support.v17.leanback.app.PlaybackFragmentGlueHost", "androidx.leanback.app.PlaybackFragmentGlueHost"], - ["android.support.v17.leanback.app.PlaybackSupportFragment", "androidx.leanback.app.PlaybackSupportFragment"], - ["android.support.v17.leanback.app.PlaybackSupportFragmentGlueHost", "androidx.leanback.app.PlaybackSupportFragmentGlueHost"], - ["android.support.v17.leanback.app.ProgressBarManager", "androidx.leanback.app.ProgressBarManager"], - ["android.support.v17.leanback.app.RowsFragment", "androidx.leanback.app.RowsFragment"], - ["android.support.v17.leanback.app.RowsSupportFragment", "androidx.leanback.app.RowsSupportFragment"], - ["android.support.v17.leanback.app.SearchFragment", "androidx.leanback.app.SearchFragment"], - ["android.support.v17.leanback.app.SearchSupportFragment", "androidx.leanback.app.SearchSupportFragment"], - ["android.support.v17.leanback.app.VerticalGridFragment", "androidx.leanback.app.VerticalGridFragment"], - ["android.support.v17.leanback.app.VerticalGridSupportFragment", "androidx.leanback.app.VerticalGridSupportFragment"], - ["android.support.v17.leanback.app.VideoFragment", "androidx.leanback.app.VideoFragment"], - ["android.support.v17.leanback.app.VideoFragmentGlueHost", "androidx.leanback.app.VideoFragmentGlueHost"], - ["android.support.v17.leanback.app.VideoSupportFragment", "androidx.leanback.app.VideoSupportFragment"], - ["android.support.v17.leanback.app.VideoSupportFragmentGlueHost", "androidx.leanback.app.VideoSupportFragmentGlueHost"], - ["android.support.v17.leanback.database.CursorMapper", "androidx.leanback.database.CursorMapper"], - ["android.support.v17.leanback.graphics.BoundsRule", "androidx.leanback.graphics.BoundsRule"], - ["android.support.v17.leanback.graphics.ColorFilterCache", "androidx.leanback.graphics.ColorFilterCache"], - ["android.support.v17.leanback.graphics.ColorFilterDimmer", "androidx.leanback.graphics.ColorFilterDimmer"], - ["android.support.v17.leanback.graphics.ColorOverlayDimmer", "androidx.leanback.graphics.ColorOverlayDimmer"], - ["android.support.v17.leanback.graphics.CompositeDrawable", "androidx.leanback.graphics.CompositeDrawable"], - ["android.support.v17.leanback.graphics.FitWidthBitmapDrawable", "androidx.leanback.graphics.FitWidthBitmapDrawable"], - ["android.support.v17.leanback.media.MediaControllerAdapter", "androidx.leanback.media.MediaControllerAdapter"], - ["android.support.v17.leanback.media.MediaControllerGlue", "androidx.leanback.media.MediaControllerGlue"], - ["android.support.v17.leanback.media.MediaPlayerAdapter", "androidx.leanback.media.MediaPlayerAdapter"], - ["android.support.v17.leanback.media.MediaPlayerGlue", "androidx.leanback.media.MediaPlayerGlue"], - ["android.support.v17.leanback.media.PlaybackBannerControlGlue", "androidx.leanback.media.PlaybackBannerControlGlue"], - ["android.support.v17.leanback.media.PlaybackBaseControlGlue", "androidx.leanback.media.PlaybackBaseControlGlue"], - ["android.support.v17.leanback.media.PlaybackControlGlue", "androidx.leanback.media.PlaybackControlGlue"], - ["android.support.v17.leanback.media.PlaybackGlue", "androidx.leanback.media.PlaybackGlue"], - ["android.support.v17.leanback.media.PlaybackGlueHost", "androidx.leanback.media.PlaybackGlueHost"], - ["android.support.v17.leanback.media.PlaybackTransportControlGlue", "androidx.leanback.media.PlaybackTransportControlGlue"], - ["android.support.v17.leanback.media.PlayerAdapter", "androidx.leanback.media.PlayerAdapter"], - ["android.support.v17.leanback.media.SurfaceHolderGlueHost", "androidx.leanback.media.SurfaceHolderGlueHost"], - ["android.support.v17.leanback.R", "androidx.leanback.R"], - ["android.support.v17.leanback.system.Settings", "androidx.leanback.system.Settings"], - ["android.support.v17.leanback.transition.CustomChangeBounds", "androidx.leanback.transition.CustomChangeBounds"], - ["android.support.v17.leanback.transition.FadeAndShortSlide", "androidx.leanback.transition.FadeAndShortSlide"], - ["android.support.v17.leanback.transition.LeanbackTransitionHelper", "androidx.leanback.transition.LeanbackTransitionHelper"], - ["android.support.v17.leanback.transition.ParallaxTransition", "androidx.leanback.transition.ParallaxTransition"], - ["android.support.v17.leanback.transition.Scale", "androidx.leanback.transition.Scale"], - ["android.support.v17.leanback.transition.SlideKitkat", "androidx.leanback.transition.SlideKitkat"], - ["android.support.v17.leanback.transition.SlideNoPropagation", "androidx.leanback.transition.SlideNoPropagation"], - ["android.support.v17.leanback.transition.TransitionEpicenterCallback", "androidx.leanback.transition.TransitionEpicenterCallback"], - ["android.support.v17.leanback.transition.TransitionHelper", "androidx.leanback.transition.TransitionHelper"], - ["android.support.v17.leanback.transition.TransitionListener", "androidx.leanback.transition.TransitionListener"], - ["android.support.v17.leanback.transition.TranslationAnimationCreator", "androidx.leanback.transition.TranslationAnimationCreator"], - ["android.support.v17.leanback.util.MathUtil", "androidx.leanback.util.MathUtil"], - ["android.support.v17.leanback.util.StateMachine", "androidx.leanback.util.StateMachine"], - ["android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter", "androidx.leanback.widget.AbstractDetailsDescriptionPresenter"], - ["android.support.v17.leanback.widget.AbstractMediaItemPresenter", "androidx.leanback.widget.AbstractMediaItemPresenter"], - ["android.support.v17.leanback.widget.AbstractMediaListHeaderPresenter", "androidx.leanback.widget.AbstractMediaListHeaderPresenter"], - ["android.support.v17.leanback.widget.Action", "androidx.leanback.widget.Action"], - ["android.support.v17.leanback.widget.ActionPresenterSelector", "androidx.leanback.widget.ActionPresenterSelector"], - ["android.support.v17.leanback.widget.ArrayObjectAdapter", "androidx.leanback.widget.ArrayObjectAdapter"], - ["android.support.v17.leanback.widget.BackgroundHelper", "androidx.leanback.widget.BackgroundHelper"], - ["android.support.v17.leanback.widget.BaseCardView", "androidx.leanback.widget.BaseCardView"], - ["android.support.v17.leanback.widget.BaseGridView", "androidx.leanback.widget.BaseGridView"], - ["android.support.v17.leanback.widget.BaseOnItemViewClickedListener", "androidx.leanback.widget.BaseOnItemViewClickedListener"], - ["android.support.v17.leanback.widget.BaseOnItemViewSelectedListener", "androidx.leanback.widget.BaseOnItemViewSelectedListener"], - ["android.support.v17.leanback.widget.BrowseFrameLayout", "androidx.leanback.widget.BrowseFrameLayout"], - ["android.support.v17.leanback.widget.BrowseRowsFrameLayout", "androidx.leanback.widget.BrowseRowsFrameLayout"], - ["android.support.v17.leanback.widget.CheckableImageView", "androidx.leanback.widget.CheckableImageView"], - ["android.support.v17.leanback.widget.ClassPresenterSelector", "androidx.leanback.widget.ClassPresenterSelector"], - ["android.support.v17.leanback.widget.ControlBar", "androidx.leanback.widget.ControlBar"], - ["android.support.v17.leanback.widget.ControlBarPresenter", "androidx.leanback.widget.ControlBarPresenter"], - ["android.support.v17.leanback.widget.ControlButtonPresenterSelector", "androidx.leanback.widget.ControlButtonPresenterSelector"], - ["android.support.v17.leanback.widget.CursorObjectAdapter", "androidx.leanback.widget.CursorObjectAdapter"], - ["android.support.v17.leanback.widget.DetailsOverviewLogoPresenter", "androidx.leanback.widget.DetailsOverviewLogoPresenter"], - ["android.support.v17.leanback.widget.DetailsOverviewRow", "androidx.leanback.widget.DetailsOverviewRow"], - ["android.support.v17.leanback.widget.DetailsOverviewRowPresenter", "androidx.leanback.widget.DetailsOverviewRowPresenter"], - ["android.support.v17.leanback.widget.DetailsOverviewSharedElementHelper", "androidx.leanback.widget.DetailsOverviewSharedElementHelper"], - ["android.support.v17.leanback.widget.DetailsParallax", "androidx.leanback.widget.DetailsParallax"], - ["android.support.v17.leanback.widget.DetailsParallaxDrawable", "androidx.leanback.widget.DetailsParallaxDrawable"], - ["android.support.v17.leanback.widget.DiffCallback", "androidx.leanback.widget.DiffCallback"], - ["android.support.v17.leanback.widget.DividerPresenter", "androidx.leanback.widget.DividerPresenter"], - ["android.support.v17.leanback.widget.DividerRow", "androidx.leanback.widget.DividerRow"], - ["android.support.v17.leanback.widget.FacetProvider", "androidx.leanback.widget.FacetProvider"], - ["android.support.v17.leanback.widget.FacetProviderAdapter", "androidx.leanback.widget.FacetProviderAdapter"], - ["android.support.v17.leanback.widget.FocusHighlight", "androidx.leanback.widget.FocusHighlight"], - ["android.support.v17.leanback.widget.FocusHighlightHandler", "androidx.leanback.widget.FocusHighlightHandler"], - ["android.support.v17.leanback.widget.FocusHighlightHelper", "androidx.leanback.widget.FocusHighlightHelper"], - ["android.support.v17.leanback.widget.ForegroundHelper", "androidx.leanback.widget.ForegroundHelper"], - ["android.support.v17.leanback.widget.FragmentAnimationProvider", "androidx.leanback.widget.FragmentAnimationProvider"], - ["android.support.v17.leanback.widget.FullWidthDetailsOverviewRowPresenter", "androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter"], - ["android.support.v17.leanback.widget.FullWidthDetailsOverviewSharedElementHelper", "androidx.leanback.widget.FullWidthDetailsOverviewSharedElementHelper"], - ["android.support.v17.leanback.widget.Grid", "androidx.leanback.widget.Grid"], - ["android.support.v17.leanback.widget.GridLayoutManager", "androidx.leanback.widget.GridLayoutManager"], - ["android.support.v17.leanback.widget.GuidanceStylingRelativeLayout", "androidx.leanback.widget.GuidanceStylingRelativeLayout"], - ["android.support.v17.leanback.widget.GuidanceStylist", "androidx.leanback.widget.GuidanceStylist"], - ["android.support.v17.leanback.widget.GuidedAction", "androidx.leanback.widget.GuidedAction"], - ["android.support.v17.leanback.widget.GuidedActionAdapter", "androidx.leanback.widget.GuidedActionAdapter"], - ["android.support.v17.leanback.widget.GuidedActionAdapterGroup", "androidx.leanback.widget.GuidedActionAdapterGroup"], - ["android.support.v17.leanback.widget.GuidedActionAutofillSupport", "androidx.leanback.widget.GuidedActionAutofillSupport"], - ["android.support.v17.leanback.widget.GuidedActionDiffCallback", "androidx.leanback.widget.GuidedActionDiffCallback"], - ["android.support.v17.leanback.widget.GuidedActionEditText", "androidx.leanback.widget.GuidedActionEditText"], - ["android.support.v17.leanback.widget.GuidedActionItemContainer", "androidx.leanback.widget.GuidedActionItemContainer"], - ["android.support.v17.leanback.widget.GuidedActionsRelativeLayout", "androidx.leanback.widget.GuidedActionsRelativeLayout"], - ["android.support.v17.leanback.widget.GuidedActionsStylist", "androidx.leanback.widget.GuidedActionsStylist"], - ["android.support.v17.leanback.widget.GuidedDatePickerAction", "androidx.leanback.widget.GuidedDatePickerAction"], - ["android.support.v17.leanback.widget.HeaderItem", "androidx.leanback.widget.HeaderItem"], - ["android.support.v17.leanback.widget.HorizontalGridView", "androidx.leanback.widget.HorizontalGridView"], - ["android.support.v17.leanback.widget.HorizontalHoverCardSwitcher", "androidx.leanback.widget.HorizontalHoverCardSwitcher"], - ["android.support.v17.leanback.widget.ImageCardView", "androidx.leanback.widget.ImageCardView"], - ["android.support.v17.leanback.widget.ImeKeyMonitor", "androidx.leanback.widget.ImeKeyMonitor"], - ["android.support.v17.leanback.widget.InvisibleRowPresenter", "androidx.leanback.widget.InvisibleRowPresenter"], - ["android.support.v17.leanback.widget.ItemAlignment", "androidx.leanback.widget.ItemAlignment"], - ["android.support.v17.leanback.widget.ItemAlignmentFacet", "androidx.leanback.widget.ItemAlignmentFacet"], - ["android.support.v17.leanback.widget.ItemAlignmentFacetHelper", "androidx.leanback.widget.ItemAlignmentFacetHelper"], - ["android.support.v17.leanback.widget.ItemBridgeAdapter", "androidx.leanback.widget.ItemBridgeAdapter"], - ["android.support.v17.leanback.widget.ItemBridgeAdapterShadowOverlayWrapper", "androidx.leanback.widget.ItemBridgeAdapterShadowOverlayWrapper"], - ["android.support.v17.leanback.widget.ListRow", "androidx.leanback.widget.ListRow"], - ["android.support.v17.leanback.widget.ListRowHoverCardView", "androidx.leanback.widget.ListRowHoverCardView"], - ["android.support.v17.leanback.widget.ListRowPresenter", "androidx.leanback.widget.ListRowPresenter"], - ["android.support.v17.leanback.widget.ListRowView", "androidx.leanback.widget.ListRowView"], - ["android.support.v17.leanback.widget.MediaItemActionPresenter", "androidx.leanback.widget.MediaItemActionPresenter"], - ["android.support.v17.leanback.widget.MediaNowPlayingView", "androidx.leanback.widget.MediaNowPlayingView"], - ["android.support.v17.leanback.widget.MediaRowFocusView", "androidx.leanback.widget.MediaRowFocusView"], - ["android.support.v17.leanback.widget.MultiActionsProvider", "androidx.leanback.widget.MultiActionsProvider"], - ["android.support.v17.leanback.widget.NonOverlappingFrameLayout", "androidx.leanback.widget.NonOverlappingFrameLayout"], - ["android.support.v17.leanback.widget.NonOverlappingLinearLayout", "androidx.leanback.widget.NonOverlappingLinearLayout"], - ["android.support.v17.leanback.widget.NonOverlappingLinearLayoutWithForeground", "androidx.leanback.widget.NonOverlappingLinearLayoutWithForeground"], - ["android.support.v17.leanback.widget.NonOverlappingRelativeLayout", "androidx.leanback.widget.NonOverlappingRelativeLayout"], - ["android.support.v17.leanback.widget.NonOverlappingView", "androidx.leanback.widget.NonOverlappingView"], - ["android.support.v17.leanback.widget.ObjectAdapter", "androidx.leanback.widget.ObjectAdapter"], - ["android.support.v17.leanback.widget.OnActionClickedListener", "androidx.leanback.widget.OnActionClickedListener"], - ["android.support.v17.leanback.widget.OnChildLaidOutListener", "androidx.leanback.widget.OnChildLaidOutListener"], - ["android.support.v17.leanback.widget.OnChildSelectedListener", "androidx.leanback.widget.OnChildSelectedListener"], - ["android.support.v17.leanback.widget.OnChildViewHolderSelectedListener", "androidx.leanback.widget.OnChildViewHolderSelectedListener"], - ["android.support.v17.leanback.widget.OnItemViewClickedListener", "androidx.leanback.widget.OnItemViewClickedListener"], - ["android.support.v17.leanback.widget.OnItemViewSelectedListener", "androidx.leanback.widget.OnItemViewSelectedListener"], - ["android.support.v17.leanback.widget.PageRow", "androidx.leanback.widget.PageRow"], - ["android.support.v17.leanback.widget.PagingIndicator", "androidx.leanback.widget.PagingIndicator"], - ["android.support.v17.leanback.widget.Parallax", "androidx.leanback.widget.Parallax"], - ["android.support.v17.leanback.widget.ParallaxEffect", "androidx.leanback.widget.ParallaxEffect"], - ["android.support.v17.leanback.widget.ParallaxTarget", "androidx.leanback.widget.ParallaxTarget"], - ["android.support.v17.leanback.widget.PersistentFocusWrapper", "androidx.leanback.widget.PersistentFocusWrapper"], - ["android.support.v17.leanback.widget.picker.DatePicker", "androidx.leanback.widget.picker.DatePicker"], - ["android.support.v17.leanback.widget.picker.Picker", "androidx.leanback.widget.picker.Picker"], - ["android.support.v17.leanback.widget.picker.PickerColumn", "androidx.leanback.widget.picker.PickerColumn"], - ["android.support.v17.leanback.widget.picker.PickerUtility", "androidx.leanback.widget.picker.PickerUtility"], - ["android.support.v17.leanback.widget.picker.TimePicker", "androidx.leanback.widget.picker.TimePicker"], - ["android.support.v17.leanback.widget.PlaybackControlsPresenter", "androidx.leanback.widget.PlaybackControlsPresenter"], - ["android.support.v17.leanback.widget.PlaybackControlsRow", "androidx.leanback.widget.PlaybackControlsRow"], - ["android.support.v17.leanback.widget.PlaybackControlsRowPresenter", "androidx.leanback.widget.PlaybackControlsRowPresenter"], - ["android.support.v17.leanback.widget.PlaybackControlsRowView", "androidx.leanback.widget.PlaybackControlsRowView"], - ["android.support.v17.leanback.widget.PlaybackRowPresenter", "androidx.leanback.widget.PlaybackRowPresenter"], - ["android.support.v17.leanback.widget.PlaybackSeekDataProvider", "androidx.leanback.widget.PlaybackSeekDataProvider"], - ["android.support.v17.leanback.widget.PlaybackSeekUi", "androidx.leanback.widget.PlaybackSeekUi"], - ["android.support.v17.leanback.widget.PlaybackTransportRowPresenter", "androidx.leanback.widget.PlaybackTransportRowPresenter"], - ["android.support.v17.leanback.widget.PlaybackTransportRowView", "androidx.leanback.widget.PlaybackTransportRowView"], - ["android.support.v17.leanback.widget.Presenter", "androidx.leanback.widget.Presenter"], - ["android.support.v17.leanback.widget.PresenterSelector", "androidx.leanback.widget.PresenterSelector"], - ["android.support.v17.leanback.widget.PresenterSwitcher", "androidx.leanback.widget.PresenterSwitcher"], - ["android.support.v17.leanback.widget.RecyclerViewParallax", "androidx.leanback.widget.RecyclerViewParallax"], - ["android.support.v17.leanback.widget.ResizingTextView", "androidx.leanback.widget.ResizingTextView"], - ["android.support.v17.leanback.widget.RoundedRectHelper", "androidx.leanback.widget.RoundedRectHelper"], - ["android.support.v17.leanback.widget.RoundedRectHelperApi21", "androidx.leanback.widget.RoundedRectHelperApi21"], - ["android.support.v17.leanback.widget.Row", "androidx.leanback.widget.Row"], - ["android.support.v17.leanback.widget.RowContainerView", "androidx.leanback.widget.RowContainerView"], - ["android.support.v17.leanback.widget.RowHeaderPresenter", "androidx.leanback.widget.RowHeaderPresenter"], - ["android.support.v17.leanback.widget.RowHeaderView", "androidx.leanback.widget.RowHeaderView"], - ["android.support.v17.leanback.widget.RowPresenter", "androidx.leanback.widget.RowPresenter"], - ["android.support.v17.leanback.widget.ScaleFrameLayout", "androidx.leanback.widget.ScaleFrameLayout"], - ["android.support.v17.leanback.widget.SearchBar", "androidx.leanback.widget.SearchBar"], - ["android.support.v17.leanback.widget.SearchEditText", "androidx.leanback.widget.SearchEditText"], - ["android.support.v17.leanback.widget.SearchOrbView", "androidx.leanback.widget.SearchOrbView"], - ["android.support.v17.leanback.widget.SectionRow", "androidx.leanback.widget.SectionRow"], - ["android.support.v17.leanback.widget.SeekBar", "androidx.leanback.widget.SeekBar"], - ["android.support.v17.leanback.widget.ShadowHelper", "androidx.leanback.widget.ShadowHelper"], - ["android.support.v17.leanback.widget.ShadowHelperApi21", "androidx.leanback.widget.ShadowHelperApi21"], - ["android.support.v17.leanback.widget.ShadowOverlayContainer", "androidx.leanback.widget.ShadowOverlayContainer"], - ["android.support.v17.leanback.widget.ShadowOverlayHelper", "androidx.leanback.widget.ShadowOverlayHelper"], - ["android.support.v17.leanback.widget.SinglePresenterSelector", "androidx.leanback.widget.SinglePresenterSelector"], - ["android.support.v17.leanback.widget.SingleRow", "androidx.leanback.widget.SingleRow"], - ["android.support.v17.leanback.widget.SparseArrayObjectAdapter", "androidx.leanback.widget.SparseArrayObjectAdapter"], - ["android.support.v17.leanback.widget.SpeechOrbView", "androidx.leanback.widget.SpeechOrbView"], - ["android.support.v17.leanback.widget.SpeechRecognitionCallback", "androidx.leanback.widget.SpeechRecognitionCallback"], - ["android.support.v17.leanback.widget.StaggeredGrid", "androidx.leanback.widget.StaggeredGrid"], - ["android.support.v17.leanback.widget.StaggeredGridDefault", "androidx.leanback.widget.StaggeredGridDefault"], - ["android.support.v17.leanback.widget.StaticShadowHelper", "androidx.leanback.widget.StaticShadowHelper"], - ["android.support.v17.leanback.widget.StreamingTextView", "androidx.leanback.widget.StreamingTextView"], - ["android.support.v17.leanback.widget.ThumbsBar", "androidx.leanback.widget.ThumbsBar"], - ["android.support.v17.leanback.widget.TitleHelper", "androidx.leanback.widget.TitleHelper"], - ["android.support.v17.leanback.widget.TitleView", "androidx.leanback.widget.TitleView"], - ["android.support.v17.leanback.widget.TitleViewAdapter", "androidx.leanback.widget.TitleViewAdapter"], - ["android.support.v17.leanback.widget.Util", "androidx.leanback.widget.Util"], - ["android.support.v17.leanback.widget.VerticalGridPresenter", "androidx.leanback.widget.VerticalGridPresenter"], - ["android.support.v17.leanback.widget.VerticalGridView", "androidx.leanback.widget.VerticalGridView"], - ["android.support.v17.leanback.widget.VideoSurfaceView", "androidx.leanback.widget.VideoSurfaceView"], - ["android.support.v17.leanback.widget.ViewHolderTask", "androidx.leanback.widget.ViewHolderTask"], - ["android.support.v17.leanback.widget.ViewsStateBundle", "androidx.leanback.widget.ViewsStateBundle"], - ["android.support.v17.leanback.widget.Visibility", "androidx.leanback.widget.Visibility"], - ["android.support.v17.leanback.widget.WindowAlignment", "androidx.leanback.widget.WindowAlignment"], - ["android.support.v17.preference.BaseLeanbackPreferenceFragment", "androidx.leanback.preference.BaseLeanbackPreferenceFragment"], - ["android.support.v17.preference.LeanbackListPreferenceDialogFragment", "androidx.leanback.preference.LeanbackListPreferenceDialogFragment"], - ["android.support.v17.preference.LeanbackPreferenceDialogFragment", "androidx.leanback.preference.LeanbackPreferenceDialogFragment"], - ["android.support.v17.preference.LeanbackPreferenceFragment", "androidx.leanback.preference.LeanbackPreferenceFragment"], - ["android.support.v17.preference.LeanbackPreferenceFragmentTransitionHelperApi21", "androidx.leanback.preference.LeanbackPreferenceFragmentTransitionHelperApi21"], - ["android.support.v17.preference.LeanbackSettingsFragment", "androidx.leanback.preference.LeanbackSettingsFragment"], - ["android.support.v17.preference.LeanbackSettingsRootView", "androidx.leanback.preference.LeanbackSettingsRootView"], - ["android.support.v17.preference.R", "androidx.leanback.preference.R"], - ["android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat", "androidx.core.accessibilityservice.AccessibilityServiceInfoCompat"], - ["android.support.v4.app.ActionBarDrawerToggle", "androidx.legacy.app.ActionBarDrawerToggle"], - ["android.support.v4.app.ActivityCompat", "androidx.core.app.ActivityCompat"], - ["android.support.v4.app.ActivityManagerCompat", "androidx.core.app.ActivityManagerCompat"], - ["android.support.v4.app.ActivityOptionsCompat", "androidx.core.app.ActivityOptionsCompat"], - ["android.support.v4.app.AlarmManagerCompat", "androidx.core.app.AlarmManagerCompat"], - ["android.support.v4.app.AppComponentFactory", "androidx.core.app.AppComponentFactory"], - ["android.support.v4.app.AppLaunchChecker", "androidx.core.app.AppLaunchChecker"], - ["android.support.v4.app.AppOpsManagerCompat", "androidx.core.app.AppOpsManagerCompat"], - ["android.support.v4.app.BackStackRecord", "androidx.fragment.app.BackStackRecord"], - ["android.support.v4.app.BackStackState", "androidx.fragment.app.BackStackState"], - ["android.support.v4.app.BundleCompat", "androidx.core.app.BundleCompat"], - ["android.support.v4.app.CoreComponentFactory", "androidx.core.app.CoreComponentFactory"], - ["android.support.v4.app.DialogFragment", "androidx.fragment.app.DialogFragment"], - ["android.support.v4.app.Fragment", "androidx.fragment.app.Fragment"], - ["android.support.v4.app.FragmentActivity", "androidx.fragment.app.FragmentActivity"], - ["android.support.v4.app.FragmentContainer", "androidx.fragment.app.FragmentContainer"], - ["android.support.v4.app.FragmentController", "androidx.fragment.app.FragmentController"], - ["android.support.v4.app.FragmentHostCallback", "androidx.fragment.app.FragmentHostCallback"], - ["android.support.v4.app.FragmentManager", "androidx.fragment.app.FragmentManager"], - ["android.support.v4.app.FragmentManagerImpl", "androidx.fragment.app.FragmentManagerImpl"], - ["android.support.v4.app.FragmentManagerNonConfig", "androidx.fragment.app.FragmentManagerNonConfig"], - ["android.support.v4.app.FragmentManagerState", "androidx.fragment.app.FragmentManagerState"], - ["android.support.v4.app.FragmentPagerAdapter", "androidx.fragment.app.FragmentPagerAdapter"], - ["android.support.v4.app.FragmentState", "androidx.fragment.app.FragmentState"], - ["android.support.v4.app.FragmentStatePagerAdapter", "androidx.fragment.app.FragmentStatePagerAdapter"], - ["android.support.v4.app.FragmentTabHost", "androidx.fragment.app.FragmentTabHost"], - ["android.support.v4.app.FragmentTransaction", "androidx.fragment.app.FragmentTransaction"], - ["android.support.v4.app.FragmentTransition", "androidx.fragment.app.FragmentTransition"], - ["android.support.v4.app.FragmentTransitionCompat21", "androidx.fragment.app.FragmentTransitionCompat21"], - ["android.support.v4.app.FragmentTransitionImpl", "androidx.fragment.app.FragmentTransitionImpl"], - ["android.support.v4.app.FrameMetricsAggregator", "androidx.core.app.FrameMetricsAggregator"], - ["android.support.v4.app.INotificationSideChannel", "androidx.core.app.INotificationSideChannel"], - ["android.support.v4.app.JobIntentService", "androidx.core.app.JobIntentService"], - ["android.support.v4.app.ListFragment", "androidx.fragment.app.ListFragment"], - ["android.support.v4.app.LoaderManager", "androidx.loader.app.LoaderManager"], - ["android.support.v4.app.LoaderManagerImpl", "androidx.loader.app.LoaderManagerImpl"], - ["android.support.v4.app.NavUtils", "androidx.core.app.NavUtils"], - ["android.support.v4.app.NotificationBuilderWithBuilderAccessor", "androidx.core.app.NotificationBuilderWithBuilderAccessor"], - ["android.support.v4.app.NotificationCompat", "androidx.core.app.NotificationCompat"], - ["android.support.v4.app.NotificationCompatBuilder", "androidx.core.app.NotificationCompatBuilder"], - ["android.support.v4.app.NotificationCompatExtras", "androidx.core.app.NotificationCompatExtras"], - ["android.support.v4.app.NotificationCompatJellybean", "androidx.core.app.NotificationCompatJellybean"], - ["android.support.v4.app.NotificationCompatSideChannelService", "androidx.core.app.NotificationCompatSideChannelService"], - ["android.support.v4.app.NotificationManagerCompat", "androidx.core.app.NotificationManagerCompat"], - ["android.support.v4.app.OneShotPreDrawListener", "androidx.fragment.app.OneShotPreDrawListener"], - ["android.support.v4.app.Person", "androidx.core.app.Person"], - ["android.support.v4.app.RemoteInput", "androidx.core.app.RemoteInput"], - ["android.support.v4.app.ServiceCompat", "androidx.core.app.ServiceCompat"], - ["android.support.v4.app.ShareCompat", "androidx.core.app.ShareCompat"], - ["android.support.v4.app.SharedElementCallback", "androidx.core.app.SharedElementCallback"], - ["android.support.v4.app.SuperNotCalledException", "androidx.fragment.app.SuperNotCalledException"], - ["android.support.v4.app.SupportActivity", "androidx.core.app.ComponentActivity"], - ["android.support.v4.app.TaskStackBuilder", "androidx.core.app.TaskStackBuilder"], - ["android.support.v4.content.AsyncTaskLoader", "androidx.loader.content.AsyncTaskLoader"], - ["android.support.v4.content.ContentResolverCompat", "androidx.core.content.ContentResolverCompat"], - ["android.support.v4.content.ContextCompat", "androidx.core.content.ContextCompat"], - ["android.support.v4.content.CursorLoader", "androidx.loader.content.CursorLoader"], - ["android.support.v4.content.FileProvider", "androidx.core.content.FileProvider"], - ["android.support.v4.content.IntentCompat", "androidx.core.content.IntentCompat"], - ["android.support.v4.content.Loader", "androidx.loader.content.Loader"], - ["android.support.v4.content.LocalBroadcastManager", "androidx.localbroadcastmanager.content.LocalBroadcastManager"], - ["android.support.v4.content.MimeTypeFilter", "androidx.core.content.MimeTypeFilter"], - ["android.support.v4.content.ModernAsyncTask", "androidx.loader.content.ModernAsyncTask"], - ["android.support.v4.content.PermissionChecker", "androidx.core.content.PermissionChecker"], - ["android.support.v4.content.pm.ActivityInfoCompat", "androidx.core.content.pm.ActivityInfoCompat"], - ["android.support.v4.content.pm.PackageInfoCompat", "androidx.core.content.pm.PackageInfoCompat"], - ["android.support.v4.content.pm.PermissionInfoCompat", "androidx.core.content.pm.PermissionInfoCompat"], - ["android.support.v4.content.pm.ShortcutInfoCompat", "androidx.core.content.pm.ShortcutInfoCompat"], - ["android.support.v4.content.pm.ShortcutManagerCompat", "androidx.core.content.pm.ShortcutManagerCompat"], - ["android.support.v4.content.res.ColorStateListInflaterCompat", "androidx.core.content.res.ColorStateListInflaterCompat"], - ["android.support.v4.content.res.ComplexColorCompat", "androidx.core.content.res.ComplexColorCompat"], - ["android.support.v4.content.res.ConfigurationHelper", "androidx.core.content.res.ConfigurationHelper"], - ["android.support.v4.content.res.FontResourcesParserCompat", "androidx.core.content.res.FontResourcesParserCompat"], - ["android.support.v4.content.res.GradientColorInflaterCompat", "androidx.core.content.res.GradientColorInflaterCompat"], - ["android.support.v4.content.res.GrowingArrayUtils", "androidx.core.content.res.GrowingArrayUtils"], - ["android.support.v4.content.res.ResourcesCompat", "androidx.core.content.res.ResourcesCompat"], - ["android.support.v4.content.res.TypedArrayUtils", "androidx.core.content.res.TypedArrayUtils"], - ["android.support.v4.content.SharedPreferencesCompat", "androidx.core.content.SharedPreferencesCompat"], - ["android.support.v4.content.WakefulBroadcastReceiver", "androidx.legacy.content.WakefulBroadcastReceiver"], - ["android.support.v4.database.CursorWindowCompat", "androidx.core.database.CursorWindowCompat"], - ["android.support.v4.database.DatabaseUtilsCompat", "androidx.core.database.DatabaseUtilsCompat"], - ["android.support.v4.database.sqlite.SQLiteCursorCompat", "androidx.core.database.sqlite.SQLiteCursorCompat"], - ["android.support.v4.graphics.BitmapCompat", "androidx.core.graphics.BitmapCompat"], - ["android.support.v4.graphics.ColorUtils", "androidx.core.graphics.ColorUtils"], - ["android.support.v4.graphics.drawable.DrawableCompat", "androidx.core.graphics.drawable.DrawableCompat"], - ["android.support.v4.graphics.drawable.IconCompat", "androidx.core.graphics.drawable.IconCompat"], - ["android.support.v4.graphics.drawable.IconCompatParcelizer", "android.support.v4.graphics.drawable.IconCompatParcelizer"], - ["android.support.v4.graphics.drawable.RoundedBitmapDrawable21", "androidx.core.graphics.drawable.RoundedBitmapDrawable21"], - ["android.support.v4.graphics.drawable.RoundedBitmapDrawable", "androidx.core.graphics.drawable.RoundedBitmapDrawable"], - ["android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory", "androidx.core.graphics.drawable.RoundedBitmapDrawableFactory"], - ["android.support.v4.graphics.drawable.TintAwareDrawable", "androidx.core.graphics.drawable.TintAwareDrawable"], - ["android.support.v4.graphics.drawable.WrappedDrawable", "androidx.core.graphics.drawable.WrappedDrawable"], - ["android.support.v4.graphics.drawable.WrappedDrawableApi14", "androidx.core.graphics.drawable.WrappedDrawableApi14"], - ["android.support.v4.graphics.drawable.WrappedDrawableApi21", "androidx.core.graphics.drawable.WrappedDrawableApi21"], - ["android.support.v4.graphics.PaintCompat", "androidx.core.graphics.PaintCompat"], - ["android.support.v4.graphics.PathParser", "androidx.core.graphics.PathParser"], - ["android.support.v4.graphics.PathSegment", "androidx.core.graphics.PathSegment"], - ["android.support.v4.graphics.PathUtils", "androidx.core.graphics.PathUtils"], - ["android.support.v4.graphics.TypefaceCompat", "androidx.core.graphics.TypefaceCompat"], - ["android.support.v4.graphics.TypefaceCompatApi21Impl", "androidx.core.graphics.TypefaceCompatApi21Impl"], - ["android.support.v4.graphics.TypefaceCompatApi24Impl", "androidx.core.graphics.TypefaceCompatApi24Impl"], - ["android.support.v4.graphics.TypefaceCompatApi26Impl", "androidx.core.graphics.TypefaceCompatApi26Impl"], - ["android.support.v4.graphics.TypefaceCompatApi28Impl", "androidx.core.graphics.TypefaceCompatApi28Impl"], - ["android.support.v4.graphics.TypefaceCompatBaseImpl", "androidx.core.graphics.TypefaceCompatBaseImpl"], - ["android.support.v4.graphics.TypefaceCompatUtil", "androidx.core.graphics.TypefaceCompatUtil"], - ["android.support.v4.hardware.display.DisplayManagerCompat", "androidx.core.hardware.display.DisplayManagerCompat"], - ["android.support.v4.hardware.fingerprint.FingerprintManagerCompat", "androidx.core.hardware.fingerprint.FingerprintManagerCompat"], - ["android.support.v4.internal.view.SupportMenu", "androidx.core.internal.view.SupportMenu"], - ["android.support.v4.internal.view.SupportMenuItem", "androidx.core.internal.view.SupportMenuItem"], - ["android.support.v4.internal.view.SupportSubMenu", "androidx.core.internal.view.SupportSubMenu"], - ["android.support.v4.math.MathUtils", "androidx.core.math.MathUtils"], - ["android.support.v4.media.app.NotificationCompat", "androidx.media.app.NotificationCompat"], - ["android.support.v4.media.AudioAttributesCompat", "androidx.media.AudioAttributesCompat"], - ["android.support.v4.media.AudioAttributesImpl", "android.support.v4.media.AudioAttributesImpl"], - ["android.support.v4.media.AudioAttributesImplApi21", "android.support.v4.media.AudioAttributesImplApi21"], - ["android.support.v4.media.AudioAttributesImplBase", "android.support.v4.media.AudioAttributesImplBase"], - ["android.support.v4.media.MediaBrowserCompat", "android.support.v4.media.MediaBrowserCompat"], - ["android.support.v4.media.MediaBrowserCompatApi21", "android.support.v4.media.MediaBrowserCompatApi21"], - ["android.support.v4.media.MediaBrowserCompatApi23", "android.support.v4.media.MediaBrowserCompatApi23"], - ["android.support.v4.media.MediaBrowserCompatApi26", "android.support.v4.media.MediaBrowserCompatApi26"], - ["android.support.v4.media.MediaBrowserCompatUtils", "androidx.media.MediaBrowserCompatUtils"], - ["android.support.v4.media.MediaBrowserProtocol", "androidx.media.MediaBrowserProtocol"], - ["android.support.v4.media.MediaBrowserServiceCompat", "androidx.media.MediaBrowserServiceCompat"], - ["android.support.v4.media.MediaBrowserServiceCompatApi21", "androidx.media.MediaBrowserServiceCompatApi21"], - ["android.support.v4.media.MediaBrowserServiceCompatApi23", "androidx.media.MediaBrowserServiceCompatApi23"], - ["android.support.v4.media.MediaBrowserServiceCompatApi26", "androidx.media.MediaBrowserServiceCompatApi26"], - ["android.support.v4.media.MediaDescriptionCompat", "android.support.v4.media.MediaDescriptionCompat"], - ["android.support.v4.media.MediaDescriptionCompatApi21", "android.support.v4.media.MediaDescriptionCompatApi21"], - ["android.support.v4.media.MediaDescriptionCompatApi23", "android.support.v4.media.MediaDescriptionCompatApi23"], - ["android.support.v4.media.MediaMetadataCompat", "android.support.v4.media.MediaMetadataCompat"], - ["android.support.v4.media.MediaMetadataCompatApi21", "android.support.v4.media.MediaMetadataCompatApi21"], - ["android.support.v4.media.MediaSessionManager", "android.support.v4.media.MediaSessionManager"], - ["android.support.v4.media.MediaSessionManagerImplApi21", "android.support.v4.media.MediaSessionManagerImplApi21"], - ["android.support.v4.media.MediaSessionManagerImplApi28", "android.support.v4.media.MediaSessionManagerImplApi28"], - ["android.support.v4.media.MediaSessionManagerImplBase", "android.support.v4.media.MediaSessionManagerImplBase"], - ["android.support.v4.media.ParceledListSliceAdapterApi21", "android.support.v4.media.ParceledListSliceAdapterApi21"], - ["android.support.v4.media.RatingCompat", "android.support.v4.media.RatingCompat"], - ["android.support.v4.media.session.IMediaControllerCallback", "android.support.v4.media.session.IMediaControllerCallback"], - ["android.support.v4.media.session.IMediaSession", "android.support.v4.media.session.IMediaSession"], - ["android.support.v4.media.session.MediaButtonReceiver", "androidx.media.session.MediaButtonReceiver"], - ["android.support.v4.media.session.MediaControllerCompat", "android.support.v4.media.session.MediaControllerCompat"], - ["android.support.v4.media.session.MediaControllerCompatApi21", "android.support.v4.media.session.MediaControllerCompatApi21"], - ["android.support.v4.media.session.MediaControllerCompatApi23", "android.support.v4.media.session.MediaControllerCompatApi23"], - ["android.support.v4.media.session.MediaControllerCompatApi24", "android.support.v4.media.session.MediaControllerCompatApi24"], - ["android.support.v4.media.session.MediaSessionCompat", "android.support.v4.media.session.MediaSessionCompat"], - ["android.support.v4.media.session.MediaSessionCompatApi21", "android.support.v4.media.session.MediaSessionCompatApi21"], - ["android.support.v4.media.session.MediaSessionCompatApi22", "android.support.v4.media.session.MediaSessionCompatApi22"], - ["android.support.v4.media.session.MediaSessionCompatApi23", "android.support.v4.media.session.MediaSessionCompatApi23"], - ["android.support.v4.media.session.MediaSessionCompatApi24", "android.support.v4.media.session.MediaSessionCompatApi24"], - ["android.support.v4.media.session.ParcelableVolumeInfo", "android.support.v4.media.session.ParcelableVolumeInfo"], - ["android.support.v4.media.session.PlaybackStateCompat", "android.support.v4.media.session.PlaybackStateCompat"], - ["android.support.v4.media.session.PlaybackStateCompatApi21", "android.support.v4.media.session.PlaybackStateCompatApi21"], - ["android.support.v4.media.session.PlaybackStateCompatApi22", "android.support.v4.media.session.PlaybackStateCompatApi22"], - ["android.support.v4.media.VolumeProviderCompat", "androidx.media.VolumeProviderCompat"], - ["android.support.v4.media.VolumeProviderCompatApi21", "androidx.media.VolumeProviderCompatApi21"], - ["android.support.v4.net.ConnectivityManagerCompat", "androidx.core.net.ConnectivityManagerCompat"], - ["android.support.v4.net.DatagramSocketWrapper", "androidx.core.net.DatagramSocketWrapper"], - ["android.support.v4.net.TrafficStatsCompat", "androidx.core.net.TrafficStatsCompat"], - ["android.support.v4.os.BuildCompat", "androidx.core.os.BuildCompat"], - ["android.support.v4.os.CancellationSignal", "androidx.core.os.CancellationSignal"], - ["android.support.v4.os.ConfigurationCompat", "androidx.core.os.ConfigurationCompat"], - ["android.support.v4.os.EnvironmentCompat", "androidx.core.os.EnvironmentCompat"], - ["android.support.v4.os.HandlerCompat", "androidx.core.os.HandlerCompat"], - ["android.support.v4.os.IResultReceiver", "androidx.core.os.IResultReceiver"], - ["android.support.v4.os.LocaleHelper", "androidx.core.os.LocaleHelper"], - ["android.support.v4.os.LocaleListCompat", "androidx.core.os.LocaleListCompat"], - ["android.support.v4.os.LocaleListHelper", "androidx.core.os.LocaleListHelper"], - ["android.support.v4.os.LocaleListInterface", "androidx.core.os.LocaleListInterface"], - ["android.support.v4.os.OperationCanceledException", "androidx.core.os.OperationCanceledException"], - ["android.support.v4.os.ParcelableCompat", "androidx.core.os.ParcelableCompat"], - ["android.support.v4.os.ParcelableCompatCreatorCallbacks", "androidx.core.os.ParcelableCompatCreatorCallbacks"], - ["android.support.v4.os.ParcelCompat", "androidx.core.os.ParcelCompat"], - ["android.support.v4.os.ResultReceiver", "androidx.core.os.ResultReceiver"], - ["android.support.v4.os.TraceCompat", "androidx.core.os.TraceCompat"], - ["android.support.v4.os.UserManagerCompat", "androidx.core.os.UserManagerCompat"], - ["android.support.v4.print.PrintHelper", "androidx.print.PrintHelper"], - ["android.support.v4.provider.DocumentFile", "androidx.documentfile.provider.DocumentFile"], - ["android.support.v4.provider.DocumentsContractApi19", "androidx.documentfile.provider.DocumentsContractApi19"], - ["android.support.v4.provider.FontRequest", "androidx.core.provider.FontRequest"], - ["android.support.v4.provider.FontsContractCompat", "androidx.core.provider.FontsContractCompat"], - ["android.support.v4.provider.RawDocumentFile", "androidx.documentfile.provider.RawDocumentFile"], - ["android.support.v4.provider.SelfDestructiveThread", "androidx.core.provider.SelfDestructiveThread"], - ["android.support.v4.provider.SingleDocumentFile", "androidx.documentfile.provider.SingleDocumentFile"], - ["android.support.v4.provider.TreeDocumentFile", "androidx.documentfile.provider.TreeDocumentFile"], - ["android.support.v4.text.BidiFormatter", "androidx.core.text.BidiFormatter"], - ["android.support.v4.text.HtmlCompat", "androidx.core.text.HtmlCompat"], - ["android.support.v4.text.ICUCompat", "androidx.core.text.ICUCompat"], - ["android.support.v4.text.PrecomputedTextCompat", "androidx.core.text.PrecomputedTextCompat"], - ["android.support.v4.text.TextDirectionHeuristicCompat", "androidx.core.text.TextDirectionHeuristicCompat"], - ["android.support.v4.text.TextDirectionHeuristicsCompat", "androidx.core.text.TextDirectionHeuristicsCompat"], - ["android.support.v4.text.TextUtilsCompat", "androidx.core.text.TextUtilsCompat"], - ["android.support.v4.text.util.FindAddress", "androidx.core.text.util.FindAddress"], - ["android.support.v4.text.util.LinkifyCompat", "androidx.core.text.util.LinkifyCompat"], - ["android.support.v4.util.ArrayMap", "androidx.collection.ArrayMap"], - ["android.support.v4.util.ArraySet", "androidx.collection.ArraySet"], - ["android.support.v4.util.AtomicFile", "androidx.core.util.AtomicFile"], - ["android.support.v4.util.CircularArray", "androidx.collection.CircularArray"], - ["android.support.v4.util.CircularIntArray", "androidx.collection.CircularIntArray"], - ["android.support.v4.util.Consumer", "androidx.core.util.Consumer"], - ["android.support.v4.util.ContainerHelpers", "androidx.collection.ContainerHelpers"], - ["android.support.v4.util.DebugUtils", "androidx.core.util.DebugUtils"], - ["android.support.v4.util.LogWriter", "androidx.core.util.LogWriter"], - ["android.support.v4.util.LongSparseArray", "androidx.collection.LongSparseArray"], - ["android.support.v4.util.LruCache", "androidx.collection.LruCache"], - ["android.support.v4.util.MapCollections", "androidx.collection.MapCollections"], - ["android.support.v4.util.ObjectsCompat", "androidx.core.util.ObjectsCompat"], - ["android.support.v4.util.Pair", "androidx.core.util.Pair"], - ["android.support.v4.util.PatternsCompat", "androidx.core.util.PatternsCompat"], - ["android.support.v4.util.Pools", "androidx.core.util.Pools"], - ["android.support.v4.util.Preconditions", "androidx.core.util.Preconditions"], - ["android.support.v4.util.SimpleArrayMap", "androidx.collection.SimpleArrayMap"], - ["android.support.v4.util.SparseArrayCompat", "androidx.collection.SparseArrayCompat"], - ["android.support.v4.util.TimeUtils", "androidx.core.util.TimeUtils"], - ["android.support.v4.view.AbsSavedState", "androidx.customview.view.AbsSavedState"], - ["android.support.v4.view.accessibility.AccessibilityEventCompat", "androidx.core.view.accessibility.AccessibilityEventCompat"], - ["android.support.v4.view.accessibility.AccessibilityManagerCompat", "androidx.core.view.accessibility.AccessibilityManagerCompat"], - ["android.support.v4.view.accessibility.AccessibilityNodeInfoCompat", "androidx.core.view.accessibility.AccessibilityNodeInfoCompat"], - ["android.support.v4.view.accessibility.AccessibilityNodeProviderCompat", "androidx.core.view.accessibility.AccessibilityNodeProviderCompat"], - ["android.support.v4.view.accessibility.AccessibilityRecordCompat", "androidx.core.view.accessibility.AccessibilityRecordCompat"], - ["android.support.v4.view.accessibility.AccessibilityWindowInfoCompat", "androidx.core.view.accessibility.AccessibilityWindowInfoCompat"], - ["android.support.v4.view.AccessibilityDelegateCompat", "androidx.core.view.AccessibilityDelegateCompat"], - ["android.support.v4.view.ActionProvider", "androidx.core.view.ActionProvider"], - ["android.support.v4.view.animation.FastOutLinearInInterpolator", "androidx.interpolator.view.animation.FastOutLinearInInterpolator"], - ["android.support.v4.view.animation.FastOutSlowInInterpolator", "androidx.interpolator.view.animation.FastOutSlowInInterpolator"], - ["android.support.v4.view.animation.LinearOutSlowInInterpolator", "androidx.interpolator.view.animation.LinearOutSlowInInterpolator"], - ["android.support.v4.view.animation.LookupTableInterpolator", "androidx.interpolator.view.animation.LookupTableInterpolator"], - ["android.support.v4.view.animation.PathInterpolatorApi14", "androidx.core.view.animation.PathInterpolatorApi14"], - ["android.support.v4.view.animation.PathInterpolatorCompat", "androidx.core.view.animation.PathInterpolatorCompat"], - ["android.support.v4.view.AsyncLayoutInflater", "androidx.asynclayoutinflater.view.AsyncLayoutInflater"], - ["android.support.v4.view.DisplayCutoutCompat", "androidx.core.view.DisplayCutoutCompat"], - ["android.support.v4.view.GestureDetectorCompat", "androidx.core.view.GestureDetectorCompat"], - ["android.support.v4.view.GravityCompat", "androidx.core.view.GravityCompat"], - ["android.support.v4.view.InputDeviceCompat", "androidx.core.view.InputDeviceCompat"], - ["android.support.v4.view.KeyEventDispatcher", "androidx.core.view.KeyEventDispatcher"], - ["android.support.v4.view.LayoutInflaterCompat", "androidx.core.view.LayoutInflaterCompat"], - ["android.support.v4.view.LayoutInflaterFactory", "androidx.core.view.LayoutInflaterFactory"], - ["android.support.v4.view.MarginLayoutParamsCompat", "androidx.core.view.MarginLayoutParamsCompat"], - ["android.support.v4.view.MenuCompat", "androidx.core.view.MenuCompat"], - ["android.support.v4.view.MenuItemCompat", "androidx.core.view.MenuItemCompat"], - ["android.support.v4.view.MotionEventCompat", "androidx.core.view.MotionEventCompat"], - ["android.support.v4.view.NestedScrollingChild2", "androidx.core.view.NestedScrollingChild2"], - ["android.support.v4.view.NestedScrollingChild", "androidx.core.view.NestedScrollingChild"], - ["android.support.v4.view.NestedScrollingChildHelper", "androidx.core.view.NestedScrollingChildHelper"], - ["android.support.v4.view.NestedScrollingParent2", "androidx.core.view.NestedScrollingParent2"], - ["android.support.v4.view.NestedScrollingParent", "androidx.core.view.NestedScrollingParent"], - ["android.support.v4.view.NestedScrollingParentHelper", "androidx.core.view.NestedScrollingParentHelper"], - ["android.support.v4.view.OnApplyWindowInsetsListener", "androidx.core.view.OnApplyWindowInsetsListener"], - ["android.support.v4.view.PagerAdapter", "androidx.viewpager.widget.PagerAdapter"], - ["android.support.v4.view.PagerTabStrip", "androidx.viewpager.widget.PagerTabStrip"], - ["android.support.v4.view.PagerTitleStrip", "androidx.viewpager.widget.PagerTitleStrip"], - ["android.support.v4.view.PointerIconCompat", "androidx.core.view.PointerIconCompat"], - ["android.support.v4.view.ScaleGestureDetectorCompat", "androidx.core.view.ScaleGestureDetectorCompat"], - ["android.support.v4.view.ScrollingView", "androidx.core.view.ScrollingView"], - ["android.support.v4.view.TintableBackgroundView", "androidx.core.view.TintableBackgroundView"], - ["android.support.v4.view.VelocityTrackerCompat", "androidx.core.view.VelocityTrackerCompat"], - ["android.support.v4.view.ViewCompat", "androidx.core.view.ViewCompat"], - ["android.support.v4.view.ViewConfigurationCompat", "androidx.core.view.ViewConfigurationCompat"], - ["android.support.v4.view.ViewGroupCompat", "androidx.core.view.ViewGroupCompat"], - ["android.support.v4.view.ViewPager", "androidx.viewpager.widget.ViewPager"], - ["android.support.v4.view.ViewParentCompat", "androidx.core.view.ViewParentCompat"], - ["android.support.v4.view.ViewPropertyAnimatorCompat", "androidx.core.view.ViewPropertyAnimatorCompat"], - ["android.support.v4.view.ViewPropertyAnimatorListener", "androidx.core.view.ViewPropertyAnimatorListener"], - ["android.support.v4.view.ViewPropertyAnimatorListenerAdapter", "androidx.core.view.ViewPropertyAnimatorListenerAdapter"], - ["android.support.v4.view.ViewPropertyAnimatorUpdateListener", "androidx.core.view.ViewPropertyAnimatorUpdateListener"], - ["android.support.v4.view.WindowCompat", "androidx.core.view.WindowCompat"], - ["android.support.v4.view.WindowInsetsCompat", "androidx.core.view.WindowInsetsCompat"], - ["android.support.v4.widget.AutoScrollHelper", "androidx.core.widget.AutoScrollHelper"], - ["android.support.v4.widget.AutoSizeableTextView", "androidx.core.widget.AutoSizeableTextView"], - ["android.support.v4.widget.CircleImageView", "androidx.swiperefreshlayout.widget.CircleImageView"], - ["android.support.v4.widget.CircularProgressDrawable", "androidx.swiperefreshlayout.widget.CircularProgressDrawable"], - ["android.support.v4.widget.CompoundButtonCompat", "androidx.core.widget.CompoundButtonCompat"], - ["android.support.v4.widget.ContentLoadingProgressBar", "androidx.core.widget.ContentLoadingProgressBar"], - ["android.support.v4.widget.CursorAdapter", "androidx.cursoradapter.widget.CursorAdapter"], - ["android.support.v4.widget.CursorFilter", "androidx.cursoradapter.widget.CursorFilter"], - ["android.support.v4.widget.DirectedAcyclicGraph", "androidx.coordinatorlayout.widget.DirectedAcyclicGraph"], - ["android.support.v4.widget.DrawerLayout", "androidx.drawerlayout.widget.DrawerLayout"], - ["android.support.v4.widget.EdgeEffectCompat", "androidx.core.widget.EdgeEffectCompat"], - ["android.support.v4.widget.ExploreByTouchHelper", "androidx.customview.widget.ExploreByTouchHelper"], - ["android.support.v4.widget.FocusStrategy", "androidx.customview.widget.FocusStrategy"], - ["android.support.v4.widget.ImageViewCompat", "androidx.core.widget.ImageViewCompat"], - ["android.support.v4.widget.ListPopupWindowCompat", "androidx.core.widget.ListPopupWindowCompat"], - ["android.support.v4.widget.ListViewAutoScrollHelper", "androidx.core.widget.ListViewAutoScrollHelper"], - ["android.support.v4.widget.ListViewCompat", "androidx.core.widget.ListViewCompat"], - ["android.support.v4.widget.NestedScrollView", "androidx.core.widget.NestedScrollView"], - ["android.support.v4.widget.PopupMenuCompat", "androidx.core.widget.PopupMenuCompat"], - ["android.support.v4.widget.PopupWindowCompat", "androidx.core.widget.PopupWindowCompat"], - ["android.support.v4.widget.ResourceCursorAdapter", "androidx.cursoradapter.widget.ResourceCursorAdapter"], - ["android.support.v4.widget.ScrollerCompat", "androidx.core.widget.ScrollerCompat"], - ["android.support.v4.widget.SimpleCursorAdapter", "androidx.cursoradapter.widget.SimpleCursorAdapter"], - ["android.support.v4.widget.SlidingPaneLayout", "androidx.slidingpanelayout.widget.SlidingPaneLayout"], - ["android.support.v4.widget.Space", "androidx.legacy.widget.Space"], - ["android.support.v4.widget.SwipeRefreshLayout", "androidx.swiperefreshlayout.widget.SwipeRefreshLayout"], - ["android.support.v4.widget.TextViewCompat", "androidx.core.widget.TextViewCompat"], - ["android.support.v4.widget.TintableCompoundButton", "androidx.core.widget.TintableCompoundButton"], - ["android.support.v4.widget.TintableImageSourceView", "androidx.core.widget.TintableImageSourceView"], - ["android.support.v4.widget.ViewDragHelper", "androidx.customview.widget.ViewDragHelper"], - ["android.support.v4.widget.ViewGroupUtils", "androidx.coordinatorlayout.widget.ViewGroupUtils"], - ["android.support.v7.app.ActionBar", "androidx.appcompat.app.ActionBar"], - ["android.support.v7.app.ActionBarDrawerToggle", "androidx.appcompat.app.ActionBarDrawerToggle"], - ["android.support.v7.app.ActionBarDrawerToggleHoneycomb", "androidx.appcompat.app.ActionBarDrawerToggleHoneycomb"], - ["android.support.v7.app.AlertController", "androidx.appcompat.app.AlertController"], - ["android.support.v7.app.AlertDialog", "androidx.appcompat.app.AlertDialog"], - ["android.support.v7.app.AppCompatActivity", "androidx.appcompat.app.AppCompatActivity"], - ["android.support.v7.app.AppCompatCallback", "androidx.appcompat.app.AppCompatCallback"], - ["android.support.v7.app.AppCompatDelegate", "androidx.appcompat.app.AppCompatDelegate"], - ["android.support.v7.app.AppCompatDelegateImpl", "androidx.appcompat.app.AppCompatDelegateImpl"], - ["android.support.v7.app.AppCompatDialog", "androidx.appcompat.app.AppCompatDialog"], - ["android.support.v7.app.AppCompatDialogFragment", "androidx.appcompat.app.AppCompatDialogFragment"], - ["android.support.v7.app.AppCompatViewInflater", "androidx.appcompat.app.AppCompatViewInflater"], - ["android.support.v7.app.MediaRouteActionProvider", "androidx.mediarouter.app.MediaRouteActionProvider"], - ["android.support.v7.app.MediaRouteButton", "androidx.mediarouter.app.MediaRouteButton"], - ["android.support.v7.app.MediaRouteCastDialog", "androidx.mediarouter.app.MediaRouteCastDialog"], - ["android.support.v7.app.MediaRouteChooserDialog", "androidx.mediarouter.app.MediaRouteChooserDialog"], - ["android.support.v7.app.MediaRouteChooserDialogFragment", "androidx.mediarouter.app.MediaRouteChooserDialogFragment"], - ["android.support.v7.app.MediaRouteControllerDialog", "androidx.mediarouter.app.MediaRouteControllerDialog"], - ["android.support.v7.app.MediaRouteControllerDialogFragment", "androidx.mediarouter.app.MediaRouteControllerDialogFragment"], - ["android.support.v7.app.MediaRouteDevicePickerDialog", "androidx.mediarouter.app.MediaRouteDevicePickerDialog"], - ["android.support.v7.app.MediaRouteDialogFactory", "androidx.mediarouter.app.MediaRouteDialogFactory"], - ["android.support.v7.app.MediaRouteDialogHelper", "androidx.mediarouter.app.MediaRouteDialogHelper"], - ["android.support.v7.app.MediaRouteDiscoveryFragment", "androidx.mediarouter.app.MediaRouteDiscoveryFragment"], - ["android.support.v7.app.MediaRouteExpandCollapseButton", "androidx.mediarouter.app.MediaRouteExpandCollapseButton"], - ["android.support.v7.app.MediaRouterThemeHelper", "androidx.mediarouter.app.MediaRouterThemeHelper"], - ["android.support.v7.app.MediaRouteVolumeSlider", "androidx.mediarouter.app.MediaRouteVolumeSlider"], - ["android.support.v7.app.NavItemSelectedListener", "androidx.appcompat.app.NavItemSelectedListener"], - ["android.support.v7.app.OverlayListView", "androidx.mediarouter.app.OverlayListView"], - ["android.support.v7.app.ResourcesFlusher", "androidx.appcompat.app.ResourcesFlusher"], - ["android.support.v7.app.ToolbarActionBar", "androidx.appcompat.app.ToolbarActionBar"], - ["android.support.v7.app.TwilightCalculator", "androidx.appcompat.app.TwilightCalculator"], - ["android.support.v7.app.TwilightManager", "androidx.appcompat.app.TwilightManager"], - ["android.support.v7.app.WindowDecorActionBar", "androidx.appcompat.app.WindowDecorActionBar"], - ["android.support.v7.appcompat.R", "androidx.appcompat.R"], - ["android.support.v7.cardview.R", "androidx.cardview.R"], - ["android.support.v7.content.res.AppCompatResources", "androidx.appcompat.content.res.AppCompatResources"], - ["android.support.v7.graphics.ColorCutQuantizer", "androidx.palette.graphics.ColorCutQuantizer"], - ["android.support.v7.graphics.drawable.AnimatedStateListDrawableCompat", "androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat"], - ["android.support.v7.graphics.drawable.DrawableContainer", "androidx.appcompat.graphics.drawable.DrawableContainer"], - ["android.support.v7.graphics.drawable.DrawableWrapper", "androidx.appcompat.graphics.drawable.DrawableWrapper"], - ["android.support.v7.graphics.drawable.DrawerArrowDrawable", "androidx.appcompat.graphics.drawable.DrawerArrowDrawable"], - ["android.support.v7.graphics.drawable.StateListDrawable", "androidx.appcompat.graphics.drawable.StateListDrawable"], - ["android.support.v7.graphics.Palette", "androidx.palette.graphics.Palette"], - ["android.support.v7.graphics.Target", "androidx.palette.graphics.Target"], - ["android.support.v7.gridlayout.R", "androidx.gridlayout.R"], - ["android.support.v7.internal.widget.PreferenceImageView", "androidx.preference.internal.PreferenceImageView"], - ["android.support.v7.media.MediaControlIntent", "androidx.mediarouter.media.MediaControlIntent"], - ["android.support.v7.media.MediaItemMetadata", "androidx.mediarouter.media.MediaItemMetadata"], - ["android.support.v7.media.MediaItemStatus", "androidx.mediarouter.media.MediaItemStatus"], - ["android.support.v7.media.MediaRouteDescriptor", "androidx.mediarouter.media.MediaRouteDescriptor"], - ["android.support.v7.media.MediaRouteDiscoveryRequest", "androidx.mediarouter.media.MediaRouteDiscoveryRequest"], - ["android.support.v7.media.MediaRouteProvider", "androidx.mediarouter.media.MediaRouteProvider"], - ["android.support.v7.media.MediaRouteProviderDescriptor", "androidx.mediarouter.media.MediaRouteProviderDescriptor"], - ["android.support.v7.media.MediaRouteProviderProtocol", "androidx.mediarouter.media.MediaRouteProviderProtocol"], - ["android.support.v7.media.MediaRouteProviderService", "androidx.mediarouter.media.MediaRouteProviderService"], - ["android.support.v7.media.MediaRouter", "androidx.mediarouter.media.MediaRouter"], - ["android.support.v7.media.MediaRouterApi24", "androidx.mediarouter.media.MediaRouterApi24"], - ["android.support.v7.media.MediaRouterJellybean", "androidx.mediarouter.media.MediaRouterJellybean"], - ["android.support.v7.media.MediaRouterJellybeanMr1", "androidx.mediarouter.media.MediaRouterJellybeanMr1"], - ["android.support.v7.media.MediaRouterJellybeanMr2", "androidx.mediarouter.media.MediaRouterJellybeanMr2"], - ["android.support.v7.media.MediaRouteSelector", "androidx.mediarouter.media.MediaRouteSelector"], - ["android.support.v7.media.MediaSessionStatus", "androidx.mediarouter.media.MediaSessionStatus"], - ["android.support.v7.media.RegisteredMediaRouteProvider", "androidx.mediarouter.media.RegisteredMediaRouteProvider"], - ["android.support.v7.media.RegisteredMediaRouteProviderWatcher", "androidx.mediarouter.media.RegisteredMediaRouteProviderWatcher"], - ["android.support.v7.media.RemoteControlClientCompat", "androidx.mediarouter.media.RemoteControlClientCompat"], - ["android.support.v7.media.RemotePlaybackClient", "androidx.mediarouter.media.RemotePlaybackClient"], - ["android.support.v7.media.RouteMediaPlayerConnector", "androidx.mediarouter.media.RouteMediaPlayerConnector"], - ["android.support.v7.media.SystemMediaRouteProvider", "androidx.mediarouter.media.SystemMediaRouteProvider"], - ["android.support.v7.mediarouter.R", "androidx.mediarouter.R"], - ["android.support.v7.preference.AndroidResources", "androidx.preference.AndroidResources"], - ["android.support.v7.preference.CheckBoxPreference", "androidx.preference.CheckBoxPreference"], - ["android.support.v7.preference.CollapsiblePreferenceGroupController", "androidx.preference.CollapsiblePreferenceGroupController"], - ["android.support.v7.preference.DialogPreference", "androidx.preference.DialogPreference"], - ["android.support.v7.preference.DropDownPreference", "androidx.preference.DropDownPreference"], - ["android.support.v7.preference.EditTextPreference", "androidx.preference.EditTextPreference"], - ["android.support.v7.preference.EditTextPreferenceDialogFragmentCompat", "androidx.preference.EditTextPreferenceDialogFragmentCompat"], - ["android.support.v7.preference.internal.AbstractMultiSelectListPreference", "androidx.preference.internal.AbstractMultiSelectListPreference"], - ["android.support.v7.preference.ListPreference", "androidx.preference.ListPreference"], - ["android.support.v7.preference.ListPreferenceDialogFragmentCompat", "androidx.preference.ListPreferenceDialogFragmentCompat"], - ["android.support.v7.preference.MultiSelectListPreferenceDialogFragmentCompat", "androidx.preference.MultiSelectListPreferenceDialogFragmentCompat"], - ["android.support.v7.preference.Preference", "androidx.preference.Preference"], - ["android.support.v7.preference.PreferenceCategory", "androidx.preference.PreferenceCategory"], - ["android.support.v7.preference.PreferenceDataStore", "androidx.preference.PreferenceDataStore"], - ["android.support.v7.preference.PreferenceDialogFragmentCompat", "androidx.preference.PreferenceDialogFragmentCompat"], - ["android.support.v7.preference.PreferenceFragmentCompat", "androidx.preference.PreferenceFragmentCompat"], - ["android.support.v7.preference.PreferenceGroup", "androidx.preference.PreferenceGroup"], - ["android.support.v7.preference.PreferenceGroupAdapter", "androidx.preference.PreferenceGroupAdapter"], - ["android.support.v7.preference.PreferenceInflater", "androidx.preference.PreferenceInflater"], - ["android.support.v7.preference.PreferenceManager", "androidx.preference.PreferenceManager"], - ["android.support.v7.preference.PreferenceRecyclerViewAccessibilityDelegate", "androidx.preference.PreferenceRecyclerViewAccessibilityDelegate"], - ["android.support.v7.preference.PreferenceScreen", "androidx.preference.PreferenceScreen"], - ["android.support.v7.preference.PreferenceViewHolder", "androidx.preference.PreferenceViewHolder"], - ["android.support.v7.preference.R", "androidx.preference.R"], - ["android.support.v7.preference.SeekBarPreference", "androidx.preference.SeekBarPreference"], - ["android.support.v7.preference.SwitchPreferenceCompat", "androidx.preference.SwitchPreferenceCompat"], - ["android.support.v7.preference.TwoStatePreference", "androidx.preference.TwoStatePreference"], - ["android.support.v7.preference.UnPressableLinearLayout", "androidx.preference.UnPressableLinearLayout"], - ["android.support.v7.recyclerview.extensions.AsyncDifferConfig", "androidx.recyclerview.widget.AsyncDifferConfig"], - ["android.support.v7.recyclerview.extensions.AsyncListDiffer", "androidx.recyclerview.widget.AsyncListDiffer"], - ["android.support.v7.recyclerview.extensions.ListAdapter", "androidx.recyclerview.widget.ListAdapter"], - ["android.support.v7.recyclerview.R", "androidx.recyclerview.R"], - ["android.support.v7.text.AllCapsTransformationMethod", "androidx.appcompat.text.AllCapsTransformationMethod"], - ["android.support.v7.util.AdapterListUpdateCallback", "androidx.recyclerview.widget.AdapterListUpdateCallback"], - ["android.support.v7.util.AsyncListUtil", "androidx.recyclerview.widget.AsyncListUtil"], - ["android.support.v7.util.BatchingListUpdateCallback", "androidx.recyclerview.widget.BatchingListUpdateCallback"], - ["android.support.v7.util.DiffUtil", "androidx.recyclerview.widget.DiffUtil"], - ["android.support.v7.util.ListUpdateCallback", "androidx.recyclerview.widget.ListUpdateCallback"], - ["android.support.v7.util.MessageThreadUtil", "androidx.recyclerview.widget.MessageThreadUtil"], - ["android.support.v7.util.SortedList", "androidx.recyclerview.widget.SortedList"], - ["android.support.v7.util.ThreadUtil", "androidx.recyclerview.widget.ThreadUtil"], - ["android.support.v7.util.TileList", "androidx.recyclerview.widget.TileList"], - ["android.support.v7.view.ActionBarPolicy", "androidx.appcompat.view.ActionBarPolicy"], - ["android.support.v7.view.ActionMode", "androidx.appcompat.view.ActionMode"], - ["android.support.v7.view.CollapsibleActionView", "androidx.appcompat.view.CollapsibleActionView"], - ["android.support.v7.view.ContextThemeWrapper", "androidx.appcompat.view.ContextThemeWrapper"], - ["android.support.v7.view.menu.ActionMenuItem", "androidx.appcompat.view.menu.ActionMenuItem"], - ["android.support.v7.view.menu.ActionMenuItemView", "androidx.appcompat.view.menu.ActionMenuItemView"], - ["android.support.v7.view.menu.BaseMenuPresenter", "androidx.appcompat.view.menu.BaseMenuPresenter"], - ["android.support.v7.view.menu.BaseMenuWrapper", "androidx.appcompat.view.menu.BaseMenuWrapper"], - ["android.support.v7.view.menu.BaseWrapper", "androidx.appcompat.view.menu.BaseWrapper"], - ["android.support.v7.view.menu.CascadingMenuPopup", "androidx.appcompat.view.menu.CascadingMenuPopup"], - ["android.support.v7.view.menu.ExpandedMenuView", "androidx.appcompat.view.menu.ExpandedMenuView"], - ["android.support.v7.view.menu.ListMenuItemView", "androidx.appcompat.view.menu.ListMenuItemView"], - ["android.support.v7.view.menu.ListMenuPresenter", "androidx.appcompat.view.menu.ListMenuPresenter"], - ["android.support.v7.view.menu.MenuAdapter", "androidx.appcompat.view.menu.MenuAdapter"], - ["android.support.v7.view.menu.MenuBuilder", "androidx.appcompat.view.menu.MenuBuilder"], - ["android.support.v7.view.menu.MenuDialogHelper", "androidx.appcompat.view.menu.MenuDialogHelper"], - ["android.support.v7.view.menu.MenuHelper", "androidx.appcompat.view.menu.MenuHelper"], - ["android.support.v7.view.menu.MenuItemImpl", "androidx.appcompat.view.menu.MenuItemImpl"], - ["android.support.v7.view.menu.MenuItemWrapperICS", "androidx.appcompat.view.menu.MenuItemWrapperICS"], - ["android.support.v7.view.menu.MenuItemWrapperJB", "androidx.appcompat.view.menu.MenuItemWrapperJB"], - ["android.support.v7.view.menu.MenuPopup", "androidx.appcompat.view.menu.MenuPopup"], - ["android.support.v7.view.menu.MenuPopupHelper", "androidx.appcompat.view.menu.MenuPopupHelper"], - ["android.support.v7.view.menu.MenuPresenter", "androidx.appcompat.view.menu.MenuPresenter"], - ["android.support.v7.view.menu.MenuView", "androidx.appcompat.view.menu.MenuView"], - ["android.support.v7.view.menu.MenuWrapperFactory", "androidx.appcompat.view.menu.MenuWrapperFactory"], - ["android.support.v7.view.menu.MenuWrapperICS", "androidx.appcompat.view.menu.MenuWrapperICS"], - ["android.support.v7.view.menu.ShowableListMenu", "androidx.appcompat.view.menu.ShowableListMenu"], - ["android.support.v7.view.menu.StandardMenuPopup", "androidx.appcompat.view.menu.StandardMenuPopup"], - ["android.support.v7.view.menu.SubMenuBuilder", "androidx.appcompat.view.menu.SubMenuBuilder"], - ["android.support.v7.view.menu.SubMenuWrapperICS", "androidx.appcompat.view.menu.SubMenuWrapperICS"], - ["android.support.v7.view.StandaloneActionMode", "androidx.appcompat.view.StandaloneActionMode"], - ["android.support.v7.view.SupportActionModeWrapper", "androidx.appcompat.view.SupportActionModeWrapper"], - ["android.support.v7.view.SupportMenuInflater", "androidx.appcompat.view.SupportMenuInflater"], - ["android.support.v7.view.ViewPropertyAnimatorCompatSet", "androidx.appcompat.view.ViewPropertyAnimatorCompatSet"], - ["android.support.v7.view.WindowCallbackWrapper", "androidx.appcompat.view.WindowCallbackWrapper"], - ["android.support.v7.widget.AbsActionBarView", "androidx.appcompat.widget.AbsActionBarView"], - ["android.support.v7.widget.ActionBarBackgroundDrawable", "androidx.appcompat.widget.ActionBarBackgroundDrawable"], - ["android.support.v7.widget.ActionBarContainer", "androidx.appcompat.widget.ActionBarContainer"], - ["android.support.v7.widget.ActionBarContextView", "androidx.appcompat.widget.ActionBarContextView"], - ["android.support.v7.widget.ActionBarOverlayLayout", "androidx.appcompat.widget.ActionBarOverlayLayout"], - ["android.support.v7.widget.ActionMenuPresenter", "androidx.appcompat.widget.ActionMenuPresenter"], - ["android.support.v7.widget.ActionMenuView", "androidx.appcompat.widget.ActionMenuView"], - ["android.support.v7.widget.ActivityChooserModel", "androidx.appcompat.widget.ActivityChooserModel"], - ["android.support.v7.widget.ActivityChooserView", "androidx.appcompat.widget.ActivityChooserView"], - ["android.support.v7.widget.AdapterHelper", "androidx.recyclerview.widget.AdapterHelper"], - ["android.support.v7.widget.AlertDialogLayout", "androidx.appcompat.widget.AlertDialogLayout"], - ["android.support.v7.widget.AppCompatAutoCompleteTextView", "androidx.appcompat.widget.AppCompatAutoCompleteTextView"], - ["android.support.v7.widget.AppCompatBackgroundHelper", "androidx.appcompat.widget.AppCompatBackgroundHelper"], - ["android.support.v7.widget.AppCompatButton", "androidx.appcompat.widget.AppCompatButton"], - ["android.support.v7.widget.AppCompatCheckBox", "androidx.appcompat.widget.AppCompatCheckBox"], - ["android.support.v7.widget.AppCompatCheckedTextView", "androidx.appcompat.widget.AppCompatCheckedTextView"], - ["android.support.v7.widget.AppCompatCompoundButtonHelper", "androidx.appcompat.widget.AppCompatCompoundButtonHelper"], - ["android.support.v7.widget.AppCompatDrawableManager", "androidx.appcompat.widget.AppCompatDrawableManager"], - ["android.support.v7.widget.AppCompatEditText", "androidx.appcompat.widget.AppCompatEditText"], - ["android.support.v7.widget.AppCompatHintHelper", "androidx.appcompat.widget.AppCompatHintHelper"], - ["android.support.v7.widget.AppCompatImageButton", "androidx.appcompat.widget.AppCompatImageButton"], - ["android.support.v7.widget.AppCompatImageHelper", "androidx.appcompat.widget.AppCompatImageHelper"], - ["android.support.v7.widget.AppCompatImageView", "androidx.appcompat.widget.AppCompatImageView"], - ["android.support.v7.widget.AppCompatMultiAutoCompleteTextView", "androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView"], - ["android.support.v7.widget.AppCompatPopupWindow", "androidx.appcompat.widget.AppCompatPopupWindow"], - ["android.support.v7.widget.AppCompatProgressBarHelper", "androidx.appcompat.widget.AppCompatProgressBarHelper"], - ["android.support.v7.widget.AppCompatRadioButton", "androidx.appcompat.widget.AppCompatRadioButton"], - ["android.support.v7.widget.AppCompatRatingBar", "androidx.appcompat.widget.AppCompatRatingBar"], - ["android.support.v7.widget.AppCompatSeekBar", "androidx.appcompat.widget.AppCompatSeekBar"], - ["android.support.v7.widget.AppCompatSeekBarHelper", "androidx.appcompat.widget.AppCompatSeekBarHelper"], - ["android.support.v7.widget.AppCompatSpinner", "androidx.appcompat.widget.AppCompatSpinner"], - ["android.support.v7.widget.AppCompatTextHelper", "androidx.appcompat.widget.AppCompatTextHelper"], - ["android.support.v7.widget.AppCompatTextView", "androidx.appcompat.widget.AppCompatTextView"], - ["android.support.v7.widget.AppCompatTextViewAutoSizeHelper", "androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper"], - ["android.support.v7.widget.ButtonBarLayout", "androidx.appcompat.widget.ButtonBarLayout"], - ["android.support.v7.widget.CardView", "androidx.cardview.widget.CardView"], - ["android.support.v7.widget.CardViewApi17Impl", "androidx.cardview.widget.CardViewApi17Impl"], - ["android.support.v7.widget.CardViewApi21Impl", "androidx.cardview.widget.CardViewApi21Impl"], - ["android.support.v7.widget.CardViewBaseImpl", "androidx.cardview.widget.CardViewBaseImpl"], - ["android.support.v7.widget.CardViewDelegate", "androidx.cardview.widget.CardViewDelegate"], - ["android.support.v7.widget.CardViewImpl", "androidx.cardview.widget.CardViewImpl"], - ["android.support.v7.widget.ChildHelper", "androidx.recyclerview.widget.ChildHelper"], - ["android.support.v7.widget.ContentFrameLayout", "androidx.appcompat.widget.ContentFrameLayout"], - ["android.support.v7.widget.DecorContentParent", "androidx.appcompat.widget.DecorContentParent"], - ["android.support.v7.widget.DecorToolbar", "androidx.appcompat.widget.DecorToolbar"], - ["android.support.v7.widget.DefaultItemAnimator", "androidx.recyclerview.widget.DefaultItemAnimator"], - ["android.support.v7.widget.DialogTitle", "androidx.appcompat.widget.DialogTitle"], - ["android.support.v7.widget.DividerItemDecoration", "androidx.recyclerview.widget.DividerItemDecoration"], - ["android.support.v7.widget.DrawableUtils", "androidx.appcompat.widget.DrawableUtils"], - ["android.support.v7.widget.DropDownListView", "androidx.appcompat.widget.DropDownListView"], - ["android.support.v7.widget.FastScroller", "androidx.recyclerview.widget.FastScroller"], - ["android.support.v7.widget.FitWindowsFrameLayout", "androidx.appcompat.widget.FitWindowsFrameLayout"], - ["android.support.v7.widget.FitWindowsLinearLayout", "androidx.appcompat.widget.FitWindowsLinearLayout"], - ["android.support.v7.widget.FitWindowsViewGroup", "androidx.appcompat.widget.FitWindowsViewGroup"], - ["android.support.v7.widget.ForwardingListener", "androidx.appcompat.widget.ForwardingListener"], - ["android.support.v7.widget.GapWorker", "androidx.recyclerview.widget.GapWorker"], - ["android.support.v7.widget.GridLayout", "androidx.gridlayout.widget.GridLayout"], - ["android.support.v7.widget.GridLayoutManager", "androidx.recyclerview.widget.GridLayoutManager"], - ["android.support.v7.widget.helper.ItemTouchHelper", "androidx.recyclerview.widget.ItemTouchHelper"], - ["android.support.v7.widget.helper.ItemTouchUIUtil", "androidx.recyclerview.widget.ItemTouchUIUtil"], - ["android.support.v7.widget.helper.ItemTouchUIUtilImpl", "androidx.recyclerview.widget.ItemTouchUIUtilImpl"], - ["android.support.v7.widget.LayoutState", "androidx.recyclerview.widget.LayoutState"], - ["android.support.v7.widget.LinearLayoutCompat", "androidx.appcompat.widget.LinearLayoutCompat"], - ["android.support.v7.widget.LinearLayoutManager", "androidx.recyclerview.widget.LinearLayoutManager"], - ["android.support.v7.widget.LinearSmoothScroller", "androidx.recyclerview.widget.LinearSmoothScroller"], - ["android.support.v7.widget.LinearSnapHelper", "androidx.recyclerview.widget.LinearSnapHelper"], - ["android.support.v7.widget.ListPopupWindow", "androidx.appcompat.widget.ListPopupWindow"], - ["android.support.v7.widget.MenuItemHoverListener", "androidx.appcompat.widget.MenuItemHoverListener"], - ["android.support.v7.widget.MenuPopupWindow", "androidx.appcompat.widget.MenuPopupWindow"], - ["android.support.v7.widget.OpReorderer", "androidx.recyclerview.widget.OpReorderer"], - ["android.support.v7.widget.OrientationHelper", "androidx.recyclerview.widget.OrientationHelper"], - ["android.support.v7.widget.PagerSnapHelper", "androidx.recyclerview.widget.PagerSnapHelper"], - ["android.support.v7.widget.PopupMenu", "androidx.appcompat.widget.PopupMenu"], - ["android.support.v7.widget.RecyclerView", "androidx.recyclerview.widget.RecyclerView"], - ["android.support.v7.widget.RecyclerViewAccessibilityDelegate", "androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate"], - ["android.support.v7.widget.ResourcesWrapper", "androidx.appcompat.widget.ResourcesWrapper"], - ["android.support.v7.widget.RoundRectDrawable", "androidx.cardview.widget.RoundRectDrawable"], - ["android.support.v7.widget.RoundRectDrawableWithShadow", "androidx.cardview.widget.RoundRectDrawableWithShadow"], - ["android.support.v7.widget.RtlSpacingHelper", "androidx.appcompat.widget.RtlSpacingHelper"], - ["android.support.v7.widget.ScrollbarHelper", "androidx.recyclerview.widget.ScrollbarHelper"], - ["android.support.v7.widget.ScrollingTabContainerView", "androidx.appcompat.widget.ScrollingTabContainerView"], - ["android.support.v7.widget.SearchView", "androidx.appcompat.widget.SearchView"], - ["android.support.v7.widget.ShareActionProvider", "androidx.appcompat.widget.ShareActionProvider"], - ["android.support.v7.widget.SimpleItemAnimator", "androidx.recyclerview.widget.SimpleItemAnimator"], - ["android.support.v7.widget.SnapHelper", "androidx.recyclerview.widget.SnapHelper"], - ["android.support.v7.widget.StaggeredGridLayoutManager", "androidx.recyclerview.widget.StaggeredGridLayoutManager"], - ["android.support.v7.widget.SuggestionsAdapter", "androidx.appcompat.widget.SuggestionsAdapter"], - ["android.support.v7.widget.SwitchCompat", "androidx.appcompat.widget.SwitchCompat"], - ["android.support.v7.widget.ThemedSpinnerAdapter", "androidx.appcompat.widget.ThemedSpinnerAdapter"], - ["android.support.v7.widget.ThemeUtils", "androidx.appcompat.widget.ThemeUtils"], - ["android.support.v7.widget.TintContextWrapper", "androidx.appcompat.widget.TintContextWrapper"], - ["android.support.v7.widget.TintInfo", "androidx.appcompat.widget.TintInfo"], - ["android.support.v7.widget.TintResources", "androidx.appcompat.widget.TintResources"], - ["android.support.v7.widget.TintTypedArray", "androidx.appcompat.widget.TintTypedArray"], - ["android.support.v7.widget.Toolbar", "androidx.appcompat.widget.Toolbar"], - ["android.support.v7.widget.ToolbarWidgetWrapper", "androidx.appcompat.widget.ToolbarWidgetWrapper"], - ["android.support.v7.widget.TooltipCompat", "androidx.appcompat.widget.TooltipCompat"], - ["android.support.v7.widget.TooltipCompatHandler", "androidx.appcompat.widget.TooltipCompatHandler"], - ["android.support.v7.widget.TooltipPopup", "androidx.appcompat.widget.TooltipPopup"], - ["android.support.v7.widget.util.SortedListAdapterCallback", "androidx.recyclerview.widget.SortedListAdapterCallback"], - ["android.support.v7.widget.VectorEnabledTintResources", "androidx.appcompat.widget.VectorEnabledTintResources"], - ["android.support.v7.widget.ViewBoundsCheck", "androidx.recyclerview.widget.ViewBoundsCheck"], - ["android.support.v7.widget.ViewInfoStore", "androidx.recyclerview.widget.ViewInfoStore"], - ["android.support.v7.widget.ViewStubCompat", "androidx.appcompat.widget.ViewStubCompat"], - ["android.support.v7.widget.ViewUtils", "androidx.appcompat.widget.ViewUtils"], - ["android.support.v7.widget.WithHint", "androidx.appcompat.widget.WithHint"], - ["android.support.wear.activity.ConfirmationActivity", "androidx.wear.activity.ConfirmationActivity"], - ["android.support.wear.ambient.AmbientDelegate", "androidx.wear.ambient.AmbientDelegate"], - ["android.support.wear.ambient.AmbientMode", "androidx.wear.ambient.AmbientMode"], - ["android.support.wear.ambient.AmbientModeSupport", "androidx.wear.ambient.AmbientModeSupport"], - ["android.support.wear.ambient.SharedLibraryVersion", "androidx.wear.ambient.SharedLibraryVersion"], - ["android.support.wear.ambient.WearableControllerProvider", "androidx.wear.ambient.WearableControllerProvider"], - ["android.support.wear.internal.widget.drawer.MultiPagePresenter", "androidx.wear.internal.widget.drawer.MultiPagePresenter"], - ["android.support.wear.internal.widget.drawer.MultiPageUi", "androidx.wear.internal.widget.drawer.MultiPageUi"], - ["android.support.wear.internal.widget.drawer.SinglePagePresenter", "androidx.wear.internal.widget.drawer.SinglePagePresenter"], - ["android.support.wear.internal.widget.drawer.SinglePageUi", "androidx.wear.internal.widget.drawer.SinglePageUi"], - ["android.support.wear.internal.widget.drawer.WearableNavigationDrawerPresenter", "androidx.wear.internal.widget.drawer.WearableNavigationDrawerPresenter"], - ["android.support.wear.internal.widget.ResourcesUtil", "androidx.wear.internal.widget.ResourcesUtil"], - ["android.support.wear.R", "androidx.wear.R"], - ["android.support.wear.utils.MetadataConstants", "androidx.wear.utils.MetadataConstants"], - ["android.support.wear.widget.BezierSCurveInterpolator", "androidx.wear.widget.BezierSCurveInterpolator"], - ["android.support.wear.widget.BoxInsetLayout", "androidx.wear.widget.BoxInsetLayout"], - ["android.support.wear.widget.CircledImageView", "androidx.wear.widget.CircledImageView"], - ["android.support.wear.widget.CircularProgressLayout", "androidx.wear.widget.CircularProgressLayout"], - ["android.support.wear.widget.CircularProgressLayoutController", "androidx.wear.widget.CircularProgressLayoutController"], - ["android.support.wear.widget.ConfirmationOverlay", "androidx.wear.widget.ConfirmationOverlay"], - ["android.support.wear.widget.CurvingLayoutCallback", "androidx.wear.widget.CurvingLayoutCallback"], - ["android.support.wear.widget.drawer.AbsListViewFlingWatcher", "androidx.wear.widget.drawer.AbsListViewFlingWatcher"], - ["android.support.wear.widget.drawer.FlingWatcherFactory", "androidx.wear.widget.drawer.FlingWatcherFactory"], - ["android.support.wear.widget.drawer.NestedScrollViewFlingWatcher", "androidx.wear.widget.drawer.NestedScrollViewFlingWatcher"], - ["android.support.wear.widget.drawer.PageIndicatorView", "androidx.wear.widget.drawer.PageIndicatorView"], - ["android.support.wear.widget.drawer.RecyclerViewFlingWatcher", "androidx.wear.widget.drawer.RecyclerViewFlingWatcher"], - ["android.support.wear.widget.drawer.ScrollViewFlingWatcher", "androidx.wear.widget.drawer.ScrollViewFlingWatcher"], - ["android.support.wear.widget.drawer.WearableActionDrawerMenu", "androidx.wear.widget.drawer.WearableActionDrawerMenu"], - ["android.support.wear.widget.drawer.WearableActionDrawerView", "androidx.wear.widget.drawer.WearableActionDrawerView"], - ["android.support.wear.widget.drawer.WearableDrawerController", "androidx.wear.widget.drawer.WearableDrawerController"], - ["android.support.wear.widget.drawer.WearableDrawerLayout", "androidx.wear.widget.drawer.WearableDrawerLayout"], - ["android.support.wear.widget.drawer.WearableDrawerView", "androidx.wear.widget.drawer.WearableDrawerView"], - ["android.support.wear.widget.drawer.WearableNavigationDrawerView", "androidx.wear.widget.drawer.WearableNavigationDrawerView"], - ["android.support.wear.widget.ProgressDrawable", "androidx.wear.widget.ProgressDrawable"], - ["android.support.wear.widget.ResourcesUtil", "androidx.wear.widget.ResourcesUtil"], - ["android.support.wear.widget.RoundedDrawable", "androidx.wear.widget.RoundedDrawable"], - ["android.support.wear.widget.ScrollManager", "androidx.wear.widget.ScrollManager"], - ["android.support.wear.widget.SimpleAnimatorListener", "androidx.wear.widget.SimpleAnimatorListener"], - ["android.support.wear.widget.SwipeDismissFrameLayout", "androidx.wear.widget.SwipeDismissFrameLayout"], - ["android.support.wear.widget.SwipeDismissLayout", "androidx.wear.widget.SwipeDismissLayout"], - ["android.support.wear.widget.WearableLinearLayoutManager", "androidx.wear.widget.WearableLinearLayoutManager"], - ["android.support.wear.widget.WearableRecyclerView", "androidx.wear.widget.WearableRecyclerView"], ["com.google.android.gms.maps.model", "com.google.android.libraries.maps.model"], ["com.google.android.gms.maps", "com.google.android.libraries.maps"] ] @@ -1952,124 +16,7 @@ def getConvertListe(useAndroidX) { return list } -def getDependencyCvtList(useAndroidX) { - def list = [ - ["androidx.arch.core:core-common:2.0.0-rc01", "androidx.arch.core:core-common:2.0.0-rc01"], - ["androidx.arch.core:core:2.0.0-rc01", "androidx.arch.core:core:2.0.0-rc01"], - ["androidx.arch.core:core:2.0.0-rc01-testing", "androidx.arch.core:core:2.0.0-rc01-testing"], - ["androidx.arch.core:core-runtime:2.0.0-rc01", "androidx.arch.core:core-runtime:2.0.0-rc01"], - ["androidx.lifecycle:lifecycle-common:2.0.0-rc01", "androidx.lifecycle:lifecycle-common:2.0.0-rc01"], - ["androidx.lifecycle:lifecycle-common:2.0.0-rc01-java8", "androidx.lifecycle:lifecycle-common:2.0.0-rc01-java8"], - ["androidx.lifecycle:lifecycle-compiler:2.0.0-rc01", "androidx.lifecycle:lifecycle-compiler:2.0.0-rc01"], - ["androidx.lifecycle:lifecycle-extensions:2.0.0-rc01", "androidx.lifecycle:lifecycle-extensions:2.0.0-rc01"], - ["androidx.lifecycle:lifecycle-livedata:2.0.0-rc01", "androidx.lifecycle:lifecycle-livedata:2.0.0-rc01"], - ["androidx.lifecycle:lifecycle-livedata:2.0.0-rc01-core", "androidx.lifecycle:lifecycle-livedata:2.0.0-rc01-core"], - ["androidx.lifecycle:lifecycle-reactivestreams:2.0.0-rc01", "androidx.lifecycle:lifecycle-reactivestreams:2.0.0-rc01"], - ["androidx.lifecycle:lifecycle-runtime:2.0.0-rc01", "androidx.lifecycle:lifecycle-runtime:2.0.0-rc01"], - ["androidx.lifecycle:lifecycle-viewmodel:2.0.0-rc01", "androidx.lifecycle:lifecycle-viewmodel:2.0.0-rc01"], - ["androidx.paging:paging-common:2.0.0-rc01", "androidx.paging:paging-common:2.0.0-rc01"], - ["androidx.paging:paging-runtime:2.0.0-rc01", "androidx.paging:paging-runtime:2.0.0-rc01"], - ["androidx.paging:paging-rxjava2:2.0.0-rc01", "androidx.paging:paging-rxjava2:2.0.0-rc01"], - ["androidx.room:room-common:2.0.0-rc01", "androidx.room:room-common:2.0.0-rc01"], - ["androidx.room:room-compiler:2.0.0-rc01", "androidx.room:room-compiler:2.0.0-rc01"], - ["androidx.room:room-guava:2.0.0-rc01", "androidx.room:room-guava:2.0.0-rc01"], - ["androidx.room:room-migration:2.0.0-rc01", "androidx.room:room-migration:2.0.0-rc01"], - ["androidx.room:room-runtime:2.0.0-rc01", "androidx.room:room-runtime:2.0.0-rc01"], - ["androidx.room:room-rxjava2:2.0.0-rc01", "androidx.room:room-rxjava2:2.0.0-rc01"], - ["androidx.room:room-testing:2.0.0-rc01", "androidx.room:room-testing:2.0.0-rc01"], - ["androidx.sqlite:sqlite:2.0.0-rc01", "androidx.sqlite:sqlite:2.0.0-rc01"], - ["androidx.sqlite:sqlite:2.0.0-rc01-framework", "androidx.sqlite:sqlite:2.0.0-rc01-framework"], - ["androidx.constraintlayout:constraintlayout:1.1.2", "androidx.constraintlayout:constraintlayout:1.1.2"], - ["androidx.constraintlayout:constraintlayout:1.1.2-solver", "androidx.constraintlayout:constraintlayout:1.1.2-solver"], - ["androidx.test.espresso.idling:idling-concurrent:3.1.0", "androidx.test.espresso.idling:idling-concurrent:3.1.0"], - ["androidx.test.espresso.idling:idling-net:3.1.0", "androidx.test.espresso.idling:idling-net:3.1.0"], - ["androidx.test.espresso:espresso-accessibility:3.1.0", "androidx.test.espresso:espresso-accessibility:3.1.0"], - ["androidx.test.espresso:espresso-contrib:3.1.0", "androidx.test.espresso:espresso-contrib:3.1.0"], - ["androidx.test.espresso:espresso-core:3.1.0", "androidx.test.espresso:espresso-core:3.1.0"], - ["androidx.test.espresso:espresso-idling-resource:3.1.0", "androidx.test.espresso:espresso-idling-resource:3.1.0"], - ["androidx.test.espresso:espresso-intents:3.1.0", "androidx.test.espresso:espresso-intents:3.1.0"], - ["androidx.test.espresso:espresso-remote:3.1.0", "androidx.test.espresso:espresso-remote:3.1.0"], - ["androidx.test.espresso:espresso-web:3.1.0", "androidx.test.espresso:espresso-web:3.1.0"], - ["androidx.test.jank:janktesthelper:1.0.1", "androidx.test.jank:janktesthelper:1.0.1"], - ["androidx.test:test-services:1.1.0", "androidx.test:test-services:1.1.0"], - ["androidx.test.uiautomator:uiautomator:2.2.0", "androidx.test.uiautomator:uiautomator:2.2.0"], - ["androidx.test:monitor:1.1.0", "androidx.test:monitor:1.1.0"], - ["androidx.test:orchestrator:1.1.0", "androidx.test:orchestrator:1.1.0"], - ["androidx.test:rules:1.1.0", "androidx.test:rules:1.1.0"], - ["androidx.test:runner:1.1.0", "androidx.test:runner:1.1.0"], - ["androidx.vectordrawable:vectordrawable-animated:1.0.0", "androidx.vectordrawable:vectordrawable-animated:1.0.0"], - ["androidx.appcompat:appcompat:1.0.0", "androidx.appcompat:appcompat:1.0.0"], - ["androidx.asynclayoutinflater:asynclayoutinflater:1.0.0", "androidx.asynclayoutinflater:asynclayoutinflater:1.0.0"], - ["androidx.car:car:1.0.0-alpha5", "androidx.car:car:1.0.0-alpha5"], - ["androidx.car:car:1.0.0-alpha5dview-v7", "androidx.car:car:1.0.0-alpha5dview-v7"], - ["androidx.collection:collection:1.0.0", "androidx.collection:collection:1.0.0"], - ["androidx.coordinatorlayout:coordinatorlayout:1.0.0", "androidx.coordinatorlayout:coordinatorlayout:1.0.0"], - ["androidx.cursoradapter:cursoradapter:1.0.0", "androidx.cursoradapter:cursoradapter:1.0.0"], - ["androidx.browser:browser:1.0.0", "androidx.browser:browser:1.0.0"], - ["androidx.customview:customview:1.0.0", "androidx.customview:customview:1.0.0"], - ["com.google.android.material:material:1.0.0-rc01", "com.google.android.material:material:1.0.0-rc01"], - ["androidx.documentfile:documentfile:1.0.0", "androidx.documentfile:documentfile:1.0.0"], - ["androidx.drawerlayout:drawerlayout:1.0.0", "androidx.drawerlayout:drawerlayout:1.0.0"], - ["androidx.exifinterface:exifinterface:1.0.0", "androidx.exifinterface:exifinterface:1.0.0"], - ["androidx.gridlayout:gridlayout:1.0.0", "androidx.gridlayout:gridlayout:1.0.0"], - ["androidx.heifwriter:heifwriter:1.0.0", "androidx.heifwriter:heifwriter:1.0.0"], - ["androidx.interpolator:interpolator:1.0.0", "androidx.interpolator:interpolator:1.0.0"], - ["androidx.leanback:leanback:1.0.0", "androidx.leanback:leanback:1.0.0"], - ["androidx.loader:loader:1.0.0", "androidx.loader:loader:1.0.0"], - ["androidx.localbroadcastmanager:localbroadcastmanager:1.0.0", "androidx.localbroadcastmanager:localbroadcastmanager:1.0.0"], - ["androidx.media2:media2:1.0.0-alpha03", "androidx.media2:media2:1.0.0-alpha03"], - ["androidx.media2:media2:1.0.0-alpha03-exoplayer", "androidx.media2:media2:1.0.0-alpha03-exoplayer"], - ["androidx.mediarouter:mediarouter:1.0.0", "androidx.mediarouter:mediarouter:1.0.0"], - ["androidx.multidex:multidex:2.0.0", "androidx.multidex:multidex:2.0.0"], - ["androidx.multidex:multidex:2.0.0-instrumentation", "androidx.multidex:multidex:2.0.0-instrumentation"], - ["androidx.palette:palette:1.0.0", "androidx.palette:palette:1.0.0"], - ["androidx.percentlayout:percentlayout:1.0.0", "androidx.percentlayout:percentlayout:1.0.0"], - ["androidx.leanback:leanback-preference:1.0.0", "androidx.leanback:leanback-preference:1.0.0"], - ["androidx.legacy:legacy-preference-v14:1.0.0", "androidx.legacy:legacy-preference-v14:1.0.0"], - ["androidx.preference:preference:1.0.0", "androidx.preference:preference:1.0.0"], - ["androidx.print:print:1.0.0", "androidx.print:print:1.0.0"], - ["androidx.recommendation:recommendation:1.0.0", "androidx.recommendation:recommendation:1.0.0"], - ["androidx.recyclerview:recyclerview-selection:1.0.0", "androidx.recyclerview:recyclerview-selection:1.0.0"], - ["androidx.recyclerview:recyclerview:1.0.0", "androidx.recyclerview:recyclerview:1.0.0"], - ["androidx.slice:slice-builders:1.0.0", "androidx.slice:slice-builders:1.0.0"], - ["androidx.slice:slice-core:1.0.0", "androidx.slice:slice-core:1.0.0"], - ["androidx.slice:slice-view:1.0.0", "androidx.slice:slice-view:1.0.0"], - ["androidx.slidingpanelayout:slidingpanelayout:1.0.0", "androidx.slidingpanelayout:slidingpanelayout:1.0.0"], - ["androidx.annotation:annotation:1.0.0", "androidx.annotation:annotation:1.0.0"], - ["androidx.core:core:1.0.0", "androidx.core:core:1.0.0"], - ["androidx.contentpager:contentpager:1.0.0", "androidx.contentpager:contentpager:1.0.0"], - ["androidx.legacy:legacy-support-core-ui:1.0.0", "androidx.legacy:legacy-support-core-ui:1.0.0"], - ["androidx.legacy:legacy-support-core-utils:1.0.0", "androidx.legacy:legacy-support-core-utils:1.0.0"], - ["androidx.dynamicanimation:dynamicanimation:1.0.0", "androidx.dynamicanimation:dynamicanimation:1.0.0"], - ["androidx.emoji:emoji:1.0.0", "androidx.emoji:emoji:1.0.0"], - ["androidx.emoji:emoji:1.0.0-appcompat", "androidx.emoji:emoji:1.0.0-appcompat"], - ["androidx.emoji:emoji:1.0.0-bundled", "androidx.emoji:emoji:1.0.0-bundled"], - ["androidx.fragment:fragment:1.0.0", "androidx.fragment:fragment:1.0.0"], - ["androidx.media:media:1.0.0", "androidx.media:media:1.0.0"], - ["androidx.tvprovider:tvprovider:1.0.0", "androidx.tvprovider:tvprovider:1.0.0"], - ["androidx.legacy:legacy-support-v13:1.0.0", "androidx.legacy:legacy-support-v13:1.0.0"], - ["androidx.legacy:legacy-support-v4:1.0.0", "androidx.legacy:legacy-support-v4:1.0.0"], - ["androidx.vectordrawable:vectordrawable:1.0.0", "androidx.vectordrawable:vectordrawable:1.0.0"], - ["androidx.swiperefreshlayout:swiperefreshlayout:1.0.0", "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"], - ["androidx.textclassifier:textclassifier:1.0.0", "androidx.textclassifier:textclassifier:1.0.0"], - ["androidx.transition:transition:1.0.0", "androidx.transition:transition:1.0.0"], - ["androidx.versionedparcelable:versionedparcelable:1.0.0", "androidx.versionedparcelable:versionedparcelable:1.0.0"], - ["androidx.viewpager:viewpager:1.0.0", "androidx.viewpager:viewpager:1.0.0"], - ["androidx.wear:wear:1.0.0", "androidx.wear:wear:1.0.0"], - ["androidx.webkit:webkit:1.0.0", "androidx.webkit:webkit:1.0.0"] - ] - if (!useAndroidX) { - def tmp; - def listN = list.size() - for (int i = 0; i < listN; i++) { - tmp = list[i][0] - list[i][0] = list[i][1] - list[i][1] = tmp - } - } - return list -} def searchFileInParents(target) { def searchPath = target for (int i = 0; i < 8; i++) { @@ -2083,27 +30,6 @@ def searchFileInParents(target) { } return null; } -def rewriteGradlePropertiesFile() { - def gradlePropertiesFilePath = searchFileInParents("gradle.properties") - def gradlePropertiesFile = file(gradlePropertiesFilePath) - def input = new Scanner(gradlePropertiesFile) - def buffer = new StringBuilder(); - while (input.hasNextLine()) { - def line = input.nextLine(); - if (line.contains("android.useAndroidX") || line.contains("android.enableJetifier")) { - continue; - } - buffer.append(line); - buffer.append("\n"); - } - input.close() - - buffer.append("android.useAndroidX=true\n") - buffer.append("android.enableJetifier=true\n") - def output = new FileWriter(gradlePropertiesFile) - output.write(buffer.toString()) - output.close() -} def replacePackages(file, cvtList, useAndroidX) { def filePath = file.toPath() @@ -2150,9 +76,7 @@ def replaceFiles(matchingPattern, cvtList, useAndroidX) { def matchedFile = project.files(project.getProjectDir().getParentFile().toPath()).getAsFileTree().matching(patternSet) matchedFile.each { file -> - if (!java.nio.file.Files.isReadable(file.toPath()) || - file.toPath().toString().contains("-pgm-custom.gradle") || - file.toPath().toString().contains("/.idea/")) { + if (!java.nio.file.Files.isReadable(file.toPath())) { return } @@ -2229,17 +153,12 @@ android { 'true' == project.ext.get('android.useAndroidX') && 'true' == project.ext.get('android.enableJetifier') - //--------------------------- - // Replace all source code - //--------------------------- + //----------------------------------------------- + // Replace the source code of this plugin + //----------------------------------------------- def cvtList = getConvertListe(useAndroidX) - replaceFiles("**/AndroidManifest.xml", cvtList, useAndroidX) - replaceFiles("**/res/*.xml", cvtList, useAndroidX) - replaceFiles("**/*.java", cvtList, useAndroidX) - - def dependencyCvtList = getDependencyCvtList(useAndroidX) - replaceFiles("**/*.gradle", dependencyCvtList, useAndroidX) + replaceFiles("**/plugin/google/maps/*.java", cvtList, useAndroidX) if (useAndroidX) { //---------- From a9088cfb860190d21a8e502a03c0ce044c26223a Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Mon, 1 Jun 2020 10:13:50 -0700 Subject: [PATCH 42/50] (Android) bug fix: Possible issue with map hit testing https://github.com/mapsplugin/cordova-plugin-googlemaps/issues/2786 --- package.json | 2 +- plugin.xml | 2 +- src/android/plugin/google/maps/PluginMap.java | 14 ++++++++------ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index d60377031..74e254bc9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-googlemaps", - "version": "2.8.0-20200530-1546", + "version": "2.8.0-20200601-1013", "description": "Google Maps native SDK for Android and iOS, and Google Maps JavaScript API v3 for browser.", "cordova": { "id": "cordova-plugin-googlemaps", diff --git a/plugin.xml b/plugin.xml index 07780cc94..e8b1e5446 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - + cordova-plugin-googlemaps diff --git a/src/android/plugin/google/maps/PluginMap.java b/src/android/plugin/google/maps/PluginMap.java index ceb25e7fa..574bca460 100644 --- a/src/android/plugin/google/maps/PluginMap.java +++ b/src/android/plugin/google/maps/PluginMap.java @@ -3129,17 +3129,19 @@ public void run() { hitArea.x = (int)(polyline.getWidth() * density); hitArea.y = hitArea.x; double threshold = calculateDistance( - projection.fromScreenLocation(origin), - projection.fromScreenLocation(hitArea)); - touchPoint = isPointOnTheGeodesicLine(points, point, threshold); - if (touchPoint != null) { + projection.fromScreenLocation(origin), + projection.fromScreenLocation(hitArea)); + LatLng polyTouchPoint = isPointOnTheGeodesicLine(points, point, threshold); + if (polyTouchPoint != null) { + touchPoint = polyTouchPoint; hitOverlay = polyline; maxZIndex = zIndex; continue; } } else { - touchPoint = isPointOnTheLine(points, point); - if (touchPoint != null) { + LatLng polyTouchPoint = isPointOnTheLine(points, point); + if (polyTouchPoint != null) { + touchPoint = polyTouchPoint; hitOverlay = polyline; maxZIndex = zIndex; continue; From 2616d16b0e09e0c02d9a47099b0d82467a65ca4d Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Wed, 1 Jul 2020 22:04:36 -0700 Subject: [PATCH 43/50] Fix: __pluginDomID causes error --- package.json | 2 +- plugin.xml | 2 +- www/js_CordovaGoogleMaps-for-android_ios.js | 29 +++++++++------------ 3 files changed, 14 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index 74e254bc9..e8b03c0ef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-googlemaps", - "version": "2.8.0-20200601-1013", + "version": "2.8.0-20200701-2202", "description": "Google Maps native SDK for Android and iOS, and Google Maps JavaScript API v3 for browser.", "cordova": { "id": "cordova-plugin-googlemaps", diff --git a/plugin.xml b/plugin.xml index e8b1e5446..d7a51ef6f 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - + cordova-plugin-googlemaps diff --git a/www/js_CordovaGoogleMaps-for-android_ios.js b/www/js_CordovaGoogleMaps-for-android_ios.js index e839d9e11..cd91e08e3 100644 --- a/www/js_CordovaGoogleMaps-for-android_ios.js +++ b/www/js_CordovaGoogleMaps-for-android_ios.js @@ -1,4 +1,5 @@ + if (!window.Promise) { window.Promise = require('./Promise'); } @@ -123,9 +124,9 @@ function CordovaGoogleMaps(execCmd) { self.on('isSuspended_changed', function(oldValue, newValue) { if (newValue) { - cordova_exec(null, null, 'CordovaGoogleMaps', 'pause', []); + cordova_exec(null, function(){}, 'CordovaGoogleMaps', 'pause', []); } else { - cordova_exec(null, null, 'CordovaGoogleMaps', 'resume', []); + cordova_exec(null, function(){}, 'CordovaGoogleMaps', 'resume', []); } }); } @@ -526,10 +527,7 @@ CordovaGoogleMaps.prototype.removeDomTree = function(node) { if (isRemoved) { - Object.defineProperty(child, '__pluginDomId', { - enumerable: false, - value: undefined - }); + child.__pluginDomId = undefined; // If map div, remove the map also. if (child.__pluginMapId) { @@ -626,7 +624,7 @@ CordovaGoogleMaps.prototype.followMapDivPositionOnly = function(opts) { // If changed, move the map views. if (changed || opts.force) { - cordova_exec(null, null, 'CordovaGoogleMaps', 'updateMapPositionOnly', [mapRects]); + cordova_exec(null, function(){}, 'CordovaGoogleMaps', 'updateMapPositionOnly', [mapRects]); return changed; } return false; @@ -733,6 +731,7 @@ CordovaGoogleMaps.prototype.getMap = function(div, mapOptions) { if (common.isDom(oldDiv)) { Object.defineProperty(oldDiv, '__pluginMapId', { enumerable: false, + writable: true, value: undefined }); ele = oldDiv; @@ -745,10 +744,7 @@ CordovaGoogleMaps.prototype.getMap = function(div, mapOptions) { delete self.domPositions[elemId]; } } - Object.defineProperty(ele, '__pluginDomId', { - enumerable: false, - value: undefined - }); + ele.__pluginDomId = undefined; if (ele.classList) { ele.classList.remove('_gmaps_cdv_'); } else if (ele.className) { @@ -890,10 +886,7 @@ CordovaGoogleMaps.prototype._remove = function(mapId) { } } if (div) { - Object.defineProperty(div, '__pluginMapId', { - enumerable: false, - value: undefined - }); + div.__pluginMapId = undefined; } var keys = Object.keys(self.domPositions); @@ -949,7 +942,8 @@ function postPanoramaInit(panorama, div, options) { // before creating the map view. Object.defineProperty(div, '__pluginMapId', { enumerable: false, - value: mapId + value: mapId, + writable: true }); var elemId = common.getPluginDomId(div); @@ -1025,7 +1019,8 @@ function postMapInit(map, div, options) { // before creating the map view. Object.defineProperty(div, '__pluginMapId', { enumerable: false, - value: mapId + value: mapId, + writable: true }); var elemId = common.getPluginDomId(div); From f02aabf891c36be2cb7e6c44201a8fe97b72dd70 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Wed, 8 Jul 2020 19:13:16 -0700 Subject: [PATCH 44/50] Use "Maps SDK for Android v.3.1.0 BETA" --- src/android/frameworks/pgm-custom.gradle | 61 +++---------------- .../plugin/google/maps/PluginMarker.java | 4 +- 2 files changed, 11 insertions(+), 54 deletions(-) diff --git a/src/android/frameworks/pgm-custom.gradle b/src/android/frameworks/pgm-custom.gradle index fe980ec59..ac17586ea 100644 --- a/src/android/frameworks/pgm-custom.gradle +++ b/src/android/frameworks/pgm-custom.gradle @@ -85,7 +85,6 @@ def replaceFiles(matchingPattern, cvtList, useAndroidX) { } android { - // #1. Find (project)/config.xml file, // because ionic capacitor does not copy nodes def configXmlFile = searchFileInParents("config.xml") @@ -111,12 +110,6 @@ android { Properties props = new Properties() def isKeyFound = 0 - props.setProperty("GOOGLE_MAPS_ANDROIDX_CORE_VERSION", "1.3.0"); - props.setProperty("GOOGLE_MAPS_ANDROID_SDK", "maps-sdk-3.0.0-beta"); - props.setProperty("GOOGLE_MAPS_APP_COMPAT_VERSION", "1.1.0"); - props.setProperty("GOOGLE_MAPS_PLAY_SERVICES_BASEMENT_VERSION", "17.2.1"); - props.setProperty("GOOGLE_MAPS_PLAY_SERVICES_BASE_VERSION", "17.2.1"); - props.setProperty("GOOGLE_MAPS_PLAY_SERVICES_GCM_VERSION", "17.0.0"); props.setProperty("GOOGLE_MAPS_PLAY_SERVICES_LOCATION_VERSION", "16.0.0"); props.setProperty("GOOGLE_MAPS_ANDROID_SUPPORT_V4_VERSION", "27.1.1"); props.setProperty("GOOGLE_MAPS_PLAY_SERVICES_VERSION", "16.1.0"); @@ -130,14 +123,9 @@ android { isKeyFound = 1 props.setProperty(name, value) } - if (name == "GOOGLE_MAPS_ANDROIDX_CORE_VERSION" || - name == "GOOGLE_MAPS_GOOGLE_MAPS_ANDROID_SDK" || - name == "GOOGLE_MAPS_APP_COMPAT_VERSION" || - name == "GOOGLE_MAPS_PLAY_SERVICES_BASEMENT_VERSION" || - name == "GOOGLE_MAPS_PLAY_SERVICES_BASE_VERSION" || - name == "GOOGLE_MAPS_PLAY_SERVICES_GCM_VERSION" || - name == "GOOGLE_MAPS_PLAY_SERVICES_LOCATION_VERSION"|| - name == "GOOGLE_MAPS_PLAY_SERVICES_VERSION") { + if (name == "GOOGLE_MAPS_PLAY_SERVICES_LOCATION_VERSION"|| + name == "GOOGLE_MAPS_PLAY_SERVICES_VERSION" || + name == "GOOGLE_MAPS_ANDROID_SUPPORT_V4_VERSION") { props.setProperty(name, value) } } @@ -164,47 +152,16 @@ android { //---------- // maps SDK //---------- - def libsDirPath = System.getProperty("user.dir") - def libsDir = new File("${libsDirPath}/libs/") - if (!libsDir.exists()) { - libsDir.mkdirs() - } - def mapsSDK = props.getProperty("GOOGLE_MAPS_ANDROID_SDK") - def f = new File("${libsDir.absolutePath}/${mapsSDK}.aar") - println("---->GOOGLE_MAPS_ANDROID_SDK = " + f.absolutePath); - if (!f.exists()) { - new URL("https://dl.google.com/dl/geosdk/${mapsSDK}.aar").withInputStream { i -> - f.withOutputStream { - it << i - } - } + dependencies { + implementation 'com.google.android.libraries.maps:maps:3.1.0-beta' + implementation 'com.android.support:multidex:1.0.3' } - //------------- - // dependencies - //------------- - def ANDROIDX_CORE_VERSION = props.getProperty("GOOGLE_MAPS_ANDROIDX_CORE_VERSION") - def APP_COMPAT_VERSION = props.getProperty("GOOGLE_MAPS_APP_COMPAT_VERSION") - def PLAY_SERVICES_BASEMENT_VERSION = props.getProperty("GOOGLE_MAPS_PLAY_SERVICES_BASEMENT_VERSION") - def PLAY_SERVICES_BASE_VERSION = props.getProperty("GOOGLE_MAPS_PLAY_SERVICES_BASE_VERSION") - def PLAY_SERVICES_GCM_VERSION = props.getProperty("GOOGLE_MAPS_PLAY_SERVICES_GCM_VERSION") - def PLAY_SERVICES_LOCATION_VERSION = props.getProperty("GOOGLE_MAPS_PLAY_SERVICES_LOCATION_VERSION") - - println("---->GOOGLE_MAPS_ANDROIDX_CORE_VERSION = ${ANDROIDX_CORE_VERSION}") - println("---->GOOGLE_MAPS_APP_COMPAT_VERSION = ${APP_COMPAT_VERSION}") - println("---->GOOGLE_MAPS_PLAY_SERVICES_BASEMENT_VERSION = ${PLAY_SERVICES_BASEMENT_VERSION}") - println("---->GOOGLE_MAPS_PLAY_SERVICES_BASE_VERSION = ${PLAY_SERVICES_BASE_VERSION}") - println("---->GOOGLE_MAPS_PLAY_SERVICES_GCM_VERSION = ${PLAY_SERVICES_GCM_VERSION}") - println("---->GOOGLE_MAPS_PLAY_SERVICES_LOCATION_VERSION = ${PLAY_SERVICES_LOCATION_VERSION}") - dependencies { - implementation name: mapsSDK, ext: 'aar' - implementation "androidx.appcompat:appcompat:${APP_COMPAT_VERSION}" - implementation "com.google.android.gms:play-services-basement:${PLAY_SERVICES_BASEMENT_VERSION}" - implementation "com.google.android.gms:play-services-base:${PLAY_SERVICES_BASE_VERSION}" - implementation "com.google.android.gms:play-services-gcm:${PLAY_SERVICES_GCM_VERSION}" - implementation "com.google.android.gms:play-services-location:${PLAY_SERVICES_LOCATION_VERSION}" + defaultConfig { + multiDexEnabled true } + } else { def PLAY_SERVICES_VERSION = props.getProperty("GOOGLE_MAPS_PLAY_SERVICES_VERSION") def PLAY_SERVICES_LOCATION_VERSION = props.getProperty("GOOGLE_MAPS_PLAY_SERVICES_LOCATION_VERSION") diff --git a/src/android/plugin/google/maps/PluginMarker.java b/src/android/plugin/google/maps/PluginMarker.java index cb9338f15..d37050c1a 100644 --- a/src/android/plugin/google/maps/PluginMarker.java +++ b/src/android/plugin/google/maps/PluginMarker.java @@ -1150,8 +1150,8 @@ public void onPostExecute(AsyncLoadImage.AsyncLoadImageResult result) { self.pluginMap.objects.remove(markerImgSizeTag); self.pluginMap.objects.put(markerImgSizeTag, imageSize); - result.image.recycle(); - result.image = null; +// result.image.recycle(); // cause crash on maps-sdk-3.1.0-beta +// result.image = null; // The `anchor` of the `icon` property if (iconProperty.containsKey("anchor")) { From 41f1be6c0417b71974763d8af6b1e383602da8b7 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Wed, 8 Jul 2020 19:15:06 -0700 Subject: [PATCH 45/50] (iOS) Bug fix: View hierarchy does not work correctly --- src/ios/GoogleMaps/MyPluginScrollView.m | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ios/GoogleMaps/MyPluginScrollView.m b/src/ios/GoogleMaps/MyPluginScrollView.m index 871735552..14a247e17 100644 --- a/src/ios/GoogleMaps/MyPluginScrollView.m +++ b/src/ios/GoogleMaps/MyPluginScrollView.m @@ -30,6 +30,7 @@ - (void)attachView:(UIView *)view depth:(NSInteger)depth { NSArray *subviews = [self subviews]; int viewCnt = (int)[subviews count]; int index = viewCnt; + depth += viewCnt; NSArray *sortedArray; sortedArray = [subviews sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { @@ -40,8 +41,9 @@ - (void)attachView:(UIView *)view depth:(NSInteger)depth { for (int i = 0; i < sortedArray.count; i++) { - NSInteger tag = ((UIView *)[sortedArray objectAtIndex:i]).tag; - if (tag > depth) { + ((UIView *)[sortedArray objectAtIndex:i]).tag = i; + + if (i > depth) { index = i; break; } From f6bef6d514ad24aee384f6f2cb5d4d12cf64e557 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Thu, 9 Jul 2020 18:08:54 -0700 Subject: [PATCH 46/50] Bug fix: map.setDiv() tries to change value of a readonly property #2809 Bug fix: background does not work correctly --- package.json | 2 +- plugin.xml | 2 +- www/Common.js | 58 +++++++------- www/Map.js | 89 ++++----------------- www/js_CordovaGoogleMaps-for-android_ios.js | 47 ++++++++--- www/pluginInit.js | 3 +- 6 files changed, 85 insertions(+), 116 deletions(-) diff --git a/package.json b/package.json index e8b03c0ef..9111fe612 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-googlemaps", - "version": "2.8.0-20200701-2202", + "version": "2.8.0-20200709-1800", "description": "Google Maps native SDK for Android and iOS, and Google Maps JavaScript API v3 for browser.", "cordova": { "id": "cordova-plugin-googlemaps", diff --git a/plugin.xml b/plugin.xml index d7a51ef6f..0c7049416 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - + cordova-plugin-googlemaps diff --git a/www/Common.js b/www/Common.js index 8fe8a8cf1..fc6afe04b 100644 --- a/www/Common.js +++ b/www/Common.js @@ -734,6 +734,11 @@ function createEvent(eventName, properties) { return evt; } +function hasTransparentClass(div) { + return (div.classList && div.classList.contains('_gmaps_cdv_') || + div.className && div.className.indexOf('_gmaps_cdv_') > -1); +} + function attachTransparentClass(div) { if (div.classList && !div.classList.contains('_gmaps_cdv_')) { @@ -744,36 +749,32 @@ function attachTransparentClass(div) { if (div.shadowRoot) { var styleAttr = div.getAttribute('style') || ''; - if (styleAttr && styleAttr.indexOf('--ion-background-color') === -1) { - styleAttr = styleAttr + ' --ion-background-color: transparent;'; + if (styleAttr && styleAttr.indexOf('--pgm-background-color') === -1) { + styleAttr = styleAttr + ' --ion-background-color: var(--pgm-background-color);'; + } + div.setAttribute('style', styleAttr); + } +} +function detachTransparentClass(div) { + + if (div.classList && div.classList.contains('_gmaps_cdv_')) { + div.classList.remove('_gmaps_cdv_'); + } else if (div.className && div.className.indexOf('_gmaps_cdv_') > -1) { + div.className = div.className.replace('_gmaps_cdv_', ''); + } + + if (div.shadowRoot) { + var styleAttr = div.getAttribute('style') || ''; + if (styleAttr && styleAttr.indexOf('--pgm-background-color') > -1) { + styleAttr = styleAttr.replace('--ion-background-color: var(--pgm-background-color);', ''); } div.setAttribute('style', styleAttr); + + var hiddenChildren = div.querySelectorAll('*'); + hiddenChildren = Array.prototype.splice(hiddenChildren, 0); + hiddenChildren.forEach(detachTransparentClass); } } -// function dettachTransparentClass(root) { -// -// if (div.classList && div.classList.contains('_gmaps_cdv_')) { -// div.classList.remove('_gmaps_cdv_'); -// } else if (div.className && div.className.indexOf('_gmaps_cdv_') === -1) { -// div.className = div.className.replace('_gmaps_cdv_', ''); -// } -// -// var visibilityCSS = getStyle(node, 'visibility'); -// if (getStyle(div, 'background-color') === 'transparent !important') { -// div.style.backgroundColor = undefined; -// } -// if (getStyle(div, 'background') === 'transparent !important') { -// div.style.backgroundColor = undefined; -// } -// if (getStyle(div, 'background-image') === 'transparent !important') { -// div.style.backgroundImage = undefined; -// } -// if (div.shadowRoot) { -// var hiddenChildren = div.querySelectorAll('*'); -// hiddenChildren = Array.prototype.splice(hiddenChildren, 0); -// hiddenChildren.forEach(dettachTransparentClass); -// } -// } module.exports = { _clearInternalCache: _clearInternalCache, @@ -797,8 +798,9 @@ module.exports = { getPluginDomId: getPluginDomId, hashCode: hashCode, createEvent: createEvent, - //dettachTransparentClass: dettachTransparentClass, - attachTransparentClass: attachTransparentClass + detachTransparentClass: detachTransparentClass, + attachTransparentClass: attachTransparentClass, + hasTransparentClass: hasTransparentClass }; if (cordova && cordova.platformId === 'browser') { diff --git a/www/Map.js b/www/Map.js index 2bc786cae..2929bd510 100644 --- a/www/Map.js +++ b/www/Map.js @@ -254,9 +254,6 @@ Map.prototype.getMap = function(meta, div, options) { _isReady: true }, function() { - //------------------------------------------------------------------------ - // Clear background colors of map div parents after the map is created - //------------------------------------------------------------------------ var div = self.get('div'); if (common.isDom(div)) { @@ -278,28 +275,6 @@ Map.prototype.getMap = function(meta, div, options) { div.insertBefore(self._layers.info, div.firstChild); - var background = undefined; - var bg; - while (div.parentNode) { - bg = common.getStyle(div, '--background'); - if (!bg) { - bg = common.getStyle(div, 'background-color'); - } - bg = (bg || "").trim(); - background = background || bg; - // console.log(`background = ${background}`); - // div.style.backgroundColor = 'rgba(0,0,0,0) !important'; - - // Add _gmaps_cdv_ class - common.attachTransparentClass(div); - - div = div.parentNode; - } - - if (background) { - background = common.HTMLColor2RGBA(background); - plugin.google.maps.environment.setBackgroundColor(background); - } } cordova.fireDocumentEvent('plugin_touch', { force: true @@ -807,6 +782,7 @@ Map.prototype.remove = function(callback) { writable: false }); self.stopAnimation(); + self.set('div', null); self.trigger('remove'); // var div = self.get('div'); @@ -833,7 +809,7 @@ Map.prototype.remove = function(callback) { active_marker.trigger(event.INFO_CLOSE); } - var clearObj = function(obj) { + var clearObj = function(obj) {ƒ var ids = Object.keys(obj); var id, instance; for (var i = 0; i < ids.length; i++) { @@ -852,7 +828,6 @@ Map.prototype.remove = function(callback) { clearObj(self.OVERLAYS); clearObj(self.MARKERS); - self[SUBSCRIPTIONS_FIELD] = null; var resolver = function(resolve, reject) { @@ -914,20 +889,22 @@ Map.prototype.setDiv = function(div) { var self = this, args = []; - if (!common.isDom(div)) { - div = self.get('div'); - if (common.isDom(div)) { + var prevDiv = self.get('div'); + if (common.isDom(prevDiv)) { + prevDiv.__pluginMapId = undefined; + } + + if (common.isDom(div)) { + var elemId = common.getPluginDomId(div); + args.push(elemId); + + if (!div.__pluginMapId) { Object.defineProperty(div, '__pluginMapId', { enumerable: false, - value: undefined + writable: true, + value: self.__pgmId }); } - self.set('div', null); - } else { - Object.defineProperty(div, '__pluginMapId', { - enumerable: false, - value: self.__pgmId - }); // Insert the infoWindow layer if (self._layers.info.parentNode) { @@ -955,43 +932,9 @@ Map.prototype.setDiv = function(div) { div.style.overflow = 'hidden'; div.style.position = 'relative'; - self.set('div', div); - - if (cordova.platform === 'browser') { - return Promise.resolve(); - } - - - positionCSS = common.getStyle(div, 'position'); - if (!positionCSS || positionCSS === 'static') { - div.style.position = 'relative'; - } - var elemId = common.getPluginDomId(div); - args.push(elemId); - - var background = undefined; - var bg; - while (div.parentNode) { - bg = common.getStyle(div, '--background'); - if (!bg) { - bg = common.getStyle(div, 'background-color'); - } - bg = (bg || "").trim(); - background = background || bg; - // console.log(`background = ${background}`); - // div.style.backgroundColor = 'rgba(0,0,0,0) !important'; - - // Add _gmaps_cdv_ class - common.attachTransparentClass(div); - - div = div.parentNode; - } - - if (background) { - background = common.HTMLColor2RGBA(background); - plugin.google.maps.environment.setBackgroundColor(background); - } } + self.set('div', div); + return (new Promise(function(resolve) { self.exec.call(self, function() { cordova.fireDocumentEvent('plugin_touch', { diff --git a/www/js_CordovaGoogleMaps-for-android_ios.js b/www/js_CordovaGoogleMaps-for-android_ios.js index cd91e08e3..ea287d0da 100644 --- a/www/js_CordovaGoogleMaps-for-android_ios.js +++ b/www/js_CordovaGoogleMaps-for-android_ios.js @@ -729,41 +729,49 @@ CordovaGoogleMaps.prototype.getMap = function(div, mapOptions) { var elemId, ele; if (common.isDom(oldDiv)) { - Object.defineProperty(oldDiv, '__pluginMapId', { - enumerable: false, - writable: true, - value: undefined - }); + oldDiv.__pluginMapId = undefined; ele = oldDiv; - while(ele && ele != document.body.parentNode) { + while(ele) { elemId = ele.__pluginDomId; if (elemId) { self.domPositions[elemId].containMapIDs = self.domPositions[elemId].containMapIDs || {}; delete self.domPositions[elemId].containMapIDs[mapId]; + + // If there is no map under this element, remove the '_gmaps_cdv' if ((Object.keys(self.domPositions[elemId].containMapIDs)).length < 1) { delete self.domPositions[elemId]; + common.detachTransparentClass(ele); } } ele.__pluginDomId = undefined; - if (ele.classList) { - ele.classList.remove('_gmaps_cdv_'); - } else if (ele.className) { - ele.className = ele.className.replace(/_gmaps_cdv_/g, ''); - ele.className = ele.className.replace(/\s+/g, ' '); - } ele = ele.parentNode; } } + var background = undefined; if (common.isDom(newDiv)) { elemId = common.getPluginDomId(newDiv); elem = newDiv; var isCached; + var bg; while(elem && elem.nodeType === Node.ELEMENT_NODE) { elemId = common.getPluginDomId(elem); if (common.shouldWatchByNative(elem)) { + if (!common.hasTransparentClass(elem)) { + bg = common.getStyle(elem, '--background'); + if (!bg) { + bg = common.getStyle(elem, 'background-color'); + } + bg = (bg || "").trim(); + background = background || bg; + + // Add _gmaps_cdv_ class + common.attachTransparentClass(elem); + } + + if (elem.shadowRoot) { elem.shadowRoot.addEventListener('transitionend', self.onTransitionEnd.bind(self), {capture: true}); elem.shadowRoot.addEventListener('scroll', self.followMaps.bind(self), {capture: true}); @@ -788,6 +796,11 @@ CordovaGoogleMaps.prototype.getMap = function(div, mapOptions) { elemId = common.getPluginDomId(newDiv); self.domPositions[elemId].isMap = true; + + background = background || '#FFFFFFFF'; + console.log(`background = ${background}`); + background = common.HTMLColor2RGBA(background); + plugin.google.maps.environment.setBackgroundColor(background); } }; @@ -895,6 +908,7 @@ CordovaGoogleMaps.prototype._remove = function(mapId) { delete self.domPositions[elemId].containMapIDs[mapId]; if ((Object.keys(self.domPositions[elemId].containMapIDs)).length < 1) { delete self.domPositions[elemId]; +// common.detachTransparentClass(ele); } }); self.MAPS[mapId].destroy(); @@ -903,10 +917,19 @@ CordovaGoogleMaps.prototype._remove = function(mapId) { delete self.MAPS[mapId]; map = undefined; + // If the app have no map, stop the native timer. if ((Object.keys(self.MAPS)).length === 0) { common._clearInternalCache(); self.pause(); + + var ele = document.body.parentElement; + if (ele.classList) { + ele.classList.remove('_gmaps_cdv_'); + } else if (ele.className) { + ele.className = ele.className.replace(/_gmaps_cdv_/g, ''); + ele.className = ele.className.replace(/\s+/g, ' '); + } } }; diff --git a/www/pluginInit.js b/www/pluginInit.js index de6fea149..8b0a7f59b 100644 --- a/www/pluginInit.js +++ b/www/pluginInit.js @@ -90,10 +90,11 @@ function pluginInit() { var cssAdjuster = document.createElement('style'); cssAdjuster.setAttribute('type', 'text/css'); cssAdjuster.innerText = [ - 'html, body, ._gmaps_cdv_ {', + '._gmaps_cdv_ {', ' background-image: none !important;', ' background: rgba(0,0,0,0) none !important;', ' background-color: rgba(0,0,0,0) !important;', + ' --pgm-background-color: transparent !important;', '}', '._gmaps_cdv_ .nav-decor {', ' background-color: rgba(0,0,0,0) !important;', From 9598dc43619bc0d715bfeee65ea0d0751e0e22b7 Mon Sep 17 00:00:00 2001 From: wf9a5m75 Date: Thu, 9 Jul 2020 20:08:23 -0700 Subject: [PATCH 47/50] Small bug fixes --- package.json | 2 +- plugin.xml | 2 +- www/Map.js | 2 +- www/js_CordovaGoogleMaps-for-android_ios.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 9111fe612..3aa12f64a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cordova-plugin-googlemaps", - "version": "2.8.0-20200709-1800", + "version": "2.8.0-20200709-2008", "description": "Google Maps native SDK for Android and iOS, and Google Maps JavaScript API v3 for browser.", "cordova": { "id": "cordova-plugin-googlemaps", diff --git a/plugin.xml b/plugin.xml index 0c7049416..7c9add1a4 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - + cordova-plugin-googlemaps diff --git a/www/Map.js b/www/Map.js index 2929bd510..926db6d42 100644 --- a/www/Map.js +++ b/www/Map.js @@ -809,7 +809,7 @@ Map.prototype.remove = function(callback) { active_marker.trigger(event.INFO_CLOSE); } - var clearObj = function(obj) {ƒ + var clearObj = function(obj) { var ids = Object.keys(obj); var id, instance; for (var i = 0; i < ids.length; i++) { diff --git a/www/js_CordovaGoogleMaps-for-android_ios.js b/www/js_CordovaGoogleMaps-for-android_ios.js index ea287d0da..6189b11a9 100644 --- a/www/js_CordovaGoogleMaps-for-android_ios.js +++ b/www/js_CordovaGoogleMaps-for-android_ios.js @@ -733,7 +733,7 @@ CordovaGoogleMaps.prototype.getMap = function(div, mapOptions) { ele = oldDiv; while(ele) { elemId = ele.__pluginDomId; - if (elemId) { + if (elemId && (elemId in self.domPositions)) { self.domPositions[elemId].containMapIDs = self.domPositions[elemId].containMapIDs || {}; delete self.domPositions[elemId].containMapIDs[mapId]; From 2cdc896cb5edfadb02aed9995ea742567dc8de02 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Mon, 17 Aug 2020 15:36:14 -0700 Subject: [PATCH 48/50] Update PluginMap.java --- src/android/plugin/google/maps/PluginMap.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/android/plugin/google/maps/PluginMap.java b/src/android/plugin/google/maps/PluginMap.java index 574bca460..0ea45af0f 100644 --- a/src/android/plugin/google/maps/PluginMap.java +++ b/src/android/plugin/google/maps/PluginMap.java @@ -509,6 +509,11 @@ public void onCameraIdle() { }); } + /* + //*************************************************************************** + // Google Maps SDK for Android v3 beta causes crash for these processes. + // Tmporally commented out + //*************************************************************************** @Override public void onStart() { super.onStart(); @@ -543,6 +548,7 @@ public void onResume(boolean multitasking) { } //mapCtrl.mPluginLayout.addPluginOverlay(PluginMap.this); } + */ private class AdjustInitCamera implements Runnable { private JSONObject mParams; From 6346bcaa96e7d0b8936f166552b2749f1b9c8da3 Mon Sep 17 00:00:00 2001 From: chacabuk Date: Thu, 2 Mar 2023 14:42:58 -0300 Subject: [PATCH 49/50] Load image from local path --- src/android/plugin/google/maps/AsyncLoadImage.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/android/plugin/google/maps/AsyncLoadImage.java b/src/android/plugin/google/maps/AsyncLoadImage.java index 1046a319b..9b0ababcd 100644 --- a/src/android/plugin/google/maps/AsyncLoadImage.java +++ b/src/android/plugin/google/maps/AsyncLoadImage.java @@ -197,10 +197,12 @@ protected AsyncLoadImageResult doInBackground(Void... params) { if (!iconUrl.startsWith("data:image")) { if (iconUrl.startsWith("http://localhost") || - iconUrl.startsWith("http://127.0.0.1")) { + iconUrl.startsWith("https://localhost") || + iconUrl.startsWith("http://127.0.0.1") || + iconUrl.startsWith("https://127.0.0.1")) { // Log.d(TAG, String.format("---->(201)iconURL = %s", iconUrl)); if (iconUrl.contains("://")) { - iconUrl = iconUrl.replaceAll("http://.+?/", "file:///android_asset/www/"); + iconUrl = iconUrl.replaceAll("https://.+?/", "file:///android_asset/www/"); } else { // Avoid WebViewLocalServer (because can not make a connection for some reason) iconUrl = "file:///android_asset/www/".concat(iconUrl); From 6cfc7a1bb6904919bec838742e69ed9eeb36bff4 Mon Sep 17 00:00:00 2001 From: Pablo Manzano Date: Mon, 25 Mar 2024 16:14:09 -0300 Subject: [PATCH 50/50] 2.8.1 - Quito CDVCommandDelegateImpl --- plugin.xml | 2 +- src/ios/GoogleMaps/PluginMap.m | 2 +- src/ios/GoogleMaps/PluginMarker.m | 44 ++++++++++++------------ src/ios/GoogleMaps/PluginMarkerCluster.m | 2 +- src/ios/GoogleMaps/PluginUtil.h | 6 +--- src/ios/GoogleMaps/PluginUtil.m | 18 ---------- src/notas.txt | 4 +++ 7 files changed, 30 insertions(+), 48 deletions(-) create mode 100644 src/notas.txt diff --git a/plugin.xml b/plugin.xml index 7c9add1a4..0a9fc9a16 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,5 +1,5 @@ - + cordova-plugin-googlemaps diff --git a/src/ios/GoogleMaps/PluginMap.m b/src/ios/GoogleMaps/PluginMap.m index 8ae19a165..29e764842 100644 --- a/src/ios/GoogleMaps/PluginMap.m +++ b/src/ios/GoogleMaps/PluginMap.m @@ -667,7 +667,7 @@ - (void)setActiveMarkerId:(CDVInvokedUrlCommand*)command { } CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; - [(CDVCommandDelegateImpl *)self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; } diff --git a/src/ios/GoogleMaps/PluginMarker.m b/src/ios/GoogleMaps/PluginMarker.m index 324393afc..ece03eeb5 100644 --- a/src/ios/GoogleMaps/PluginMarker.m +++ b/src/ios/GoogleMaps/PluginMarker.m @@ -73,7 +73,7 @@ -(void)create:(CDVInvokedUrlCommand *)command [createResult setObject:markerId forKey:@"__pgmId"]; [[NSOperationQueue mainQueue] addOperationWithBlock:^{ - CDVCommandDelegateImpl *cmdDelegate = (CDVCommandDelegateImpl *)self.commandDelegate; + __weak __auto_type weakSelf = self; [self _create:markerId markerOptions:json callbackBlock:^(BOOL successed, id result) { CDVPluginResult* pluginResult; @@ -93,7 +93,7 @@ -(void)create:(CDVInvokedUrlCommand *)command pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:createResult ]; } - [cmdDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + [weakSelf.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; }]; @@ -255,7 +255,7 @@ -(void)showInfoWindow:(CDVInvokedUrlCommand *)command } CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; - [(CDVCommandDelegateImpl *)self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; }]; } @@ -270,7 +270,7 @@ -(void)hideInfoWindow:(CDVInvokedUrlCommand *)command self.mapCtrl.map.selectedMarker = nil; self.mapCtrl.activeMarker = nil; CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; - [(CDVCommandDelegateImpl *)self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; }]; } @@ -295,7 +295,7 @@ -(void)getPosition:(CDVInvokedUrlCommand *)command [json setObject:longitude forKey:@"lng"]; CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:json]; - [(CDVCommandDelegateImpl *)self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; } @@ -319,7 +319,7 @@ -(void)setTitle:(CDVInvokedUrlCommand *)command CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; - [(CDVCommandDelegateImpl *)self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; }]; } @@ -338,7 +338,7 @@ -(void)setSnippet:(CDVInvokedUrlCommand *)command marker.snippet = [command.arguments objectAtIndex:1]; CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; - [(CDVCommandDelegateImpl *)self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; }]; } @@ -358,7 +358,7 @@ -(void)remove:(CDVInvokedUrlCommand *)command marker = nil; CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; - [(CDVCommandDelegateImpl *)self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; }]; } @@ -424,7 +424,7 @@ -(void)setIconAnchor:(CDVInvokedUrlCommand *)command } CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; - [(CDVCommandDelegateImpl *)self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; } @@ -450,7 +450,7 @@ -(void)setInfoWindowAnchor:(CDVInvokedUrlCommand *)command } else { pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR]; } - [(CDVCommandDelegateImpl *)self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; }]; @@ -470,7 +470,7 @@ -(void)setOpacity:(CDVInvokedUrlCommand *)command marker.opacity = [[command.arguments objectAtIndex:1] floatValue]; CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; - [(CDVCommandDelegateImpl *)self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; }]; } @@ -488,7 +488,7 @@ -(void)setZIndex:(CDVInvokedUrlCommand *)command marker.zIndex = [[command.arguments objectAtIndex:1] intValue]; CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; - [(CDVCommandDelegateImpl *)self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; }]; } @@ -507,7 +507,7 @@ -(void)setDraggable:(CDVInvokedUrlCommand *)command [marker setDraggable:isEnabled]; CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; - [(CDVCommandDelegateImpl *)self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; }]; } @@ -530,7 +530,7 @@ -(void)setDisableAutoPan:(CDVInvokedUrlCommand *)command NSLog(@"--->propertyId = %@", propertyId); CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; - [(CDVCommandDelegateImpl *)self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; } @@ -560,7 +560,7 @@ -(void)setVisible:(CDVInvokedUrlCommand *)command [self.mapCtrl.objects setObject:properties forKey:propertyId]; CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; - [(CDVCommandDelegateImpl *)self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; }]; } @@ -582,7 +582,7 @@ -(void)setPosition:(CDVInvokedUrlCommand *)command [marker setPosition:position]; CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; - [(CDVCommandDelegateImpl *)self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; }]; } @@ -601,7 +601,7 @@ -(void)setFlat:(CDVInvokedUrlCommand *)command [marker setFlat: isFlat]; CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; - [(CDVCommandDelegateImpl *)self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; }]; } @@ -645,7 +645,7 @@ -(void)setIcon:(CDVInvokedUrlCommand *)command [iconProperty setObject:[rgbColor parsePluginColor] forKey:@"iconColor"]; } - CDVCommandDelegateImpl *cmdDelegate = (CDVCommandDelegateImpl *)self.commandDelegate; + __weak __auto_type weakSelf = self; [self setIcon_:marker iconProperty:iconProperty callbackBlock:^(BOOL successed, id resultObj) { CDVPluginResult* pluginResult; if (successed == NO) { @@ -653,7 +653,7 @@ -(void)setIcon:(CDVInvokedUrlCommand *)command } else { pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; } - [cmdDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + [weakSelf.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; }]; } @@ -671,7 +671,7 @@ -(void)setRotation:(CDVInvokedUrlCommand *)command [marker setRotation:degrees]; CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; - [(CDVCommandDelegateImpl *)self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; }]; } @@ -686,11 +686,11 @@ -(void)setAnimation:(CDVInvokedUrlCommand *)command GMSMarker *marker = [self.mapCtrl.objects objectForKey:markerId]; NSString *animation = [command.arguments objectAtIndex:1]; - CDVCommandDelegateImpl *cmdDelegate = (CDVCommandDelegateImpl *)self.commandDelegate; + __weak __auto_type weakSelf = self; [self setMarkerAnimation_:animation marker:marker callbackBlock:^(void) { CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK]; - [cmdDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + [weakSelf.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; }]; }]; diff --git a/src/ios/GoogleMaps/PluginMarkerCluster.m b/src/ios/GoogleMaps/PluginMarkerCluster.m index cbf706ff4..a7d61ca37 100644 --- a/src/ios/GoogleMaps/PluginMarkerCluster.m +++ b/src/ios/GoogleMaps/PluginMarkerCluster.m @@ -453,7 +453,7 @@ - (void)redrawClusters:(CDVInvokedUrlCommand*)command { - (void) endRedraw:(CDVInvokedUrlCommand*)command { NSLog(@"--->allResults = %@", self.allResults); CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:self.allResults]; - [(CDVCommandDelegateImpl *)self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; + [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; } - (void) deleteProcess:(NSDictionary *) params clusterId:(NSString *)clusterId{ diff --git a/src/ios/GoogleMaps/PluginUtil.h b/src/ios/GoogleMaps/PluginUtil.h index 2e38cf76f..ed620fb0c 100644 --- a/src/ios/GoogleMaps/PluginUtil.h +++ b/src/ios/GoogleMaps/PluginUtil.h @@ -20,7 +20,7 @@ #import "IPluginProtocol.h" #import "PluginViewController.h" #import -#import + typedef void (^MYCompletionHandler)(NSError *error); @@ -50,10 +50,6 @@ typedef void (^MYCompletionHandler)(NSError *error); - (UIImage *)resize:(CGFloat)width height:(CGFloat)height; @end -@interface CDVCommandDelegateImpl (GoogleMapsPlugin) -- (void)hookSendPluginResult:(CDVPluginResult*)result callbackId:(NSString*)callbackId; -@end - // // animationDidStop for group animation // http://stackoverflow.com/a/28051909/697856 diff --git a/src/ios/GoogleMaps/PluginUtil.m b/src/ios/GoogleMaps/PluginUtil.m index 873e13d8a..6689a9bdc 100644 --- a/src/ios/GoogleMaps/PluginUtil.m +++ b/src/ios/GoogleMaps/PluginUtil.m @@ -128,24 +128,6 @@ -(UIImage *)resize:(CGFloat)width height:(CGFloat)height { @end -/* -@implementation CDVCommandDelegateImpl (GoogleMapsPlugin) - -- (void)hookSendPluginResult:(CDVPluginResult*)result callbackId:(NSString*)callbackId { - - NSRange pos = [callbackId rangeOfString:@"://"]; - if (pos.location == NSNotFound) { - [self sendPluginResult:result callbackId:callbackId]; - } else { - NSArray *tmp = [callbackId componentsSeparatedByString:@"://"]; - NSString *pluginName = [tmp objectAtIndex:0]; - CDVPlugin *plugin = [self getCommandInstance:pluginName]; - [plugin onHookedPluginResult:result callbackId:callbackId]; - } - -} -@end -*/ static char CAAnimationGroupBlockKey; @implementation CAAnimationGroup (Blocks) diff --git a/src/notas.txt b/src/notas.txt new file mode 100644 index 000000000..7e752d25b --- /dev/null +++ b/src/notas.txt @@ -0,0 +1,4 @@ +2.8.1 - Quito CDVCommandDelegateImpl +Ver: https://github.com/mapsplugin/cordova-plugin-googlemaps/issues/2923 +The problem is that the current version of this plugin uses the CDVCommandDelegateImpl class which has been changed from Public to Private in cordova-ios@7 +so is no longer available for the plugin to use.