From 40dccfde536b774d32e265bc21784c490b67623a Mon Sep 17 00:00:00 2001
From: pichillilorenzo <pichillilorenzo@gmail.com>
Date: Thu, 25 Oct 2018 00:25:11 +0200
Subject: [PATCH] added getCookies() and getCookie() for Android

---
 .idea/workspace.xml                           | 131 +++++-------------
 .../flutter_inappbrowser/MyCookieManager.java |  34 ++++-
 example/android/build.gradle                  |   2 +-
 example/lib/main.dart                         |   7 +
 lib/flutter_inappbrowser.dart                 |  34 +++++
 5 files changed, 107 insertions(+), 101 deletions(-)

diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 201b171..9069887 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -15,14 +15,12 @@
   </component>
   <component name="ChangeListManager">
     <list default="true" id="9b41f7a2-a71e-4923-91fb-249d7815b3e7" name="Default" comment="">
-      <change afterPath="$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/MyCookieManager.java" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/CHANGELOG.md" beforeDir="false" afterPath="$PROJECT_DIR$/CHANGELOG.md" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/InAppBrowserFlutterPlugin.java" beforeDir="false" afterPath="$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/InAppBrowserFlutterPlugin.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/Util.java" beforeDir="false" afterPath="$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/Util.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/MyCookieManager.java" beforeDir="false" afterPath="$PROJECT_DIR$/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/MyCookieManager.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/example/android/build.gradle" beforeDir="false" afterPath="$PROJECT_DIR$/example/android/build.gradle" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/example/lib/main.dart" beforeDir="false" afterPath="$PROJECT_DIR$/example/lib/main.dart" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/lib/flutter_inappbrowser.dart" beforeDir="false" afterPath="$PROJECT_DIR$/lib/flutter_inappbrowser.dart" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/pubspec.yaml" beforeDir="false" afterPath="$PROJECT_DIR$/pubspec.yaml" afterDir="false" />
     </list>
     <ignored path="$PROJECT_DIR$/.dart_tool/" />
     <ignored path="$PROJECT_DIR$/.idea/" />
@@ -39,11 +37,11 @@
   </component>
   <component name="FileEditorManager">
     <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
-      <file leaf-file-name="flutter_inappbrowser.dart" pinned="false" current-in-tab="false">
+      <file leaf-file-name="flutter_inappbrowser.dart" pinned="false" current-in-tab="true">
         <entry file="file://$PROJECT_DIR$/lib/flutter_inappbrowser.dart">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="461">
-              <caret line="1157" column="19" selection-start-line="1157" selection-start-column="19" selection-end-line="1157" selection-end-column="19" />
+            <state relative-caret-position="542">
+              <caret line="1178" column="47" selection-start-line="1178" selection-start-column="38" selection-end-line="1178" selection-end-column="47" />
               <folding>
                 <element signature="e#814#831#0" expanded="true" />
               </folding>
@@ -54,8 +52,8 @@
       <file leaf-file-name="main.dart" pinned="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/example/lib/main.dart">
           <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="432">
-              <caret line="273" column="94" selection-start-line="273" selection-start-column="94" selection-end-line="273" selection-end-column="94" />
+            <state relative-caret-position="422">
+              <caret line="72" column="67" selection-start-line="72" selection-start-column="67" selection-end-line="72" selection-end-column="67" />
               <folding>
                 <element signature="e#0#20#0" expanded="true" />
               </folding>
@@ -63,34 +61,6 @@
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="README.md" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/README.md">
-          <provider selected="true" editor-type-id="split-provider[text-editor;MarkdownPreviewEditor]">
-            <state split_layout="SPLIT">
-              <first_editor relative-caret-position="525">
-                <caret line="35" selection-start-line="35" selection-end-line="35" />
-              </first_editor>
-              <second_editor>
-                <markdownNavigatorState />
-              </second_editor>
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="CHANGELOG.md" pinned="false" current-in-tab="true">
-        <entry file="file://$PROJECT_DIR$/CHANGELOG.md">
-          <provider selected="true" editor-type-id="split-provider[text-editor;MarkdownPreviewEditor]">
-            <state split_layout="SPLIT">
-              <first_editor relative-caret-position="30">
-                <caret line="2" column="7" selection-start-line="2" selection-start-column="7" selection-end-line="2" selection-end-column="7" />
-              </first_editor>
-              <second_editor>
-                <markdownNavigatorState />
-              </second_editor>
-            </state>
-          </provider>
-        </entry>
-      </file>
     </leaf>
   </component>
   <component name="FileTemplateManagerImpl">
