From 7ac772e5f923746d3ce49de0b0490632f8becb82 Mon Sep 17 00:00:00 2001 From: Nikola Date: Fri, 27 Dec 2019 23:36:45 +0100 Subject: [PATCH 1/7] Add method channel --- example/lib/main.dart | 13 +++------- lib/link_preview.dart | 59 +++++++++++++++++++++++++++++++++---------- 2 files changed, 48 insertions(+), 24 deletions(-) diff --git a/example/lib/main.dart b/example/lib/main.dart index f839557..c67237c 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -23,16 +23,15 @@ class _MyAppState extends State { Future getLinks() async { try { - await LinkPreview.getPreview('https://google.com', - onData: (PreviewResponse data) => _previewData(data), - onError: (error) => _handleError(error)); + PreviewResponse previewResponse = await LinkPreview.getData('https://google.com'); + _previewData(previewResponse); } on PlatformException { print('Error occured!!'); } } _previewData(PreviewResponse previewResponse) { - if (previewResponse.status == PreviewStatus.complete) { + if (previewResponse.status == PreviewStatus.success) { _linkTitle = previewResponse.title; print('==============================================='); print('Received status: ${previewResponse.status}'); @@ -52,12 +51,6 @@ class _MyAppState extends State { } } - static _handleError(error) { - print('==============================================='); - print('Received error: ${error.message}'); - print('==============================================='); - } - @override Widget build(BuildContext context) { return MaterialApp( diff --git a/lib/link_preview.dart b/lib/link_preview.dart index c3bccf1..ffd4b6f 100644 --- a/lib/link_preview.dart +++ b/lib/link_preview.dart @@ -4,6 +4,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; class LinkPreview { + static const MethodChannel methodChannel = MethodChannel('link_preview_method'); static const EventChannel eventChannel = EventChannel('link_preview_events'); static Future getPreview(String url, @@ -18,19 +19,20 @@ class LinkPreview { .asFuture(); } - static _mapData(dynamic event, Function(PreviewResponse model) onData) { - var data = Map.from(event); + static Future getData(String url) async { + var result = await methodChannel.invokeMethod("previewLink", url); + PreviewResponse previewResponse = _mapResultToResponse(result); + return previewResponse; + } - PreviewStatus status; + static PreviewResponse _mapResultToResponse(dynamic result) { + var data = Map.from(result); - if (data['state'] == 'loading') { - status = PreviewStatus.loading; - PreviewResponse previewModel = PreviewResponse(status); - onData(previewModel); - } else { - status = PreviewStatus.complete; - PreviewResponse previewModel = PreviewResponse( - status, + PreviewResponse previewResponse; + + if (data['state'] == 'success') { + previewResponse = PreviewResponse( + PreviewStatus.success, title: data['title'], description: data['description'], image: data['image'], @@ -39,10 +41,39 @@ class LinkPreview { cannonicalUrl: data['cannonical_url'], row: data['row'], htmlCode: data['html_code'], - ); - onData(previewModel); + } else { + previewResponse = PreviewResponse(PreviewStatus.error); } + + return previewResponse; + } + + static _mapData(dynamic event, Function(PreviewResponse model) onData) { + var data = Map.from(event); + + PreviewStatus status; + +// if (data['state'] == 'loading') { +// status = PreviewStatus.loading; +// PreviewResponse previewModel = PreviewResponse(status); +// onData(previewModel); +// } else { +// status = PreviewStatus.complete; +// PreviewResponse previewModel = PreviewResponse( +// status, +// title: data['title'], +// description: data['description'], +// image: data['image'], +// url: data['url'], +// finalUrl: data['final_url'], +// cannonicalUrl: data['cannonical_url'], +// row: data['row'], +// htmlCode: data['html_code'], +// +// ); +// onData(previewModel); +// } } } @@ -68,4 +99,4 @@ class PreviewResponse { this.htmlCode}); } -enum PreviewStatus { loading, complete } +enum PreviewStatus { success, error } From 976a38036542ee4fa52bd801fce0d56aa03d4a5c Mon Sep 17 00:00:00 2001 From: Nikola Date: Sat, 28 Dec 2019 00:23:38 +0100 Subject: [PATCH 2/7] Refactor android plugin --- .gitignore | 2 + .../n1k3c/link_preview/LinkPreviewPlugin.kt | 45 +++++++++---------- example/lib/main.dart | 6 +++ lib/link_preview.dart | 7 ++- 4 files changed, 34 insertions(+), 26 deletions(-) diff --git a/.gitignore b/.gitignore index e9dc58d..994838d 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ .pub/ build/ + +example/.flutter-plugins-dependencies diff --git a/android/src/main/kotlin/com/n1k3c/link_preview/LinkPreviewPlugin.kt b/android/src/main/kotlin/com/n1k3c/link_preview/LinkPreviewPlugin.kt index 10c8531..19760cb 100644 --- a/android/src/main/kotlin/com/n1k3c/link_preview/LinkPreviewPlugin.kt +++ b/android/src/main/kotlin/com/n1k3c/link_preview/LinkPreviewPlugin.kt @@ -1,15 +1,14 @@ package com.n1k3c.link_preview +import com.leocardz.link.preview.library.LinkPreviewCallback +import com.leocardz.link.preview.library.SourceContent +import com.leocardz.link.preview.library.TextCrawler +import io.flutter.plugin.common.EventChannel import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel.MethodCallHandler import io.flutter.plugin.common.MethodChannel.Result import io.flutter.plugin.common.PluginRegistry.Registrar -import com.leocardz.link.preview.library.SourceContent -import com.leocardz.link.preview.library.LinkPreviewCallback -import com.leocardz.link.preview.library.TextCrawler -import io.flutter.plugin.common.EventChannel -import java.util.* private const val STATE = "state" @@ -28,26 +27,32 @@ private const val FIELD_IMAGE = "image" private const val ERROR_TYPE = "Link preview error" -class LinkPreviewPlugin : EventChannel.StreamHandler { +class LinkPreviewPlugin : MethodCallHandler { + companion object { @JvmStatic fun registerWith(registrar: Registrar) { - val eventChannel = EventChannel(registrar.messenger(), "link_preview_events") - eventChannel.setStreamHandler(LinkPreviewPlugin()) + val channel = MethodChannel(registrar.messenger(), "link_preview_channel") + channel.setMethodCallHandler(LinkPreviewPlugin()) } } - override fun onListen(arguments: Any, event: EventChannel.EventSink) { + override fun onMethodCall(call: MethodCall, result: Result) { + if (call.method.equals("previewLink")) { + val url: String? = call.argument("url") + previewLink(url, result) + } else { + result.notImplemented() + } + } + private fun previewLink(url: String?, result: Result) { val data = mutableMapOf() val textCrawler = TextCrawler() val linkPreviewCallback = object : LinkPreviewCallback { - override fun onPre() { - data[STATE] = STATE_LOADING - event.success(data) - } + override fun onPre() {} override fun onPos(sourceContent: SourceContent, b: Boolean) { if (sourceContent.isSuccess) { @@ -61,23 +66,15 @@ class LinkPreviewPlugin : EventChannel.StreamHandler { data[FIELD_ROW] = sourceContent.raw data[FIELD_HTML_CODE] = sourceContent.htmlCode - event.success(data) - event.endOfStream() + result.success(data) } else { - event.error(ERROR_TYPE, "Parsing URL error. Check your URL for typos and/or your connection", "") - event.endOfStream() + result.error(ERROR_TYPE, "Parsing URL error. Check your URL for typos and/or your connection", "") } } } - val url: String? = arguments.toString() - - if (url.isNullOrBlank()) event.error(ERROR_TYPE, "URL is blank", "") + if (url.isNullOrBlank()) result.error(ERROR_TYPE, "URL is blank", "") textCrawler.makePreview(linkPreviewCallback, url) } - - override fun onCancel(p0: Any?) { - - } } diff --git a/example/lib/main.dart b/example/lib/main.dart index c67237c..d1201fa 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -25,6 +25,12 @@ class _MyAppState extends State { try { PreviewResponse previewResponse = await LinkPreview.getData('https://google.com'); _previewData(previewResponse); + + PreviewResponse previewResponse2 = await LinkPreview.getData('https://facebook.com'); + _previewData(previewResponse2); + + PreviewResponse previewResponse3 = await LinkPreview.getData('https://amazon.com'); + _previewData(previewResponse3); } on PlatformException { print('Error occured!!'); } diff --git a/lib/link_preview.dart b/lib/link_preview.dart index ffd4b6f..2899314 100644 --- a/lib/link_preview.dart +++ b/lib/link_preview.dart @@ -4,7 +4,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; class LinkPreview { - static const MethodChannel methodChannel = MethodChannel('link_preview_method'); + static const MethodChannel methodChannel = MethodChannel('link_preview_channel'); static const EventChannel eventChannel = EventChannel('link_preview_events'); static Future getPreview(String url, @@ -20,7 +20,10 @@ class LinkPreview { } static Future getData(String url) async { - var result = await methodChannel.invokeMethod("previewLink", url); + Map args = {}; + args.putIfAbsent("url", () => url); + + var result = await methodChannel.invokeMethod("previewLink", args); PreviewResponse previewResponse = _mapResultToResponse(result); return previewResponse; } From 1acbb6eece209994a12050f80ee1e59576a1777f Mon Sep 17 00:00:00 2001 From: Nikola Date: Sat, 28 Dec 2019 00:33:22 +0100 Subject: [PATCH 3/7] Refactor ios plugin --- .idea/workspace.xml | 58 ++++++++++------ ios/Classes/SwiftLinkPreviewPlugin.swift | 88 +++++++++--------------- 2 files changed, 70 insertions(+), 76 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index b86f08e..6f60124 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -3,12 +3,8 @@ - - - - - - - + + - - + +