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