From 9878c1108ea99c6154f9c08732135aefe13bb28f Mon Sep 17 00:00:00 2001
From: 13574 <1357496606@qq.com>
Date: Sat, 9 Sep 2023 23:35:17 +0800
Subject: [PATCH] feat: Implemented copy image to clipboard on Android
---
android/app/src/main/AndroidManifest.xml | 17 ++++---
.../kotlin/com/lifegpc/ehf/MainActivity.kt | 10 ++--
.../kotlin/com/lifegpc/ehf/MyApplication.kt | 19 ++++++++
.../ehf/data/litepal/ClipboardImageItem.kt | 10 ++++
.../ehf/{ => data}/mmkv/SAFSettings.kt | 2 +-
.../ehf/provider/ClipboardImageProvider.kt | 6 +++
.../com/lifegpc/ehf/util/ClipboardUtils.kt | 46 +++++++++++++++++++
.../ehf/{ => util}/MethodChannelUtils.kt | 2 +-
.../src/main/res/xml/file_provider_config.xml | 6 +++
lib/platform/clipboard.dart | 9 ++++
10 files changed, 114 insertions(+), 13 deletions(-)
create mode 100644 android/app/src/main/kotlin/com/lifegpc/ehf/MyApplication.kt
create mode 100644 android/app/src/main/kotlin/com/lifegpc/ehf/data/litepal/ClipboardImageItem.kt
rename android/app/src/main/kotlin/com/lifegpc/ehf/{ => data}/mmkv/SAFSettings.kt (82%)
create mode 100644 android/app/src/main/kotlin/com/lifegpc/ehf/provider/ClipboardImageProvider.kt
create mode 100644 android/app/src/main/kotlin/com/lifegpc/ehf/util/ClipboardUtils.kt
rename android/app/src/main/kotlin/com/lifegpc/ehf/{ => util}/MethodChannelUtils.kt (99%)
create mode 100644 android/app/src/main/res/xml/file_provider_config.xml
create mode 100644 lib/platform/clipboard.dart
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 2467925..ee7e305 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -2,7 +2,7 @@
-
-
+
+
+
diff --git a/android/app/src/main/kotlin/com/lifegpc/ehf/MainActivity.kt b/android/app/src/main/kotlin/com/lifegpc/ehf/MainActivity.kt
index e977572..2007dc8 100644
--- a/android/app/src/main/kotlin/com/lifegpc/ehf/MainActivity.kt
+++ b/android/app/src/main/kotlin/com/lifegpc/ehf/MainActivity.kt
@@ -4,25 +4,27 @@ import android.app.Activity
import android.content.Intent
import android.net.Uri
import android.os.Bundle
+import androidx.core.content.FileProvider
import androidx.documentfile.provider.DocumentFile
import com.lifegpc.ehf.annotation.ChannelMethod
-import com.lifegpc.ehf.mmkv.SAFSettings
+import com.lifegpc.ehf.data.mmkv.SAFSettings
+import com.lifegpc.ehf.util.ClipboardUtils
+import com.lifegpc.ehf.util.MethodChannelUtils
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
+import java.io.FileOutputStream
import java.lang.Exception
class MainActivity : FlutterActivity() {
private val safAuthorizationCode = 0x10086
private var safAuthorizationResult: MethodChannel.Result? = null
private var afterAuthSuccess:(()->Unit)?=null
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- }
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannelUtils.registerMethodChannel("lifegpc.eh_downloader_flutter/saf", flutterEngine, this)
+ MethodChannelUtils.registerMethodChannel("lifegpc.eh_downloader_flutter/clipboard",flutterEngine,ClipboardUtils)
}
@ChannelMethod(responseManually = true)
diff --git a/android/app/src/main/kotlin/com/lifegpc/ehf/MyApplication.kt b/android/app/src/main/kotlin/com/lifegpc/ehf/MyApplication.kt
new file mode 100644
index 0000000..6c42296
--- /dev/null
+++ b/android/app/src/main/kotlin/com/lifegpc/ehf/MyApplication.kt
@@ -0,0 +1,19 @@
+package com.lifegpc.ehf
+
+import android.app.Application
+import android.content.Context
+
+class MyApplication:Application() {
+ companion object{
+ @JvmStatic
+ private var mApplicationContext:Context?=null
+ @JvmStatic
+ @get:JvmName("_applicationContext")
+ val applicationContext:Context
+ get() = mApplicationContext!!
+ }
+ override fun onCreate() {
+ super.onCreate()
+ mApplicationContext=applicationContext
+ }
+}
\ No newline at end of file
diff --git a/android/app/src/main/kotlin/com/lifegpc/ehf/data/litepal/ClipboardImageItem.kt b/android/app/src/main/kotlin/com/lifegpc/ehf/data/litepal/ClipboardImageItem.kt
new file mode 100644
index 0000000..d68073b
--- /dev/null
+++ b/android/app/src/main/kotlin/com/lifegpc/ehf/data/litepal/ClipboardImageItem.kt
@@ -0,0 +1,10 @@
+package com.lifegpc.ehf.data.litepal
+
+import org.litepal.crud.LitePalSupport
+
+class ClipboardImageItem(
+ val uuid:String,
+ val mimeType:String
+):LitePalSupport() {
+ val id:Long=0
+}
\ No newline at end of file
diff --git a/android/app/src/main/kotlin/com/lifegpc/ehf/mmkv/SAFSettings.kt b/android/app/src/main/kotlin/com/lifegpc/ehf/data/mmkv/SAFSettings.kt
similarity index 82%
rename from android/app/src/main/kotlin/com/lifegpc/ehf/mmkv/SAFSettings.kt
rename to android/app/src/main/kotlin/com/lifegpc/ehf/data/mmkv/SAFSettings.kt
index 1a4c21a..0612643 100644
--- a/android/app/src/main/kotlin/com/lifegpc/ehf/mmkv/SAFSettings.kt
+++ b/android/app/src/main/kotlin/com/lifegpc/ehf/data/mmkv/SAFSettings.kt
@@ -1,4 +1,4 @@
-package com.lifegpc.ehf.mmkv
+package com.lifegpc.ehf.data.mmkv
import com.dylanc.mmkv.MMKVOwner
import com.dylanc.mmkv.mmkvString
diff --git a/android/app/src/main/kotlin/com/lifegpc/ehf/provider/ClipboardImageProvider.kt b/android/app/src/main/kotlin/com/lifegpc/ehf/provider/ClipboardImageProvider.kt
new file mode 100644
index 0000000..1d2dc8d
--- /dev/null
+++ b/android/app/src/main/kotlin/com/lifegpc/ehf/provider/ClipboardImageProvider.kt
@@ -0,0 +1,6 @@
+package com.lifegpc.ehf.provider
+
+import android.net.Uri
+import androidx.core.content.FileProvider
+
+class ClipboardImageProvider:FileProvider()
\ No newline at end of file
diff --git a/android/app/src/main/kotlin/com/lifegpc/ehf/util/ClipboardUtils.kt b/android/app/src/main/kotlin/com/lifegpc/ehf/util/ClipboardUtils.kt
new file mode 100644
index 0000000..5a00831
--- /dev/null
+++ b/android/app/src/main/kotlin/com/lifegpc/ehf/util/ClipboardUtils.kt
@@ -0,0 +1,46 @@
+package com.lifegpc.ehf.util
+
+import android.content.ClipData
+import android.content.ClipboardManager
+import android.content.Context
+import androidx.core.content.FileProvider
+import com.lifegpc.ehf.MyApplication
+import com.lifegpc.ehf.annotation.ChannelMethod
+import java.io.File
+import java.util.UUID
+
+object ClipboardUtils {
+ private const val AUTHORITY="com.lifegpc.ehf.ClipboardImageProvider"
+ @ChannelMethod
+ fun copyImageToClipboard(mimeType:String,byteArray: ByteArray){
+ val file= saveToImageCache(mimeType, byteArray)
+ val uri=FileProvider.getUriForFile(MyApplication.applicationContext, AUTHORITY,file)
+
+ val cbm=MyApplication.applicationContext.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
+ val clipData=ClipData("image", arrayOf(mimeType),ClipData.Item(uri))
+ cbm.setPrimaryClip(clipData)
+ }
+
+ private fun saveToImageCache(mimeType:String,byteArray: ByteArray):File{
+ val dir=File(MyApplication.applicationContext.filesDir,"images")
+ if (!dir.exists()){
+ dir.mkdirs()
+ }
+ val name=UUID.randomUUID().toString()
+
+ val file=File(dir,"$name.${mimeTypeToExtName(mimeType)}")
+
+ file.outputStream().use {
+ it.write(byteArray)
+ }
+
+ return file
+ }
+
+ private fun mimeTypeToExtName(mimeType: String)=when(mimeType){
+ "image/png"->"png"
+ "image/jpeg"->"png"
+ "image/gif"->"gif"
+ else->throw IllegalArgumentException("$mimeType is not supported")
+ }
+}
\ No newline at end of file
diff --git a/android/app/src/main/kotlin/com/lifegpc/ehf/MethodChannelUtils.kt b/android/app/src/main/kotlin/com/lifegpc/ehf/util/MethodChannelUtils.kt
similarity index 99%
rename from android/app/src/main/kotlin/com/lifegpc/ehf/MethodChannelUtils.kt
rename to android/app/src/main/kotlin/com/lifegpc/ehf/util/MethodChannelUtils.kt
index 84a2af0..b096d40 100644
--- a/android/app/src/main/kotlin/com/lifegpc/ehf/MethodChannelUtils.kt
+++ b/android/app/src/main/kotlin/com/lifegpc/ehf/util/MethodChannelUtils.kt
@@ -1,4 +1,4 @@
-package com.lifegpc.ehf
+package com.lifegpc.ehf.util
import android.util.Log
import com.lifegpc.ehf.annotation.ChannelMethod
diff --git a/android/app/src/main/res/xml/file_provider_config.xml b/android/app/src/main/res/xml/file_provider_config.xml
new file mode 100644
index 0000000..9f55b7e
--- /dev/null
+++ b/android/app/src/main/res/xml/file_provider_config.xml
@@ -0,0 +1,6 @@
+
+
+
+
\ No newline at end of file
diff --git a/lib/platform/clipboard.dart b/lib/platform/clipboard.dart
new file mode 100644
index 0000000..eff1bcf
--- /dev/null
+++ b/lib/platform/clipboard.dart
@@ -0,0 +1,9 @@
+import 'package:flutter/services.dart';
+
+class Clipboard{
+ final MethodChannel _clipboardChannel=const MethodChannel("lifegpc.eh_downloader_flutter/clipboard");
+
+ Future copyImageToClipboard(String mimeType,Uint8List bytes)async{
+ return _clipboardChannel.invokeMethod("copyImageToClipboard",[mimeType,bytes]);
+ }
+}
\ No newline at end of file