Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import java.io.File
import java.io.IOException
import java.util.*
import kotlin.coroutines.CoroutineContext
import android.os.Build
import io.flutter.plugin.common.MethodChannel.Result


/***
Expand Down Expand Up @@ -65,6 +67,7 @@ internal interface FluwxShareHandler : CoroutineScope {
"shareVideo" -> shareVideo(call, result)
"shareWebPage" -> shareWebPage(call, result)
"shareFile" -> shareFile(call, result)
"shareEmoji" -> shareEmoji(call, result)
else -> {
result.notImplemented()
}
Expand Down Expand Up @@ -266,6 +269,39 @@ internal interface FluwxShareHandler : CoroutineScope {
}
}

private fun shareEmoji(call: MethodCall, result: Result) {

val scene = call.argument<Int>("scene") ?: 0
val title = call.argument<String>("title")
val desc = call.argument<String>("description")
val thumbData = call.argument<ByteArray>("thumbData")

val emojiMap = call.argument<Map<String, Any?>>("source")
?: run { result.error("ARG", "emoji is null", null); return }

val emojiObj = WXEmojiObject().apply {
when {
emojiMap["uint8List"] != null -> emojiData = emojiMap["uint8List"] as ByteArray
emojiMap["path"] != null -> emojiPath = ensurePublicPath(emojiMap["path"] as String)
else -> { result.error("ARG", "gif source missing", null); return }
}
}

val msg = WXMediaMessage(emojiObj).apply {
this.thumbData = thumbData
this.title = title
this.description = desc
}

val req = SendMessageToWX.Req().apply {
transaction = "emoji${System.currentTimeMillis()}"
message = msg
this.scene = scene
}

result.success(WXAPiHandler.wxApi?.sendReq(req))
}

private suspend fun sendRequestInMain(result: MethodChannel.Result, request: BaseReq) =
withContext(Dispatchers.Main) {
result.success(WXAPiHandler.wxApi?.sendReq(request))
Expand Down Expand Up @@ -326,6 +362,17 @@ internal interface FluwxShareHandler : CoroutineScope {

}

private fun loadBytesFromFlutterAsset(assetKey: String): ByteArray =
context.assets.open(assetKey.removePrefix("flutterassets/")).use { it.readBytes() }

private fun ensurePublicPath(original: String): String {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) return original
val src = File(original)
val dst = File(context.externalCacheDir, src.name)
if (!dst.exists()) src.copyTo(dst, overwrite = true)
return dst.path
}

private val supportFileProvider: Boolean
get() = (WXAPiHandler.wxApi?.wxAppSupportAPI ?: 0) >= 0x27000D00
private val targetHigherThanN: Boolean get() = android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N
Expand Down
33 changes: 33 additions & 0 deletions ios/Classes/FluwxPlugin.m
Original file line number Diff line number Diff line change
Expand Up @@ -509,6 +509,8 @@ - (void)handleShare:(FlutterMethodCall *)call result:(FlutterResult)result {
[self shareMiniProgram:call result:result];
} else if ([@"shareFile" isEqualToString:call.method]) {
[self shareFile:call result:result];
} else if ([@"shareEmoji" isEqualToString:call.method]) {
[self shareEmoji:call result:result];
}
}

Expand Down Expand Up @@ -739,6 +741,37 @@ - (void)shareMiniProgram:(FlutterMethodCall *)call result:(FlutterResult)result
});
}

- (void)shareEmoji:(FlutterMethodCall *)call result:(FlutterResult)result {

NSNumber *sceneNum = call.arguments[fluwxKeyScene];
enum WXScene scene = [self intToWeChatScene:sceneNum];

NSDictionary *sourceEmoji = call.arguments[keySource];
FlutterStandardTypedData *flutterEmojiData = sourceEmoji[@"uint8List"];
NSData *emojiData = flutterEmojiData != nil ? flutterEmojiData.data : nil;

FlutterStandardTypedData *flutterThumbData = call.arguments[fluwxKeyThumbData];
NSData *thumbData = ![flutterThumbData isKindOfClass:[NSNull class]] ? flutterThumbData.data : nil;

NSString *msgSignature = call.arguments[fluwxKeyMsgSignature];
NSString *thumbHash = call.arguments[fluwxKeyThumbDataHash];

dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
dispatch_async(globalQueue, ^{
dispatch_async(dispatch_get_main_queue(), ^{

[self sendEmotionData:emojiData
InScene:scene
MsgSignature:msgSignature
ThumbData:thumbData
ThumbDataHash:thumbHash
completion:^(BOOL success) {
result(@(success));
}];
});
});
}

- (NSData *)getNsDataFromWeChatFile:(NSDictionary *)weChatFile {
NSNumber *schema = weChatFile[@"schema"];

Expand Down
26 changes: 26 additions & 0 deletions lib/src/foundation/share_models.dart
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,32 @@ class WeChatShareFileModel extends WeChatShareModel {
};
}

class WeChatShareEmojiModel extends WeChatShareModel {
final WeChatImageToShare emoji;
final WeChatScene scene;

WeChatShareEmojiModel(
this.emoji, {
this.scene = WeChatScene.session,
super.title,
super.description,
super.msgSignature,
super.thumbData,
super.thumbDataHash,
});

@override
Map<String, dynamic> get arguments => {
_scene: scene.index,
_source: emoji.arguments,
_title: title,
_description: description,
_msgSignature: msgSignature,
_thumbData: thumbData,
_thumbDataHash: thumbDataHash,
};
}

class WeChatImageToShare with _Argument {
final Uint8List? uint8List;
final String? localImagePath;
Expand Down
8 changes: 6 additions & 2 deletions lib/src/method_channel/fluwx_method_channel.dart
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ class MethodChannelFluwx extends FluwxPlatform {
WeChatShareWebPageModel: 'shareWebPage',
WeChatShareMiniProgramModel: 'shareMiniProgram',
WeChatShareFileModel: 'shareFile',
WeChatShareEmojiModel: 'shareEmoji',
};

final StreamController<WeChatResponse> _responseEventHandler =
Expand Down Expand Up @@ -100,9 +101,12 @@ class MethodChannelFluwx extends FluwxPlatform {
Future<bool> open(OpenType target) async {
switch (target) {
case WeChatApp():
return await methodChannel.invokeMethod('openWXApp', target.arguments) ?? false;
return await methodChannel.invokeMethod(
'openWXApp', target.arguments) ??
false;
case Browser():
return await methodChannel.invokeMethod('openUrl', target.arguments) ?? false;
return await methodChannel.invokeMethod('openUrl', target.arguments) ??
false;
case RankList():
return await methodChannel.invokeMethod("openRankList") ?? false;
case BusinessView():
Expand Down