@@ -102,10 +72,6 @@
   </component>
   <component name="FindInProjectRecents">
     <findStrings>
-      <find>shouldOverrideUrlLoading</find>
-      <find>toolbarTopFixedTitle</find>
-      <find>useChromeSafariBrowser</find>
-      <find>toolbat</find>
       <find>onProgress</find>
       <find>goBack</find>
       <find>_controller</find>
@@ -132,6 +98,10 @@
       <find>loadData</find>
       <find>_valide</find>
       <find>initialized</find>
+      <find>HashMap</find>
+      <find>headers</find>
+      <find>.cast</find>
+      <find>WebView</find>
     </findStrings>
     <replaceStrings>
       <replace>activity.getPreferences(0)</replace>
@@ -175,9 +145,9 @@
         <option value="$PROJECT_DIR$/example/pubspec.yaml" />
         <option value="$PROJECT_DIR$/README.md" />
         <option value="$PROJECT_DIR$/pubspec.yaml" />
-        <option value="$PROJECT_DIR$/lib/flutter_inappbrowser.dart" />
-        <option value="$PROJECT_DIR$/example/lib/main.dart" />
         <option value="$PROJECT_DIR$/CHANGELOG.md" />
+        <option value="$PROJECT_DIR$/example/lib/main.dart" />
+        <option value="$PROJECT_DIR$/lib/flutter_inappbrowser.dart" />
       </list>
     </option>
   </component>
@@ -211,6 +181,7 @@
         </subPane>
         <option name="show-excluded-files" value="false" />
       </pane>
+      <pane id="AndroidView" />
       <pane id="Scope">
         <subPane subId="Project Files">
           <expand>
@@ -222,7 +193,6 @@
           <select />
         </subPane>
       </pane>
-      <pane id="AndroidView" />
     </panes>
   </component>
   <component name="PropertiesComponent">
@@ -390,9 +360,9 @@
       <window_info anchor="right" id="Capture Analysis" order="4" />
       <window_info anchor="bottom" id="Event Log" order="8" sideWeight="0.5035553" side_tool="true" weight="0.25689086" />
       <window_info anchor="bottom" id="Dart Analysis" order="14" weight="0.3276414" />
-      <window_info active="true" anchor="bottom" id="Run" order="2" sideWeight="0.49644473" visible="true" weight="0.44503736" />
+      <window_info anchor="bottom" id="Run" order="2" sideWeight="0.49644473" weight="0.44503736" />
       <window_info anchor="bottom" id="Version Control" order="9" />
-      <window_info anchor="bottom" id="Terminal" order="10" sideWeight="0.49644473" weight="0.30736393" />
+      <window_info active="true" anchor="bottom" id="Terminal" order="10" sideWeight="0.49644473" visible="true" weight="0.30736393" />
       <window_info anchor="right" id="Flutter Outline" order="6" weight="0.32922077" />
       <window_info anchor="bottom" id="Logcat" order="11" />
       <window_info id="Captures" order="4" weight="0.32936507" />
@@ -408,7 +378,7 @@
       <window_info anchor="bottom" id="Messages" order="12" weight="0.23692636" />
       <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
       <window_info anchor="right" id="Commander" order="0" weight="0.4" />
-      <window_info anchor="right" id="Assistant" order="8" visible="true" weight="0.32987013" />
+      <window_info anchor="right" id="Assistant" order="8" visible="true" weight="0.3295129" />
       <window_info anchor="bottom" id="Message" order="0" />
       <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
       <window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
@@ -646,38 +616,12 @@
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/example/README.md">
-      <provider selected="true" editor-type-id="split-provider[text-editor;MarkdownPreviewEditor]">
-        <state split_layout="SPLIT">
-          <first_editor />
-          <second_editor>
-            <markdownNavigatorState />
-          </second_editor>
-        </state>
-      </provider>
-    </entry>
+    <entry file="file://$PROJECT_DIR$/example/README.md" />
     <entry file="file://$PROJECT_DIR$/pubspec.lock">
       <provider selected="true" editor-type-id="text-editor">
         <state />
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/README.md">
-      <provider editor-type-id="text-editor">
-        <state relative-caret-position="247">
-          <caret line="19" column="15" selection-start-line="19" selection-start-column="3" selection-end-line="19" selection-end-column="15" />
-        </state>
-      </provider>
-      <provider selected="true" editor-type-id="split-provider[text-editor;MarkdownPreviewEditor]">
-        <state split_layout="SPLIT">
-          <first_editor relative-caret-position="525">
-            <caret line="35" selection-start-line="35" selection-end-line="35" />
-          </first_editor>
-          <second_editor>
-            <markdownNavigatorState />
-          </second_editor>
-        </state>
-      </provider>
-    </entry>
     <entry file="file://$PROJECT_DIR$/pubspec.yaml">
       <provider selected="true" editor-type-id="text-editor">
         <state relative-caret-position="105">
