import 'dart:async'; import 'package:flutter/services.dart'; import 'package:tencent_kit/src/model/resp.dart'; import 'package:tencent_kit/src/tencent_constant.dart'; /// class Tencent { /// Tencent._(); static Tencent get instance => _instance; static final Tencent _instance = Tencent._(); static const String _METHOD_REGISTERAPP = 'registerApp'; static const String _METHOD_ISQQINSTALLED = 'isQQInstalled'; static const String _METHOD_ISTIMINSTALLED = 'isTIMInstalled'; static const String _METHOD_LOGIN = 'login'; static const String _METHOD_LOGOUT = 'logout'; static const String _METHOD_SHAREMOOD = 'shareMood'; static const String _METHOD_SHARETEXT = 'shareText'; static const String _METHOD_SHAREIMAGE = 'shareImage'; static const String _METHOD_SHAREMUSIC = 'shareMusic'; static const String _METHOD_SHAREWEBPAGE = 'shareWebpage'; static const String _METHOD_ONLOGINRESP = 'onLoginResp'; static const String _METHOD_ONSHARERESP = 'onShareResp'; static const String _ARGUMENT_KEY_APPID = 'appId'; static const String _ARGUMENT_KEY_UNIVERSALLINK = 'universalLink'; static const String _ARGUMENT_KEY_SCOPE = 'scope'; static const String _ARGUMENT_KEY_SCENE = 'scene'; static const String _ARGUMENT_KEY_TITLE = 'title'; static const String _ARGUMENT_KEY_SUMMARY = 'summary'; static const String _ARGUMENT_KEY_IMAGEURI = 'imageUri'; static const String _ARGUMENT_KEY_IMAGEURIS = 'imageUris'; static const String _ARGUMENT_KEY_VIDEOURI = 'videoUri'; static const String _ARGUMENT_KEY_MUSICURL = 'musicUrl'; static const String _ARGUMENT_KEY_TARGETURL = 'targetUrl'; static const String _ARGUMENT_KEY_APPNAME = 'appName'; static const String _ARGUMENT_KEY_EXTINT = 'extInt'; static const String _SCHEME_FILE = 'file'; late final MethodChannel _channel = const MethodChannel('v7lin.github.io/tencent_kit') ..setMethodCallHandler(_handleMethod); final StreamController _respStreamController = StreamController.broadcast(); Future _handleMethod(MethodCall call) async { switch (call.method) { case _METHOD_ONLOGINRESP: _respStreamController.add(LoginResp.fromJson( (call.arguments as Map).cast())); break; case _METHOD_ONSHARERESP: _respStreamController.add(ShareMsgResp.fromJson( (call.arguments as Map).cast())); break; } } /// 设置是否已授权获取设备信息/是否同意隐私协议 Future setIsPermissionGranted({ required bool granted, String? buildModel /* android.os.Build.MODEL */, }) { return _channel.invokeMethod( 'setIsPermissionGranted', { 'granted': granted, if (buildModel?.isNotEmpty ?? false) 'build_model': buildModel, }, ); } /// 向 Open_SDK 注册 Future registerApp({ required String appId, String? universalLink, }) { return _channel.invokeMethod( _METHOD_REGISTERAPP, { _ARGUMENT_KEY_APPID: appId, if (universalLink?.isNotEmpty ?? false) _ARGUMENT_KEY_UNIVERSALLINK: universalLink, }, ); } /// Stream respStream() { return _respStreamController.stream; } /// 检查QQ是否已安装 Future isQQInstalled() async { return await _channel.invokeMethod(_METHOD_ISQQINSTALLED) ?? false; } /// 检查QQ是否已安装 Future isTIMInstalled() async { return await _channel.invokeMethod(_METHOD_ISTIMINSTALLED) ?? false; } /// 登录 Future login({ required List scope, }) { return _channel.invokeMethod( _METHOD_LOGIN, { _ARGUMENT_KEY_SCOPE: scope.join(','), }, ); } /// 登出 Future logout() { return _channel.invokeMethod(_METHOD_LOGOUT); } /// 分享 - 说说 Future shareMood({ required int scene, String? summary, List? imageUris, Uri? videoUri, }) { assert(scene == TencentScene.SCENE_QZONE); assert((summary?.isNotEmpty ?? false) || ((imageUris?.isNotEmpty ?? false) && imageUris! .every((Uri element) => element.isScheme(_SCHEME_FILE))) || (videoUri != null && videoUri.isScheme(_SCHEME_FILE))); return _channel.invokeMethod( _METHOD_SHAREMOOD, { _ARGUMENT_KEY_SCENE: scene, if (summary?.isNotEmpty ?? false) _ARGUMENT_KEY_SUMMARY: summary, if (imageUris?.isNotEmpty ?? false) _ARGUMENT_KEY_IMAGEURIS: imageUris!.map((Uri imageUri) => imageUri.toString()).toList(), if (videoUri != null) _ARGUMENT_KEY_VIDEOURI: videoUri.toString(), }, ); } /// 分享 - 文本(Android调用的是系统API,故而不会有回调) Future shareText({ required int scene, required String summary, }) { assert(scene == TencentScene.SCENE_QQ); return _channel.invokeMethod( _METHOD_SHARETEXT, { _ARGUMENT_KEY_SCENE: scene, _ARGUMENT_KEY_SUMMARY: summary, }, ); } /// 分享 - 图片 Future shareImage({ required int scene, required Uri imageUri, String? appName, int extInt = TencentQZoneFlag.DEFAULT, }) { assert(scene == TencentScene.SCENE_QQ); assert(imageUri.isScheme(_SCHEME_FILE)); return _channel.invokeMethod( _METHOD_SHAREIMAGE, { _ARGUMENT_KEY_SCENE: scene, _ARGUMENT_KEY_IMAGEURI: imageUri.toString(), if (appName?.isNotEmpty ?? false) _ARGUMENT_KEY_APPNAME: appName, _ARGUMENT_KEY_EXTINT: extInt, }, ); } /// 分享 - 音乐 Future shareMusic({ required int scene, required String title, String? summary, Uri? imageUri, required String musicUrl, required String targetUrl, String? appName, int extInt = TencentQZoneFlag.DEFAULT, }) { assert(scene == TencentScene.SCENE_QQ); return _channel.invokeMethod( _METHOD_SHAREMUSIC, { _ARGUMENT_KEY_SCENE: scene, _ARGUMENT_KEY_TITLE: title, if (summary?.isNotEmpty ?? false) _ARGUMENT_KEY_SUMMARY: summary, if (imageUri != null) _ARGUMENT_KEY_IMAGEURI: imageUri.toString(), _ARGUMENT_KEY_MUSICURL: musicUrl, _ARGUMENT_KEY_TARGETURL: targetUrl, if (appName?.isNotEmpty ?? false) _ARGUMENT_KEY_APPNAME: appName, _ARGUMENT_KEY_EXTINT: extInt, }, ); } /// 分享 - 网页 Future shareWebpage({ required int scene, required String title, String? summary, Uri? imageUri, required String targetUrl, String? appName, int extInt = TencentQZoneFlag.DEFAULT, }) { return _channel.invokeMethod( _METHOD_SHAREWEBPAGE, { _ARGUMENT_KEY_SCENE: scene, _ARGUMENT_KEY_TITLE: title, if (summary?.isNotEmpty ?? false) _ARGUMENT_KEY_SUMMARY: summary, if (imageUri != null) _ARGUMENT_KEY_IMAGEURI: imageUri.toString(), _ARGUMENT_KEY_TARGETURL: targetUrl, if (appName?.isNotEmpty ?? false) _ARGUMENT_KEY_APPNAME: appName, _ARGUMENT_KEY_EXTINT: extInt, }, ); } }