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