@@ -692,40 +636,39 @@
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/lib/flutter_inappbrowser.dart">
+    <entry file="file://$PROJECT_DIR$/README.md">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="461">
-          <caret line="1157" column="19" selection-start-line="1157" selection-start-column="19" selection-end-line="1157" selection-end-column="19" />
+        <state relative-caret-position="-3761">
           <folding>
-            <element signature="e#814#831#0" expanded="true" />
+            <element signature="e#0#20#0" expanded="true" />
+            <element signature="e#0#39#0" expanded="true" />
+            <element signature="e#0#39#0" expanded="true" />
           </folding>
         </state>
       </provider>
     </entry>
+    <entry file="file://$PROJECT_DIR$/CHANGELOG.md">
+      <provider selected="true" editor-type-id="text-editor">
+        <state />
+      </provider>
+    </entry>
     <entry file="file://$PROJECT_DIR$/example/lib/main.dart">
       <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="432">
-          <caret line="273" column="94" selection-start-line="273" selection-start-column="94" selection-end-line="273" selection-end-column="94" />
+        <state relative-caret-position="422">
+          <caret line="72" column="67" selection-start-line="72" selection-start-column="67" selection-end-line="72" selection-end-column="67" />
           <folding>
             <element signature="e#0#20#0" expanded="true" />
           </folding>
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/CHANGELOG.md">
-      <provider editor-type-id="text-editor">
-        <state relative-caret-position="30">
-          <caret line="2" column="69" lean-forward="true" selection-start-line="2" selection-start-column="2" selection-end-line="2" selection-end-column="73" />
-        </state>
-      </provider>
-      <provider selected="true" editor-type-id="split-provider[text-editor;MarkdownPreviewEditor]">
-        <state split_layout="SPLIT">
-          <first_editor relative-caret-position="30">
-            <caret line="2" column="7" selection-start-line="2" selection-start-column="7" selection-end-line="2" selection-end-column="7" />
-          </first_editor>
-          <second_editor>
-            <markdownNavigatorState />
-          </second_editor>
+    <entry file="file://$PROJECT_DIR$/lib/flutter_inappbrowser.dart">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="542">
+          <caret line="1178" column="47" selection-start-line="1178" selection-start-column="38" selection-end-line="1178" selection-end-column="47" />
+          <folding>
+            <element signature="e#814#831#0" expanded="true" />
+          </folding>
         </state>
       </provider>
     </entry>
diff --git a/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/MyCookieManager.java b/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/MyCookieManager.java
index 7717a56..1bb9e9f 100644
--- a/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/MyCookieManager.java
+++ b/android/src/main/java/com/pichillilorenzo/flutter_inappbrowser/MyCookieManager.java
@@ -1,15 +1,15 @@
 package com.pichillilorenzo.flutter_inappbrowser;
 
 import android.os.Build;
-import android.text.TextUtils;
 import android.util.Log;
 import android.webkit.CookieManager;
 import android.webkit.ValueCallback;
 
 import java.net.HttpCookie;
-import java.net.MalformedURLException;
-import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import io.flutter.plugin.common.MethodCall;
 import io.flutter.plugin.common.MethodChannel;
@@ -44,6 +44,9 @@ public class MyCookieManager implements MethodChannel.MethodCallHandler {
           MyCookieManager.setCookie(url, name, value, domain, path, expiresDate, isHTTPOnly, isSecure, result);
         }
         break;
+      case "getCookies":
+        result.success(MyCookieManager.getCookies((String) call.argument("url")));
+        break;
       default:
         result.notImplemented();
     }
@@ -70,9 +73,8 @@ public class MyCookieManager implements MethodChannel.MethodCallHandler {
     if (expiresDate != null)
       cookieValue += "; Max-Age=" + expiresDate.toString();
 
-    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
-      if (isHTTPOnly != null && isHTTPOnly)
-        cookieValue += "; HttpOnly";
+    if (isHTTPOnly != null && isHTTPOnly)
+      cookieValue += "; HttpOnly";
 
     if (isSecure != null && isSecure)
       cookieValue += "; Secure";
@@ -93,4 +95,24 @@ public class MyCookieManager implements MethodChannel.MethodCallHandler {
     }
   }
 
