From 4b2490157134fbd493039693063eea84c88c2a8c Mon Sep 17 00:00:00 2001
From: Michael Rittmeister <michael@rittmeister.in>
Date: Sat, 26 Sep 2020 11:35:06 +0200
Subject: [PATCH] Add support for Android 11 - Reflect package visibility
 settings in documentation - Upgrade android projects (lib & example) -
 Cleanup ChromeSafariBrowserManager.java - Upgrade Android dependencies

---
 README.md                                     |  2 ++
 android/build.gradle                          |  2 +-
 android/src/main/AndroidManifest.xml          |  7 ++++++
 .../ChromeSafariBrowserManager.java           | 22 +++++++++----------
 example/android/app/build.gradle              |  6 ++---
 example/android/build.gradle                  |  2 +-
 .../gradle/wrapper/gradle-wrapper.properties  |  4 ++--
 lib/src/chrome_safari_browser.dart            |  2 ++
 8 files changed, 29 insertions(+), 18 deletions(-)

diff --git a/README.md b/README.md
index d398a02..d82c572 100755
--- a/README.md
+++ b/README.md
@@ -75,6 +75,8 @@ or **Android API 19+** if you enable the `useHybridComposition` Android-specific
 - Check the official [Network security configuration - "Opt out of cleartext traffic"](https://developer.android.com/training/articles/security-config#CleartextTrafficPermitted) section.
 - Also, check this StackOverflow issue answer: [Cleartext HTTP traffic not permitted](https://stackoverflow.com/a/50834600/4637638).
 
+If you want to use the `ChromeSafariBrowser` on Android 11+ you need to specify your app querying for `android.support.customtabs.action.CustomTabsService` in your `AndroidManifest.xml` you can read more about it here: https://developers.google.com/web/android/custom-tabs/best-practices#applications_targeting_android_11_api_level_30_or_above
+
 ### IMPORTANT Note for iOS
 
 If you are starting a new fresh app, you need to create the Flutter App with `flutter create --androidx -i swift`
diff --git a/android/build.gradle b/android/build.gradle
index e01ae94..43194fe 100755
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -48,6 +48,6 @@ android {
         implementation 'androidx.webkit:webkit:1.3.0'
         implementation 'androidx.browser:browser:1.2.0'
         implementation 'androidx.appcompat:appcompat:1.2.0-rc02'
-        implementation 'com.squareup.okhttp3:mockwebserver:3.11.0'
+        implementation 'com.squareup.okhttp3:mockwebserver:3.14.7'
     }
 }
diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml
index a7309e1..9aaca72 100755
--- a/android/src/main/AndroidManifest.xml
+++ b/android/src/main/AndroidManifest.xml
@@ -9,4 +9,11 @@
             android:name="io.flutter.embedded_views_preview"
             android:value="true" />
     </application>
+
+    <queries>
+        <intent>
+            <action android:name=
+                "android.support.customtabs.action.CustomTabsService" />
+        </intent>
+    </queries>
 </manifest>
\ No newline at end of file
diff --git a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/ChromeSafariBrowserManager.java b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/ChromeSafariBrowserManager.java
index 4f50a80..5691c63 100755
--- a/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/ChromeSafariBrowserManager.java
+++ b/android/src/main/java/com/pichillilorenzo/flutter_inappwebview/ChromeSafariBrowserManager.java
@@ -33,19 +33,19 @@ public class ChromeSafariBrowserManager implements MethodChannel.MethodCallHandl
   @Override
   public void onMethodCall(final MethodCall call, final MethodChannel.Result result) {
     final Activity activity = Shared.activity;
-    final String uuid = (String) call.argument("uuid");
+    final String uuid = call.argument("uuid");
 
     switch (call.method) {
       case "open":
         {
-          String url = (String) call.argument("url");
-          HashMap<String, Object> options = (HashMap<String, Object>) call.argument("options");
-          List<HashMap<String, Object>> menuItemList = (List<HashMap<String, Object>>) call.argument("menuItemList");
-          String uuidFallback = (String) call.argument("uuidFallback");
-          Map<String, String> headersFallback = (Map<String, String>) call.argument("headersFallback");
-          HashMap<String, Object> optionsFallback = (HashMap<String, Object>) call.argument("optionsFallback");
-          HashMap<String, Object> contextMenuFallback = (HashMap<String, Object>) call.argument("contextMenuFallback");
-          Integer windowIdFallback = (Integer) call.argument("windowIdFallback");
+          String url = call.argument("url");
+          HashMap<String, Object> options = call.argument("options");
+          List<HashMap<String, Object>> menuItemList = call.argument("menuItemList");
+          String uuidFallback = call.argument("uuidFallback");
+          Map<String, String> headersFallback = call.argument("headersFallback");
+          HashMap<String, Object> optionsFallback = call.argument("optionsFallback");
+          HashMap<String, Object> contextMenuFallback = call.argument("contextMenuFallback");
+          Integer windowIdFallback = call.argument("windowIdFallback");
           open(activity, uuid, url, options, menuItemList, uuidFallback, headersFallback, optionsFallback, contextMenuFallback, windowIdFallback, result);
         }
         break;
@@ -71,7 +71,7 @@ public class ChromeSafariBrowserManager implements MethodChannel.MethodCallHandl
     extras.putSerializable("menuItemList", (Serializable) menuItemList);
 
     extras.putSerializable("headers", (Serializable) headersFallback);
-    extras.putSerializable("contextMenu", (Serializable) contextMenuFallback);
+    extras.putSerializable("contextMenu", contextMenuFallback);
 
     extras.putInt("windowId", windowIdFallback != null ? windowIdFallback : -1);
 
@@ -79,7 +79,7 @@ public class ChromeSafariBrowserManager implements MethodChannel.MethodCallHandl
       intent = new Intent(activity, ChromeCustomTabsActivity.class);
     }
     // check for webview fallback
-    else if (!CustomTabActivityHelper.isAvailable(activity) && uuidFallback != null) {
+    else if (uuidFallback != null) {
       Log.d(LOG_TAG, "WebView fallback declared.");
       // overwrite with extras fallback parameters
       extras.putString("uuid", uuidFallback);
diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle
index f745f67..ee53f52 100755
--- a/example/android/app/build.gradle
+++ b/example/android/app/build.gradle
@@ -60,7 +60,7 @@ flutter {
 }
 
 dependencies {
-    testImplementation 'junit:junit:4.12'
-    androidTestImplementation 'androidx.test:runner:1.1.1'
-    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
+    testImplementation 'junit:junit:4.13'
+    androidTestImplementation 'androidx.test:runner:1.3.0'
+    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
 }
diff --git a/example/android/build.gradle b/example/android/build.gradle
index 11e3d09..205da3d 100755
--- a/example/android/build.gradle
+++ b/example/android/build.gradle
@@ -5,7 +5,7 @@ buildscript {
     }
 
     dependencies {
-        classpath 'com.android.tools.build:gradle:3.6.3'
+        classpath 'com.android.tools.build:gradle:4.0.1'
     }
 }
 
diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties
index 9d3660b..2678abc 100755
--- a/example/android/gradle/wrapper/gradle-wrapper.properties
+++ b/example/android/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Mon Jun 01 20:06:49 CEST 2020
+#Sat Sep 26 11:13:08 CEST 2020
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
diff --git a/lib/src/chrome_safari_browser.dart b/lib/src/chrome_safari_browser.dart
index f1aeb50..37668ed 100755
--- a/lib/src/chrome_safari_browser.dart
+++ b/lib/src/chrome_safari_browser.dart
@@ -11,6 +11,8 @@ import 'in_app_browser.dart';
 ///and [SFSafariViewController](https://developer.apple.com/documentation/safariservices/sfsafariviewcontroller) on iOS.
 ///
 ///[browserFallback] represents the [InAppBrowser] instance fallback in case `Chrome Custom Tabs`/`SFSafariViewController` is not available.
+///
+///Note: Requires modification of Android 11+: https://developers.google.com/web/android/custom-tabs/best-practices#applications_targeting_android_11_api_level_30_or_above
 class ChromeSafariBrowser {
   String uuid;
   InAppBrowser browserFallback;
-- 
2.26.2