Files
tencent_kit/lib/src/tencent.dart
2022-03-29 10:59:59 +08:00

239 lines
7.3 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<BaseResp> _respStreamController =
StreamController<BaseResp>.broadcast();
Future<dynamic> _handleMethod(MethodCall call) async {
switch (call.method) {
case _METHOD_ONLOGINRESP:
_respStreamController.add(LoginResp.fromJson(
(call.arguments as Map<dynamic, dynamic>).cast<String, dynamic>()));
break;
case _METHOD_ONSHARERESP:
_respStreamController.add(ShareMsgResp.fromJson(
(call.arguments as Map<dynamic, dynamic>).cast<String, dynamic>()));
break;
}
}
/// 设置是否已授权获取设备信息/是否同意隐私协议
Future<void> setIsPermissionGranted({
required bool granted,
String? buildModel /* android.os.Build.MODEL */,
}) {
return _channel.invokeMethod(
'setIsPermissionGranted',
<String, dynamic>{
'granted': granted,
if (buildModel?.isNotEmpty ?? false) 'build_model': buildModel,
},
);
}
/// 向 Open_SDK 注册
Future<void> registerApp({
required String appId,
String? universalLink,
}) {
return _channel.invokeMethod<void>(
_METHOD_REGISTERAPP,
<String, dynamic>{
_ARGUMENT_KEY_APPID: appId,
if (universalLink?.isNotEmpty ?? false)
_ARGUMENT_KEY_UNIVERSALLINK: universalLink,
},
);
}
///
Stream<BaseResp> respStream() {
return _respStreamController.stream;
}
/// 检查QQ是否已安装
Future<bool> isQQInstalled() async {
return await _channel.invokeMethod<bool>(_METHOD_ISQQINSTALLED) ?? false;
}
/// 检查QQ是否已安装
Future<bool> isTIMInstalled() async {
return await _channel.invokeMethod<bool>(_METHOD_ISTIMINSTALLED) ?? false;
}
/// 登录
Future<void> login({
required List<String> scope,
}) {
return _channel.invokeMethod<void>(
_METHOD_LOGIN,
<String, dynamic>{
_ARGUMENT_KEY_SCOPE: scope.join(','),
},
);
}
/// 登出
Future<void> logout() {
return _channel.invokeMethod<void>(_METHOD_LOGOUT);
}
/// 分享 - 说说
Future<void> shareMood({
required int scene,
String? summary,
List<Uri>? 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<void>(
_METHOD_SHAREMOOD,
<String, dynamic>{
_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<void> shareText({
required int scene,
required String summary,
}) {
assert(scene == TencentScene.SCENE_QQ);
return _channel.invokeMethod<void>(
_METHOD_SHARETEXT,
<String, dynamic>{
_ARGUMENT_KEY_SCENE: scene,
_ARGUMENT_KEY_SUMMARY: summary,
},
);
}
/// 分享 - 图片
Future<void> 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<void>(
_METHOD_SHAREIMAGE,
<String, dynamic>{
_ARGUMENT_KEY_SCENE: scene,
_ARGUMENT_KEY_IMAGEURI: imageUri.toString(),
if (appName?.isNotEmpty ?? false) _ARGUMENT_KEY_APPNAME: appName,
_ARGUMENT_KEY_EXTINT: extInt,
},
);
}
/// 分享 - 音乐
Future<void> 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<void>(
_METHOD_SHAREMUSIC,
<String, dynamic>{
_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<void> shareWebpage({
required int scene,
required String title,
String? summary,
Uri? imageUri,
required String targetUrl,
String? appName,
int extInt = TencentQZoneFlag.DEFAULT,
}) {
return _channel.invokeMethod<void>(
_METHOD_SHAREWEBPAGE,
<String, dynamic>{
_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,
},
);
}
}