+  public static List<Map<String, Object>> getCookies(final String url) {
+
+    final List<Map<String, Object>> cookieListMap = new ArrayList<>();
+
+    CookieManager cookieManager = CookieManager.getInstance();
+
+    String[] cookies = cookieManager.getCookie(url).split(";");
+    for (String cookie : cookies) {
+      String[] nameValue = cookie.split("=", 2);
+      String name = nameValue[0].trim();
+      String value = nameValue[1].trim();
+      Map<String, Object> cookieMap = new HashMap<>();
+      cookieMap.put("name", name);
+      cookieMap.put("value", value);
+      cookieListMap.add(cookieMap);
+    }
+    return cookieListMap;
+
+  }
+
 }
diff --git a/example/android/build.gradle b/example/android/build.gradle
index e81b1a1..bb8a303 100644
--- a/example/android/build.gradle
+++ b/example/android/build.gradle
@@ -5,7 +5,7 @@ buildscript {
     }
 
     dependencies {
-        classpath 'com.android.tools.build:gradle:3.2.0'
+        classpath 'com.android.tools.build:gradle:3.2.1'
     }
 }
 
diff --git a/example/lib/main.dart b/example/lib/main.dart
index 358afac..2c7a44f 100644
--- a/example/lib/main.dart
+++ b/example/lib/main.dart
@@ -66,6 +66,12 @@ class MyInAppBrowser extends InAppBrowser {
 //    await this.webViewController.injectScriptCode("console.debug('testDebug', true);");
 //
     print(await this.webViewController.injectScriptCode("document.cookie"));
+
+    print("");
+    print(await CookieManager.getCookies("https://flutter.io/"));
+    print("");
+    print(await CookieManager.getCookie("https://flutter.io/", "_ga"));
+    print("");
 //
 //    print(await this.webViewController.injectScriptCode("null"));
 //    print(await this.webViewController.injectScriptCode("undefined"));
@@ -281,6 +287,7 @@ class _MyAppState extends State<MyApp> {
                 //"toolbarTop": false,
                 //"toolbarBottom": false
               });
+
             },
             child: Text("Open InAppBrowser")
           ),
diff --git a/lib/flutter_inappbrowser.dart b/lib/flutter_inappbrowser.dart
index ffb8e71..993f660 100644
--- a/lib/flutter_inappbrowser.dart
+++ b/lib/flutter_inappbrowser.dart
@@ -1119,6 +1119,7 @@ class InAppLocalhostServer {
 
 }
 
+///Manages the cookies used by an application's [InAppWebView] instances.
 class CookieManager {
   static bool _initialized = false;
   static const MethodChannel _channel = const MethodChannel('com.pichillilorenzo/flutter_inappbrowser_cookiemanager');
@@ -1131,6 +1132,7 @@ class CookieManager {
   static Future<dynamic> _handleMethod(MethodCall call) async {
   }
 
+  ///Sets a cookie for the given [url]. Any existing cookie with the same [host], [path] and [name] will be replaced with the new cookie. The cookie being set will be ignored if it is expired.
   static Future<void> setCookie(String url, String name, String value, String domain,
       { String path = "/",
         int expiresDate,
@@ -1157,4 +1159,36 @@ class CookieManager {
 
     await _channel.invokeMethod('setCookie', args);
   }
+
+  ///Gets all the cookies for the given [url].
+  static Future<List<Map<String, dynamic>>> getCookies(String url) async {
+    assert(url != null && url.isNotEmpty);
+
+    Map<String, dynamic> args = <String, dynamic>{};
+    args.putIfAbsent('url', () => url);
+    List<dynamic> cookies = await _channel.invokeMethod('getCookies', args);
+    cookies = cookies.cast<Map<dynamic, dynamic>>();
+    for(var i = 0; i < cookies.length; i++) {
+      cookies[i] = cookies[i].cast<String, dynamic>();
+    }
+    cookies = cookies.cast<Map<String, dynamic>>();
+    return cookies;
+  }
+
+  ///Gets a cookie by its [cookieName] for the given [url].
+  static Future<Map<String, dynamic>> getCookie(String url, String cookieName) async {
+    assert(url != null && url.isNotEmpty);
+    assert(cookieName != null && cookieName.isNotEmpty);
+
+    Map<String, dynamic> args = <String, dynamic>{};
+    args.putIfAbsent('url', () => url);
+    List<dynamic> cookies = await _channel.invokeMethod('getCookies', args);
+    cookies = cookies.cast<Map<dynamic, dynamic>>();
+    for(var i = 0; i < cookies.length; i++) {
+      cookies[i] = cookies[i].cast<String, dynamic>();
+      if (cookies[i]["name"] == cookieName)
+        return cookies[i];
+    }
+    return null;
+  }
 }
-- 
2.26.2