├── .gitignore
├── .idea
├── .gitignore
├── AndroidProjectSystem.xml
├── compiler.xml
├── deploymentTargetSelector.xml
├── gradle.xml
├── migrations.xml
├── misc.xml
├── runConfigurations.xml
└── vcs.xml
├── README.md
├── app
├── .gitignore
├── build.gradle.kts
├── obf-dict.txt
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── assets
│ └── xposed_init
│ ├── java
│ └── com
│ │ └── owo233
│ │ └── tcqt
│ │ ├── ActionManager.kt
│ │ ├── MainEntry.kt
│ │ ├── data
│ │ └── ConstData.kt
│ │ ├── entries
│ │ ├── GroupRecallMessage.kt
│ │ ├── MessagePush.kt
│ │ └── TrpcOidb.kt
│ │ ├── ext
│ │ ├── IAction.kt
│ │ ├── Json.kt
│ │ ├── Kotlinx.kt
│ │ ├── XpClassLoader.kt
│ │ └── Xposed.kt
│ │ ├── hooks
│ │ ├── BrowserRestrictMitigation.kt
│ │ ├── FakeMultiWindowStatus.kt
│ │ ├── FetchService.kt
│ │ ├── LoginCheckBoxDefault.kt
│ │ ├── ModuleUpdate.kt
│ │ ├── OneClickLikes.kt
│ │ ├── RemoveQRLoginCheck.kt
│ │ ├── SkipQRLoginWait.kt
│ │ ├── helper
│ │ │ ├── AioListener.kt
│ │ │ ├── ContactHelper.kt
│ │ │ ├── KernelServiceHelper.kt
│ │ │ ├── LocalGrayTips.kt
│ │ │ └── NTServiceFetcher.kt
│ │ └── maple
│ │ │ ├── Maple.kt
│ │ │ ├── MapleContact.kt
│ │ │ └── MapleMsgRecord.kt
│ │ ├── internals
│ │ ├── QQInterfaces.kt
│ │ ├── helper
│ │ │ └── GroupHelper.kt
│ │ └── msf
│ │ │ └── MsfHandler.kt
│ │ └── utils
│ │ ├── Log.kt
│ │ └── PlatformTools.kt
│ ├── proto
│ └── com
│ │ └── owo233
│ │ └── tcqt
│ │ └── entries
│ │ ├── InfoSyncPush.proto
│ │ ├── MsgPush.proto
│ │ └── QQMessage.proto
│ └── res
│ ├── drawable
│ └── icon.xml
│ └── values
│ ├── arrays.xml
│ ├── colors.xml
│ └── strings.xml
├── build.gradle.kts
├── gradle.properties
├── gradle
├── libs.versions.toml
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── qqinterface
├── .gitignore
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── java
│ ├── androidx
│ └── lifecycle
│ │ └── LifecycleOwner.java
│ ├── com
│ ├── qq
│ │ └── jce
│ │ │ └── wup
│ │ │ └── UniPacket.java
│ └── tencent
│ │ ├── common
│ │ └── app
│ │ │ └── AppInterface.java
│ │ ├── mobileqq
│ │ ├── activity
│ │ │ └── VisitorsActivity.java
│ │ ├── app
│ │ │ ├── BaseBusinessHandler.java
│ │ │ ├── BusinessHandler.java
│ │ │ ├── BusinessHandlerFactory.java
│ │ │ └── OidbWrapper.java
│ │ ├── data
│ │ │ ├── CardProfile.java
│ │ │ └── troop
│ │ │ │ ├── TroopMemberInfo.java
│ │ │ │ └── TroopMemberNickInfo.java
│ │ ├── msf
│ │ │ └── sdk
│ │ │ │ └── MsfCommand.java
│ │ ├── pb
│ │ │ ├── ByteStringMicro.java
│ │ │ ├── MessageMicro.java
│ │ │ ├── PBBoolField.java
│ │ │ ├── PBBytesField.java
│ │ │ ├── PBEnumField.java
│ │ │ ├── PBField.java
│ │ │ ├── PBFloatField.java
│ │ │ ├── PBInt32Field.java
│ │ │ ├── PBInt64Field.java
│ │ │ ├── PBPrimitiveField.java
│ │ │ ├── PBRepeatField.java
│ │ │ ├── PBRepeatMessageField.java
│ │ │ ├── PBStringField.java
│ │ │ ├── PBUInt32Field.java
│ │ │ └── PBUInt64Field.java
│ │ ├── profile
│ │ │ └── vote
│ │ │ │ └── VoteHelper.java
│ │ ├── profilecard
│ │ │ └── base
│ │ │ │ └── component
│ │ │ │ └── AbsProfileHeaderComponent.java
│ │ ├── qfix
│ │ │ └── ApplicationDelegate.java
│ │ ├── qroute
│ │ │ ├── QRoute.java
│ │ │ └── QRouteApi.java
│ │ ├── troop
│ │ │ └── api
│ │ │ │ └── ITroopMemberInfoService.java
│ │ ├── vas
│ │ │ └── api
│ │ │ │ ├── IVasManager.java
│ │ │ │ └── IVasSingedApi.java
│ │ └── vip
│ │ │ └── IVipStatusManager.java
│ │ ├── qphone
│ │ └── base
│ │ │ ├── remote
│ │ │ ├── FromServiceMsg.java
│ │ │ ├── SimpleAccount.java
│ │ │ └── ToServiceMsg.java
│ │ │ └── util
│ │ │ └── BaseApplication.java
│ │ └── qqnt
│ │ ├── kernel
│ │ ├── api
│ │ │ ├── IKernelService.java
│ │ │ └── impl
│ │ │ │ ├── KernelServiceImpl.java
│ │ │ │ └── MsgService.java
│ │ └── nativeinterface
│ │ │ ├── AVRecordElement.java
│ │ │ ├── ArkElement.java
│ │ │ ├── CalendarElement.java
│ │ │ ├── Contact.java
│ │ │ ├── EmojiAD.java
│ │ │ ├── EmojiMall.java
│ │ │ ├── EmojiZPlan.java
│ │ │ ├── FaceBubbleElement.java
│ │ │ ├── FaceElement.java
│ │ │ ├── FileElement.java
│ │ │ ├── GiphyElement.java
│ │ │ ├── IAddJsonGrayTipMsgCallback.java
│ │ │ ├── IClientKeyCallback.java
│ │ │ ├── IKernelGetUidInfoCallback.java
│ │ │ ├── IKernelGetUinInfoCallback.java
│ │ │ ├── IKernelGroupService.java
│ │ │ ├── IKernelMsgListener.java
│ │ │ ├── IKernelMsgService.java
│ │ │ ├── IKernelRichMediaService.java
│ │ │ ├── IKernelTicketListener.java
│ │ │ ├── IKernelTicketService.java
│ │ │ ├── IKernelUixConvertService.java
│ │ │ ├── IOperateCallback.java
│ │ │ ├── IQQNTWrapperSession.java
│ │ │ ├── InlineKeyboardButton.java
│ │ │ ├── InlineKeyboardElement.java
│ │ │ ├── InlineKeyboardRow.java
│ │ │ ├── JsonGrayBusiId.java
│ │ │ ├── JsonGrayElement.java
│ │ │ ├── LinkInfo.java
│ │ │ ├── MarkdownElement.java
│ │ │ ├── MarketFaceElement.java
│ │ │ ├── MarketFaceSupportSize.java
│ │ │ ├── MsgConstant.java
│ │ │ ├── MsgElement.java
│ │ │ ├── MsgRecord.java
│ │ │ ├── MultiForwardMsgElement.java
│ │ │ ├── PicElement.java
│ │ │ ├── PttElement.java
│ │ │ ├── ReplyAbsElement.java
│ │ │ ├── ReplyAbsFaceElement.java
│ │ │ ├── ReplyElement.java
│ │ │ ├── RichMediaFilePathInfo.java
│ │ │ ├── SessionTicket.java
│ │ │ ├── ShareLocationElement.java
│ │ │ ├── SmallYellowFaceInfo.java
│ │ │ ├── StructLongMsgElement.java
│ │ │ ├── StructMsgElement.java
│ │ │ ├── SubscribeMsgTemplateID.java
│ │ │ ├── TextElement.java
│ │ │ ├── VideoCodecFormatType.java
│ │ │ ├── VideoElement.java
│ │ │ └── XmlToJsonParam.java
│ │ ├── kernelpublic
│ │ └── nativeinterface
│ │ │ ├── Contact.java
│ │ │ ├── JsonGrayElement.java
│ │ │ └── XmlToJsonParam.java
│ │ └── troopmemberlist
│ │ ├── ITroopMemberListRepoApi.java
│ │ └── g.java
│ ├── mqq
│ └── app
│ │ ├── AppRuntime.java
│ │ ├── BaseActivity.java
│ │ ├── MobileQQ.java
│ │ └── api
│ │ └── IRuntimeService.java
│ └── tencent
│ └── im
│ └── oidb
│ └── oidb_sso.java
└── settings.gradle.kts
/.gitignore:
--------------------------------------------------------------------------------
1 | # Built application files
2 | *.apk
3 | *.ap_
4 | app/build/
5 | app/src/main/gen/
6 | app/src/main/bin/
7 | cmake-build-*
8 | release/
9 | debug/
10 |
11 | # Kotlin sessions
12 | .kotlin/
13 |
14 | # Generated files
15 | bin/
16 | gen/
17 | out/
18 | app/.cxx/
19 | # Gradle files
20 | .gradle/
21 | build/
22 |
23 | # Local configuration file (sdk path, etc)
24 | local.properties
25 |
26 | # Log Files
27 | *.log
28 |
29 | # IntelliJ
30 | *.iml
31 | .idea/
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # 默认忽略的文件
2 | /shelf/
3 | /workspace.xml
4 |
--------------------------------------------------------------------------------
/.idea/AndroidProjectSystem.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/deploymentTargetSelector.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
19 |
20 |
--------------------------------------------------------------------------------
/.idea/migrations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.idea/runConfigurations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # TCQT 模块
2 |
3 | > 🧠 一个基于 Xposed 框架的 QQ 消息防撤回模块,无需注入 SO,通过拦截并分析数据包实现。
4 |
5 | > 😄 模块名字乱取的,无需在意。
6 |
7 | > 👌 功能默认全部启用,无选择开关,无需进行任何配置。
8 |
9 | ---
10 |
11 | ## ⚠️ 提示
12 |
13 | 如果发现宿主无法长时间在后台存留(挂后台或者锁屏后过一段时间重新打开宿主却冷启动了),如果手机操作系统为MIUI(澎湃OS),考虑把宿主的省点策略改为【无限制】,将宿主APP进行后台加锁操作以及打开宿主的自启动开关。
14 |
15 | 这是因为MIUI(澎湃OS)的MiuiMemoryService会莫名其妙的杀死宿主的MSF进程,宿主有一套自己的进程管理规则,当它发现自己是一个孤儿进程后会进行“自我毁灭”操作。
16 |
17 | 其他操作系统也可以进行如上设置,确保宿主状态。
18 |
19 | ---
20 |
21 | ## ✨ 简介
22 |
23 | TCQT 是专为 Android QQ/TIM 客户端打造的 Xposed 模块,用于拦截并保留原本会被“撤回”的消息。模块不依赖于 native 层(SO 文件注入),完全通过应用层的数据包分析实现。
24 |
25 | ---
26 |
27 | ## 📱 支持环境
28 |
29 | - QQ/TIM Android 客户端(NT架构)
30 | - Android 8.1~16(建议搭配 LSPosed 使用)
31 | - Xposed 环境(Xposed / LSPosed)
32 |
33 | ---
34 |
35 | ## 🚀 安装方式
36 |
37 | 1. 安装 LSPosed(推荐)或 Xposed;
38 | 2. 安装本模块 APK;
39 | 3. 在 Xposed 管理器中启用模块,并重启 QQ;
40 | 4. Done!你已经让“撤回”成为历史了 ✅
41 |
42 | ---
43 |
44 | ## 🤪 一些小功能
45 |
46 | - 禁用内置浏览器的URL风险检查
47 | - 登录页自动勾选用户协议复选框
48 | - 移除长按或相册扫码的登录限制
49 | - 伪装非多窗口模式
50 | - 跳过扫码登录等待
51 | - 一键点赞(SVIP20次,否则10次)
52 |
53 | ---
54 |
55 | ## 🙏 声明
56 |
57 | 本模块仅供学习与技术研究之用,禁止用于任何恶意用途。请尊重他人隐私与社交权利,合理使用本工具。
58 |
59 | ---
60 |
61 | > 🧩 本模块致力于 **透明通信与数字记忆**,在信息时代,撤回不应意味着抹除一切。
62 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/app/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import com.google.protobuf.gradle.proto
2 | import org.jetbrains.kotlin.gradle.dsl.JvmTarget
3 |
4 | plugins {
5 | alias(libs.plugins.android.application)
6 | alias(libs.plugins.kotlin.android)
7 | alias(libs.plugins.protobuf)
8 | kotlin("plugin.serialization") version "2.2.0"
9 | }
10 |
11 | android {
12 | namespace = "com.owo233.tcqt"
13 | compileSdk = 36
14 |
15 | defaultConfig {
16 | applicationId = "com.owo233.tcqt"
17 | minSdk = 27
18 | targetSdk = 36
19 | versionCode = 37
20 | versionName = "2.0"
21 | buildConfigField("String", "APP_NAME", "\"TCQT\"")
22 | buildConfigField("Long", "BUILD_TIMESTAMP", "${System.currentTimeMillis()}L")
23 | }
24 |
25 | buildFeatures {
26 | buildConfig = true
27 | }
28 | buildTypes {
29 | release {
30 | isMinifyEnabled = true
31 | isShrinkResources = true
32 | proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
33 | }
34 | }
35 | packaging {
36 | resources.excludes.addAll(
37 | arrayOf(
38 | "google/**",
39 | "kotlin/**",
40 | "META-INF/**",
41 | "WEB-INF/**",
42 | "**.bin",
43 | "kotlin-tooling-metadata.json"
44 | )
45 | )
46 | }
47 |
48 | sourceSets {
49 | named("main") {
50 | proto {
51 | srcDirs("src/main/proto")
52 | }
53 | }
54 | }
55 |
56 | applicationVariants.all {
57 | outputs.all {
58 | val output = this as com.android.build.gradle.internal.api.BaseVariantOutputImpl
59 | output.outputFileName?.let { fileName ->
60 | if (fileName.endsWith(".apk")) {
61 | val projectName = rootProject.name
62 | val versionName = defaultConfig.versionName
63 | output.outputFileName = "${projectName}_v${versionName}.apk"
64 | }
65 | }
66 | }
67 | }
68 |
69 | compileOptions {
70 | sourceCompatibility = JavaVersion.VERSION_17
71 | targetCompatibility = JavaVersion.VERSION_17
72 | }
73 | kotlin {
74 | compilerOptions {
75 | jvmTarget.set(JvmTarget.JVM_17)
76 | freeCompilerArgs.set(listOf(
77 | "-Xno-call-assertions",
78 | "-Xno-param-assertions",
79 | "-Xno-receiver-assertions"
80 | ))
81 | }
82 | }
83 | }
84 |
85 | protobuf {
86 | protoc {
87 | artifact = "com.google.protobuf:protoc:3.25.3"
88 | }
89 | generateProtoTasks {
90 | all().forEach { task ->
91 | task.builtins {
92 | create("java") {
93 | option("lite")
94 | }
95 | }
96 | }
97 | }
98 | }
99 |
100 | dependencies {
101 | compileOnly(libs.xposed.api)
102 | compileOnly(project(":qqinterface"))
103 | implementation(libs.androidx.core)
104 | implementation(libs.androidx.core.ktx)
105 | implementation(libs.kotlinx.io.jvm)
106 | implementation(libs.kotlinx.coroutines.android)
107 | implementation(libs.kotlinx.serialization.json)
108 | implementation(libs.kotlinx.serialization.protobuf)
109 | implementation(libs.protobuf.java)
110 | }
111 |
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 |
23 | # 保留Hook入口
24 | -keep class com.owo233.tcqt.MainEntry implements de.robv.android.xposed.IXposedHookLoadPackage
25 | -keep class com.owo233.tcqt.MainEntry {
26 | public void handleLoadPackage(de.robv.android.xposed.callbacks.XC_LoadPackage$LoadPackageParam);
27 | }
28 |
29 |
30 | # 保留所有 @Serializable 注解的类和它们的序列化器
31 | #-keep @kotlinx.serialization.Serializable class * {
32 | # public static kotlinx.serialization.KSerializer serializer(...);
33 | #}
34 |
35 | -if @kotlinx.serialization.Serializable class **
36 | -keepclassmembers class <1> {
37 | static <1>$Companion Companion;
38 | }
39 |
40 | -if @kotlinx.serialization.Serializable class ** {
41 | static **$* *;
42 | }
43 | -keepclassmembers class <2>$<3> {
44 | kotlinx.serialization.KSerializer serializer(...);
45 | }
46 |
47 | -if @kotlinx.serialization.Serializable class ** {
48 | public static ** INSTANCE;
49 | }
50 | -keepclassmembers class <1> {
51 | public static <1> INSTANCE;
52 | kotlinx.serialization.KSerializer serializer(...);
53 | }
54 |
55 | # 保留 IAction 实现类的无参构造
56 | -keepclassmembers class * implements com.owo233.tcqt.ext.IAction {
57 | public ();
58 | }
59 |
60 | # 保留 IAction 接口
61 | -keep interface com.owo233.tcqt.ext.IAction
62 |
63 | # 保留 ActionProcess 枚举
64 | -keep enum com.owo233.tcqt.ext.ActionProcess
65 |
66 | # 大多数 volatile 字段是由 AtomicFU(Kotlin 的原子操作库)自动处理的,不应该被改名或删除。
67 | -keepclassmembers class kotlinx.io.** {
68 | volatile ;
69 | }
70 |
71 | -keepclassmembers class kotlinx.coroutines.io.** {
72 | volatile ;
73 | }
74 |
75 | -keepclassmembernames class kotlinx.io.** {
76 | volatile ;
77 | }
78 |
79 | -keepclassmembernames class kotlinx.coroutines.io.** {
80 | volatile ;
81 | }
82 |
83 | # protobuf
84 | -keepclassmembers class com.owo233.tcqt.entries.**OuterClass$** {
85 | ;
86 | ;
87 | }
88 |
89 | # 忽略 kotlin.jvm.internal.Intrinsics 的检查
90 | -assumenosideeffects class kotlin.jvm.internal.Intrinsics {
91 | public static void check*(...);
92 | public static void throw*(...);
93 | }
94 |
95 | # 忽略 java.util.Objects 的检查
96 | -assumenosideeffects class java.util.Objects {
97 | public static ** requireNonNull(...);
98 | }
99 |
100 | -obfuscationdictionary obf-dict.txt
101 | -classobfuscationdictionary obf-dict.txt
102 | -packageobfuscationdictionary obf-dict.txt
103 | -repackageclasses ''
104 | -allowaccessmodification
105 | -overloadaggressively
106 |
107 | -keepattributes LineNumberTable,SourceFile
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
10 |
13 |
16 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/app/src/main/assets/xposed_init:
--------------------------------------------------------------------------------
1 | com.owo233.tcqt.MainEntry
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/ActionManager.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt
2 |
3 | import android.content.Context
4 | import com.owo233.tcqt.ext.ActionProcess
5 | import com.owo233.tcqt.ext.IAction
6 | import com.owo233.tcqt.hooks.BrowserRestrictMitigation
7 | import com.owo233.tcqt.hooks.FakeMultiWindowStatus
8 | import com.owo233.tcqt.hooks.FetchService
9 | import com.owo233.tcqt.hooks.LoginCheckBoxDefault
10 | import com.owo233.tcqt.hooks.ModuleUpdate
11 | import com.owo233.tcqt.hooks.OneClickLikes
12 | import com.owo233.tcqt.hooks.RemoveQRLoginCheck
13 | import com.owo233.tcqt.hooks.SkipQRLoginWait
14 |
15 | object ActionManager {
16 |
17 | private val FIRST_ACTION = arrayOf(
18 | FetchService::class.java, // 防止群和好友消息撤回
19 | BrowserRestrictMitigation::class.java, // 移除内置浏览器访问限制
20 | LoginCheckBoxDefault::class.java, // 自动勾选登录页用户协议复选框
21 | RemoveQRLoginCheck::class.java, // 移除长按或相册扫码登录限制
22 | FakeMultiWindowStatus::class.java, // 伪装非多窗口模式
23 | SkipQRLoginWait::class.java, // 跳过扫码登录等待
24 | OneClickLikes::class.java, // 一键点赞
25 | ModuleUpdate::class.java, // 模块更新干掉宿主
26 | )
27 |
28 | private val instanceMap = hashMapOf, IAction>()
29 |
30 | private fun instanceOf(cls: Class<*>): IAction = instanceMap.getOrPut(cls) {
31 | cls.getConstructor().newInstance() as IAction
32 | }
33 |
34 | fun runFirst(ctx: Context, proc: ActionProcess) {
35 | val baseProcs = setOf(ActionProcess.MSF, ActionProcess.MAIN, ActionProcess.TOOL)
36 |
37 | FIRST_ACTION.forEach {
38 | val action = instanceOf(it)
39 |
40 | val shouldRun = ActionProcess.ALL in action.processes
41 | || proc in action.processes
42 | || (ActionProcess.OTHER in action.processes && proc !in baseProcs)
43 |
44 | if (shouldRun) {
45 | action(ctx)
46 | }
47 | }
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/MainEntry.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt
2 |
3 | import android.content.Context
4 | import com.owo233.tcqt.ext.ActionProcess
5 | import com.owo233.tcqt.ext.FuzzyClassKit
6 | import com.owo233.tcqt.ext.XpClassLoader
7 | import com.owo233.tcqt.ext.afterHook
8 | import com.owo233.tcqt.ext.hookMethod
9 | import com.owo233.tcqt.utils.PlatformTools
10 | import com.owo233.tcqt.utils.logE
11 | import com.owo233.tcqt.utils.logI
12 | import de.robv.android.xposed.IXposedHookLoadPackage
13 | import de.robv.android.xposed.callbacks.XC_LoadPackage
14 | import mqq.app.MobileQQ
15 | import java.lang.reflect.Modifier
16 |
17 | class MainEntry: IXposedHookLoadPackage {
18 | private var firstStageInit = false
19 |
20 | override fun handleLoadPackage(lpparam: XC_LoadPackage.LoadPackageParam) {
21 | if (lpparam.packageName == PACKAGE_NAME_QQ || lpparam.packageName == PACKAGE_NAME_TIM) {
22 | entryQQ(lpparam.classLoader)
23 | }
24 | }
25 |
26 | @Suppress("UNCHECKED_CAST")
27 | private fun entryQQ(classLoader: ClassLoader) {
28 | val startup = afterHook(51) {
29 | runCatching {
30 | it.thisObject.javaClass.classLoader?.also { loader ->
31 | XpClassLoader.ctxClassLoader = loader
32 |
33 | val app = loader.loadClass("com.tencent.common.app.BaseApplicationImpl")
34 | .declaredFields.first { f -> f.type.name == "com.tencent.common.app.BaseApplicationImpl" }
35 | .apply { isAccessible = true }
36 | .get(null) as? Context
37 |
38 | app?.let(::execStartupInit)
39 | }
40 | }.onFailure { e ->
41 | logE(msg = "startup 异常", cause = e)
42 | }
43 | }
44 |
45 | runCatching {
46 | val map = FuzzyClassKit.findClassesByField(classLoader, "com.tencent.mobileqq.startup.task.config") { _, f ->
47 | f.type == HashMap::class.java && Modifier.isStatic(f.modifiers)
48 | }.firstNotNullOfOrNull { clz ->
49 | clz.declaredFields.firstOrNull {
50 | it.type == HashMap::class.java && Modifier.isStatic(it.modifiers)
51 | }?.apply { isAccessible = true }?.get(null) as? HashMap>
52 | } ?: return@runCatching logE(msg = "startup: 找不到静态 HashMap 字段")
53 |
54 | map.entries.firstOrNull { it.key.contains("LoadDex", ignoreCase = true) }?.value
55 | ?.declaredMethods?.firstOrNull {
56 | it.parameterTypes.size == 1 && it.parameterTypes[0] == Context::class.java
57 | }?.hookMethod(startup)
58 |
59 | firstStageInit = true
60 | }.onFailure {
61 | logE(msg = "entryQQ 异常", cause = it)
62 | }
63 | }
64 |
65 | private fun execStartupInit(ctx: Context) {
66 | if (secStaticStageInited) return
67 |
68 | val classLoader = ctx.classLoader.also { requireNotNull(it) }
69 | XpClassLoader.hostClassLoader = classLoader
70 |
71 | if (injectClassloader(MainEntry::class.java.classLoader!!)) {
72 | if ("114514" != System.getProperty("TCQT_flag")) {
73 | System.setProperty("TCQT_flag", "114514")
74 | } else return
75 |
76 | // logI(msg = "PName = " + MobileQQ.getMobileQQ().qqProcessName)
77 |
78 | secStaticStageInited = true
79 |
80 | ActionManager.runFirst(ctx, when {
81 | PlatformTools.isMainProcess() -> ActionProcess.MAIN
82 | PlatformTools.isMsfProcess() -> ActionProcess.MSF
83 | PlatformTools.isToolProcess() -> ActionProcess.TOOL
84 | else -> ActionProcess.OTHER
85 | })
86 | }
87 | }
88 |
89 | private fun injectClassloader(moduleLoader: ClassLoader): Boolean {
90 | if (runCatching {
91 | moduleLoader.loadClass("mqq.app.MobileQQ")
92 | }.isSuccess) {
93 | // logI(msg = "ModuleClassloader already injected.")
94 | return true
95 | }
96 |
97 | val parent = moduleLoader.parent
98 | val field = ClassLoader::class.java.declaredFields
99 | .first { it.name == "parent" }
100 | field.isAccessible =true
101 |
102 | field.set(XpClassLoader, parent)
103 |
104 | if (XpClassLoader.load("mqq.app.MobileQQ") == null) {
105 | logE(msg = "XpClassLoader inject failed.")
106 | return false
107 | }
108 |
109 | field.set(moduleLoader, XpClassLoader)
110 |
111 | return runCatching {
112 | Class.forName("mqq.app.MobileQQ")
113 | }.onFailure {
114 | logE(msg = "Classloader inject failed.")
115 | }.onSuccess {
116 | // logI(msg = "Classloader inject successfully.")
117 | }.isSuccess
118 | }
119 |
120 | companion object {
121 | @JvmStatic var secStaticStageInited = false
122 |
123 | internal const val PACKAGE_NAME_QQ = "com.tencent.mobileqq"
124 | internal const val PACKAGE_NAME_TIM = "com.tencent.tim"
125 | }
126 | }
127 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/data/ConstData.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt.data
2 |
3 | import com.owo233.tcqt.BuildConfig
4 |
5 | object BuildWrapper {
6 | val DEBUG = BuildConfig.DEBUG
7 | const val APPLICATION_ID = BuildConfig.APPLICATION_ID
8 | const val VERSION_CODE = BuildConfig.VERSION_CODE
9 | const val VERSION_NAME = BuildConfig.VERSION_NAME
10 | const val APP_NAME = BuildConfig.APP_NAME
11 | }
12 |
13 | object TCQTBuild {
14 | const val APP_ID = BuildWrapper.APPLICATION_ID
15 | const val APP_NAME = BuildWrapper.APP_NAME
16 | const val VER_CODE = BuildWrapper.VERSION_CODE
17 | const val VER_NAME = BuildWrapper.VERSION_NAME
18 | const val HOOK_TAG = APP_NAME
19 | }
20 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/entries/GroupRecallMessage.kt:
--------------------------------------------------------------------------------
1 | @file:OptIn(ExperimentalSerializationApi::class)
2 |
3 | package com.owo233.tcqt.entries
4 |
5 | import kotlinx.serialization.ExperimentalSerializationApi
6 | import kotlinx.serialization.Serializable
7 | import kotlinx.serialization.protobuf.ProtoNumber
8 |
9 | @Serializable
10 | data class C2CRecallMessage(
11 | @ProtoNumber(1) val info: C2cRecallMsgInfo
12 | )
13 |
14 | @Serializable
15 | data class C2cRecallMsgInfo(
16 | @ProtoNumber(1) val senderUid: String,
17 | @ProtoNumber(2) val receiverUid: String,
18 | @ProtoNumber(3) val msgClientSeq: Long = Long.MIN_VALUE,
19 | @ProtoNumber(4) val msgUid: Long = Long.MIN_VALUE,
20 | @ProtoNumber(5) val msgTime: Long = Long.MIN_VALUE,
21 |
22 | @ProtoNumber(13) val wording: RecallWording? = null,
23 | @ProtoNumber(20) val msgSeq: Long = Long.MIN_VALUE,
24 | )
25 |
26 | @Serializable
27 | data class GroupRecallMessage(
28 | @ProtoNumber(1) val type: UInt,
29 | @ProtoNumber(4) val peerId: ULong,
30 | @ProtoNumber(11) val operation: GroupRecallOperation,
31 | )
32 |
33 | @Serializable
34 | data class GroupRecallOperation(
35 | @ProtoNumber(1) val operatorUid: String? = null,
36 | @ProtoNumber(3) val msgInfo: GroupRecallMsgInfo? = null,
37 | @ProtoNumber(9) val wording: RecallWording? = null
38 | )
39 |
40 | @Serializable
41 | data class GroupRecallMsgInfo(
42 | @ProtoNumber(1) val msgSeq: Long = Long.MIN_VALUE,
43 | @ProtoNumber(2) val msgTime: Long = Long.MIN_VALUE,
44 | @ProtoNumber(6) val senderUid: String? = null
45 | )
46 |
47 | @Serializable
48 | data class RecallWording(
49 | @ProtoNumber(2) val wording: String? = null
50 | )
51 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/entries/MessagePush.kt:
--------------------------------------------------------------------------------
1 | @file:OptIn(ExperimentalSerializationApi::class)
2 |
3 | package com.owo233.tcqt.entries
4 |
5 | import com.owo233.tcqt.ext.EMPTY_BYTE_ARRAY
6 | import kotlinx.serialization.ExperimentalSerializationApi
7 | import kotlinx.serialization.Serializable
8 | import kotlinx.serialization.protobuf.ProtoNumber
9 |
10 | @Serializable
11 | data class MessagePush(
12 | @ProtoNumber(1) var msgBody: Message
13 | )
14 |
15 | @Serializable
16 | data class Message(
17 | @ProtoNumber(1) var msgHead: MessageHead,
18 | @ProtoNumber(2) var content: MessageContentInfo,
19 | @ProtoNumber(3) var body: MessageBody? = null
20 | )
21 |
22 | @Serializable
23 | data class MessageHead(
24 | @ProtoNumber(1) val peerId: UInt = UInt.MIN_VALUE,
25 | @ProtoNumber(2) val peerUid: String? = null,
26 | @ProtoNumber(5) val targetId: Long = Long.MIN_VALUE,
27 | @ProtoNumber(6) val targetUid: String? = null
28 | )
29 |
30 | @Serializable
31 | data class MessageContentInfo(
32 | @ProtoNumber(1) val msgType: Int = Int.MIN_VALUE,
33 | @ProtoNumber(2) val msgSubType: Int = Int.MIN_VALUE,
34 | @ProtoNumber(3) val subType: Int = Int.MIN_VALUE,
35 | @ProtoNumber(5) val msgSeq: Int = Int.MIN_VALUE,
36 | @ProtoNumber(6) val msgTime: Long = Long.MIN_VALUE,
37 | @ProtoNumber(12) val msgUid: Long = Long.MIN_VALUE,
38 | )
39 |
40 | @Serializable
41 | data class MessageBody(
42 | @ProtoNumber(1) val richMsg: NTRichText? = null,
43 | @ProtoNumber(2) val msgContent: ByteArray? = EMPTY_BYTE_ARRAY,
44 | )
45 |
46 | @Serializable
47 | data class NTRichText(
48 | @ProtoNumber(2) val elems: ArrayList? = null
49 | )
50 |
51 | @Serializable
52 | data class Elem(
53 | @ProtoNumber(1) val text: Text? = null,
54 | )
55 |
56 | @Serializable
57 | data class Text(
58 | @ProtoNumber(1) val text: String? = null,
59 | @ProtoNumber(12) val resv: ByteArray? = null
60 | )
61 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/entries/TrpcOidb.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt.entries
2 |
3 | import kotlinx.serialization.ExperimentalSerializationApi
4 | import kotlinx.serialization.Serializable
5 | import kotlinx.serialization.protobuf.ProtoNumber
6 |
7 | @OptIn(ExperimentalSerializationApi::class)
8 | @Serializable
9 | data class TrpcOidb(
10 | @ProtoNumber(1) val cmd: Int = Int.MIN_VALUE,
11 | @ProtoNumber(2) val service: Int = Int.MIN_VALUE,
12 | @ProtoNumber(3) val result: UInt? = null,
13 | @ProtoNumber(4) val buffer: ByteArray? = null,
14 | @ProtoNumber(5) val msg: String? = null,
15 | //@ProtoNumber(11) val traceParams: Map = mapOf(),
16 | @ProtoNumber(12) val flag: Int = Int.MIN_VALUE,
17 | )
18 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/ext/IAction.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt.ext
2 |
3 | import android.content.Context
4 | import com.owo233.tcqt.utils.logE
5 |
6 | enum class ActionProcess {
7 | MSF, MAIN, TOOL,
8 | OTHER, // 非上述三个
9 | ALL, // 全部进程
10 | }
11 |
12 | interface IAction {
13 | operator fun invoke(ctx: Context) {
14 | runCatching {
15 | if (canRun(ctx)) onRun(ctx)
16 | }.onFailure {
17 | logE(msg = "invoke Action 异常", cause = it)
18 | }
19 | }
20 |
21 | fun onRun(ctx: Context)
22 |
23 | fun canRun(ctx: Context): Boolean = true // TODO 需要更详细的机制
24 |
25 | val name: String
26 |
27 | val processes: Set
28 | }
29 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/ext/Json.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt.ext
2 |
3 | import kotlinx.serialization.json.Json
4 | import kotlinx.serialization.json.JsonArray
5 | import kotlinx.serialization.json.JsonElement
6 | import kotlinx.serialization.json.JsonObject
7 | import kotlinx.serialization.json.JsonPrimitive
8 | import kotlinx.serialization.json.boolean
9 | import kotlinx.serialization.json.booleanOrNull
10 | import kotlinx.serialization.json.int
11 | import kotlinx.serialization.json.jsonArray
12 | import kotlinx.serialization.json.jsonObject
13 | import kotlinx.serialization.json.jsonPrimitive
14 | import kotlinx.serialization.json.long
15 |
16 | val EmptyJsonObject = JsonObject(emptyMap())
17 | val EmptyJsonArray = JsonArray(emptyList())
18 | val EmptyJsonString = "".json
19 |
20 | val GlobalJson = Json {
21 | ignoreUnknownKeys = true // 忽略未知key
22 | isLenient = true // 宽松模式
23 | allowSpecialFloatingPointValues = true // 允许特殊浮点数值(如NaN)
24 | encodeDefaults = false // 不编码默认值
25 | prettyPrint = false // 格式化输出
26 | coerceInputValues = true // 强制输入值
27 | }
28 |
29 | val String.asJson: JsonElement
30 | get() = Json.parseToJsonElement(this)
31 |
32 | val String.asJsonObject: JsonObject
33 | get() = Json.parseToJsonElement(this).asJsonObject
34 |
35 | @Suppress("UNCHECKED_CAST")
36 | val Collection.json: JsonArray
37 | get() {
38 | val arrayList = arrayListOf()
39 | forEach {
40 | when (it) {
41 | is JsonElement -> arrayList.add(it)
42 | is Number -> arrayList.add(it.json)
43 | is String -> arrayList.add(it.json)
44 | is Boolean -> arrayList.add(it.json)
45 | is Map<*, *> -> arrayList.add((it as Map).json)
46 | is Collection<*> -> arrayList.add((it as Collection).json)
47 | else -> error("unknown array type: ${it::class.java}")
48 | }
49 | }
50 | return arrayList.jsonArray
51 | }
52 |
53 | @Suppress("UNCHECKED_CAST")
54 | val Map.json: JsonObject
55 | get() {
56 | val map = hashMapOf()
57 | forEach { (key, any) ->
58 | if (any != null) {
59 | when (any) {
60 | is JsonElement -> map[key] = any
61 | is Number -> map[key] = any.json
62 | is String -> map[key] = any.json
63 | is Boolean -> map[key] = any.json
64 | is Map<*, *> -> map[key] = (any as Map).json
65 | is Collection<*> -> map[key] = (any as Collection).json
66 | else -> error("unknown object type: ${any::class.java}")
67 | }
68 | }
69 | }
70 | return map.jsonObject
71 | }
72 |
73 | val Map.jsonObject: JsonObject
74 | get() = JsonObject(this)
75 |
76 | val Collection.jsonArray: JsonArray
77 | get() = JsonArray(this.toList())
78 |
79 | val Boolean.json: JsonPrimitive
80 | get() = JsonPrimitive(this)
81 |
82 | val String.json: JsonPrimitive
83 | get() = JsonPrimitive(this)
84 |
85 | val Number.json: JsonPrimitive
86 | get() = JsonPrimitive(this)
87 |
88 | val JsonElement?.asString: String
89 | get() = this!!.jsonPrimitive.content
90 |
91 | val JsonElement?.asStringOrNull: String?
92 | get() = this?.jsonPrimitive?.content
93 |
94 | val JsonElement?.asInt: Int
95 | get() = this!!.jsonPrimitive.int
96 |
97 | val JsonElement?.asLong: Long
98 | get() = this!!.jsonPrimitive.long
99 |
100 | val JsonElement?.asLongOrNull: Long?
101 | get() = this?.jsonPrimitive?.long
102 |
103 | val JsonElement?.asIntOrNull: Int?
104 | get() = this?.jsonPrimitive?.int
105 |
106 | val JsonElement?.asBoolean: Boolean
107 | get() = this!!.jsonPrimitive.boolean
108 |
109 | val JsonElement?.asBooleanOrNull: Boolean?
110 | get() = this?.jsonPrimitive?.booleanOrNull
111 |
112 | inline val JsonElement?.asJsonObject: JsonObject
113 | get() = this!!.jsonObject
114 |
115 | inline val JsonElement?.asJsonObjectOrNull: JsonObject?
116 | get() = this?.jsonObject
117 |
118 | inline val JsonElement?.asJsonArray: JsonArray
119 | get() = this!!.jsonArray
120 |
121 | inline val JsonElement?.asJsonArrayOrNull: JsonArray?
122 | get() = this?.jsonArray
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/ext/Kotlinx.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt.ext
2 |
3 | import com.owo233.tcqt.utils.logE
4 | import kotlinx.coroutines.CoroutineScope
5 | import kotlinx.coroutines.CoroutineStart
6 | import kotlinx.coroutines.Job
7 | import kotlinx.coroutines.launch
8 | import kotlin.coroutines.CoroutineContext
9 | import kotlin.coroutines.EmptyCoroutineContext
10 |
11 | val EMPTY_BYTE_ARRAY = ByteArray(0)
12 |
13 | class Nullable(
14 | private var value: T?
15 | ) {
16 | fun get(): T {
17 | return value!!
18 | }
19 |
20 | fun getOrNull(): T? {
21 | return value
22 | }
23 |
24 | fun isNull(): Boolean {
25 | return value == null
26 | }
27 |
28 | fun isNotNull(): Boolean {
29 | return value != null
30 | }
31 |
32 | fun set(value: T?) {
33 | this.value = value
34 | }
35 | }
36 |
37 | fun nullableOf(data: T? = null): Nullable {
38 | return Nullable(data)
39 | }
40 |
41 | fun ByteArray.sliceSafe(off: Int, length: Int = size - off): ByteArray {
42 | if (isEmpty() || off >= size || length <= 0) return EMPTY_BYTE_ARRAY
43 |
44 | val safeLen = minOf(length, size - off)
45 | return ByteArray(safeLen).also {
46 | System.arraycopy(this, off, it, 0, safeLen)
47 | }
48 | }
49 |
50 | @JvmOverloads
51 | fun ByteArray?.toHexString(uppercase: Boolean = false): String {
52 | if (this == null) return "null"
53 |
54 | val hexChars = if (uppercase) "0123456789ABCDEF" else "0123456789abcdef"
55 | val result = StringBuilder(this.size * 2)
56 |
57 | for (b in this) {
58 | val i = b.toInt() and 0xFF
59 | result.append(hexChars[i ushr 4])
60 | result.append(hexChars[i and 0x0F])
61 | }
62 |
63 | return result.toString()
64 | }
65 |
66 | fun String?.ifNullOrEmpty(defaultValue: () -> String?): String? {
67 | return if (this.isNullOrEmpty()) defaultValue() else this
68 | }
69 |
70 | @JvmOverloads
71 | fun String.hex2ByteArray(replace: Boolean = false): ByteArray {
72 | val hex = if (replace) {
73 | buildString(length) {
74 | for (c in this@hex2ByteArray) {
75 | if (!c.isWhitespace()) append(c)
76 | }
77 | }
78 | } else this
79 |
80 | if (hex.length % 2 != 0) {
81 | throw IllegalArgumentException("Hex string length must be even: $hex")
82 | }
83 |
84 | val result = ByteArray(hex.length / 2)
85 | for (i in result.indices) {
86 | val hi = hex[i * 2].digitToIntOrNull(16)
87 | val lo = hex[i * 2 + 1].digitToIntOrNull(16)
88 | if (hi == null || lo == null) {
89 | throw IllegalArgumentException("Invalid hex character in: $hex at index ${i * 2}")
90 | }
91 | result[i] = ((hi shl 4) or lo).toByte()
92 | }
93 | return result
94 | }
95 |
96 | fun CoroutineScope.launchWithCatch(
97 | context: CoroutineContext = EmptyCoroutineContext,
98 | start: CoroutineStart = CoroutineStart.DEFAULT,
99 | onError: (Throwable) -> Unit = { e -> logE(msg = "launchWithCatch 异常", cause = e) },
100 | block: suspend CoroutineScope.() -> Unit
101 | ): Job {
102 | return launch(context, start) {
103 | runCatching { block() }
104 | .onFailure { onError(it) }
105 | }
106 | }
107 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/ext/XpClassLoader.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt.ext
2 |
3 | object XpClassLoader: ClassLoader() {
4 | lateinit var hostClassLoader: ClassLoader
5 | lateinit var ctxClassLoader: ClassLoader
6 |
7 | internal val moduleLoader: ClassLoader = XpClassLoader::class.java.classLoader!!
8 |
9 | fun load(name: String): Class<*>? {
10 | return runCatching {
11 | loadClass(name)
12 | }.getOrNull()
13 | }
14 |
15 | private fun getSimpleName(className: String): String {
16 | var name = className
17 | if (name.startsWith('L') && name.endsWith(';') || name.contains('/')) {
18 | var flag = 0
19 | if (name.startsWith('L')) {
20 | flag = flag or (1 shl 1)
21 | }
22 | if (name.endsWith(';')) {
23 | flag = flag or 1
24 | }
25 | if (flag > 0) {
26 | name = name.substring(flag shr 1, name.length - (flag and 1))
27 | }
28 | name = name.replace('/', '.')
29 | }
30 | return name
31 | }
32 |
33 | override fun loadClass(className: String): Class<*>? {
34 | val name = getSimpleName(className)
35 | return runCatching {
36 | hostClassLoader.loadClass(name)
37 | }.getOrElse {
38 | runCatching {
39 | ctxClassLoader.loadClass(name)
40 | }.getOrElse {
41 | super.loadClass(name)
42 | }
43 | }
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/hooks/BrowserRestrictMitigation.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt.hooks
2 |
3 | import android.content.Context
4 | import android.os.Bundle
5 | import com.owo233.tcqt.ext.ActionProcess
6 | import com.owo233.tcqt.ext.FuzzyClassKit
7 | import com.owo233.tcqt.ext.IAction
8 | import com.owo233.tcqt.ext.beforeHook
9 | import com.owo233.tcqt.ext.hookMethod
10 |
11 | class BrowserRestrictMitigation: IAction {
12 |
13 | override fun onRun(ctx: Context) {
14 | FuzzyClassKit.findMethodByClassPrefix(
15 | prefix = "com.tencent.mobileqq.webview.WebSecurityPluginV2",
16 | isSubClass = true
17 | ) { _, method ->
18 | method.parameterCount == 1 && method.parameterTypes[0] == Bundle::class.java
19 | }?.hookMethod(beforeHook {
20 | val bundle = it.args[0] as Bundle
21 | if (bundle.getInt("jumpResult", 0) != 0) {
22 | bundle.putInt("jumpResult", 0)
23 | bundle.putString("jumpUrl", "")
24 | }
25 | })
26 | }
27 |
28 | override val name: String get() = "禁用内置浏览器访问限制"
29 |
30 | override val processes: Set get() = setOf(ActionProcess.TOOL)
31 | }
32 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/hooks/FakeMultiWindowStatus.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt.hooks
2 |
3 | import android.app.Activity
4 | import android.content.Context
5 | import com.owo233.tcqt.ext.ActionProcess
6 | import com.owo233.tcqt.ext.IAction
7 | import com.owo233.tcqt.ext.afterHook
8 | import com.owo233.tcqt.ext.hookMethod
9 |
10 | class FakeMultiWindowStatus: IAction {
11 |
12 | override fun onRun(ctx: Context) {
13 | Activity::class.java.getDeclaredMethod("isInMultiWindowMode")
14 | .hookMethod(afterHook {
15 | it.result = false
16 | })
17 |
18 | Activity::class.java.getDeclaredMethod("isInPictureInPictureMode")
19 | .hookMethod(afterHook {
20 | it.result = false
21 | })
22 | }
23 |
24 | override val name: String get() = "伪装多窗口状态"
25 |
26 | override val processes: Set get() = setOf(ActionProcess.ALL)
27 | }
28 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/hooks/FetchService.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt.hooks
2 |
3 | import android.app.ActivityManager
4 | import android.content.Context
5 | import android.os.Process
6 | import com.owo233.tcqt.ext.ActionProcess
7 | import com.owo233.tcqt.ext.IAction
8 | import com.owo233.tcqt.ext.hookMethod
9 | import com.owo233.tcqt.hooks.helper.NTServiceFetcher
10 | import com.owo233.tcqt.utils.logI
11 | import com.tencent.qqnt.kernel.api.IKernelService
12 | import com.tencent.qqnt.kernel.api.impl.KernelServiceImpl
13 | import mqq.app.MobileQQ
14 |
15 | class FetchService: IAction {
16 |
17 | override fun onRun(ctx: Context) {
18 | killMsfService()
19 | KernelServiceImpl::class.java.hookMethod("initService").after {
20 | val service = it.thisObject as IKernelService
21 | NTServiceFetcher.onFetch(service)
22 | }
23 | }
24 |
25 | @Suppress("DEPRECATION")
26 | private fun getMsfServiceInfo(): ActivityManager.RunningServiceInfo? {
27 | val context = MobileQQ.getContext()
28 | val am = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
29 | val services = am.getRunningServices(Int.MAX_VALUE)
30 |
31 | return services.firstOrNull { service ->
32 | service.service.className == MSF_SERVICE_NAME &&
33 | service.service.packageName == context.packageName
34 | }
35 | }
36 |
37 | private fun killMsfService() {
38 | val info = getMsfServiceInfo() ?: return
39 | logI(msg = "kill msf service pid = ${info.pid}")
40 | Process.killProcess(info.pid)
41 | }
42 |
43 | override val name: String get() = "消息防撤回"
44 |
45 | override val processes: Set get() = setOf(ActionProcess.MAIN)
46 |
47 | companion object {
48 | private const val MSF_SERVICE_NAME = "com.tencent.mobileqq.msf.service.MsfService"
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/hooks/LoginCheckBoxDefault.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt.hooks
2 |
3 | import android.content.Context
4 | import android.widget.CheckBox
5 | import com.owo233.tcqt.ext.ActionProcess
6 | import com.owo233.tcqt.ext.IAction
7 | import com.owo233.tcqt.ext.afterHook
8 | import de.robv.android.xposed.XposedBridge
9 |
10 | class LoginCheckBoxDefault: IAction {
11 |
12 | companion object {
13 | private val loginContextNames = setOf(
14 | "com.tencent.mobileqq.activity.LoginActivity",
15 | "com.tencent.mobileqq.activity.LoginPublicFragmentActivity"
16 | )
17 | }
18 |
19 | override fun onRun(ctx: Context) {
20 | XposedBridge.hookAllConstructors(CheckBox::class.java, afterHook {
21 | val context = it.args.getOrNull(0) as? Context ?: return@afterHook
22 | val className = context.javaClass.name
23 |
24 | if (!loginContextNames.contains(className)) return@afterHook
25 |
26 | val checkBox = it.thisObject as CheckBox
27 |
28 | if (!checkBox.isChecked) {
29 | checkBox.post { checkBox.isChecked = true }
30 | }
31 | })
32 | }
33 |
34 | override val name: String get() = "默认勾选复选框协议"
35 |
36 | override val processes: Set get() = setOf(ActionProcess.MAIN)
37 | }
38 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/hooks/ModuleUpdate.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt.hooks
2 |
3 | import android.content.BroadcastReceiver
4 | import android.content.Context
5 | import android.content.Intent
6 | import android.content.IntentFilter
7 | import com.owo233.tcqt.data.TCQTBuild
8 | import com.owo233.tcqt.ext.ActionProcess
9 | import com.owo233.tcqt.ext.IAction
10 | import kotlin.system.exitProcess
11 |
12 | class ModuleUpdate: IAction {
13 |
14 | override fun onRun(ctx: Context) {
15 | val intent = IntentFilter()
16 | intent.addAction("android.intent.action.PACKAGE_ADDED")
17 | intent.addAction("android.intent.action.PACKAGE_REMOVED")
18 | intent.addAction("android.intent.action.PACKAGE_REPLACED")
19 | intent.addDataScheme("package")
20 |
21 | val companion = object: BroadcastReceiver() {
22 | override fun onReceive(context: Context, intent: Intent) {
23 | when(intent.action) {
24 | "android.intent.action.PACKAGE_ADDED",
25 | "android.intent.action.PACKAGE_REMOVED",
26 | "android.intent.action.PACKAGE_REPLACED" -> {
27 | val packageName = intent.data?.schemeSpecificPart
28 | if (packageName == TCQTBuild.APP_ID) {
29 | Thread.sleep(100)
30 | exitProcess(0)
31 | }
32 | }
33 | }
34 | }
35 | }
36 |
37 | ctx.registerReceiver(companion, intent)
38 | }
39 |
40 | override val name: String get() = "模块更新干掉宿主"
41 |
42 | override val processes: Set get() = setOf(ActionProcess.MAIN)
43 | }
44 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/hooks/OneClickLikes.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt.hooks
2 |
3 | import android.content.Context
4 | import android.view.View
5 | import android.widget.ImageView
6 | import com.owo233.tcqt.ext.ActionProcess
7 | import com.owo233.tcqt.ext.IAction
8 | import com.owo233.tcqt.ext.hookMethod
9 | import com.owo233.tcqt.internals.QQInterfaces
10 | import com.owo233.tcqt.utils.PlatformTools
11 | import com.owo233.tcqt.utils.logE
12 | import com.tencent.mobileqq.activity.VisitorsActivity
13 | import com.tencent.mobileqq.data.CardProfile
14 | import com.tencent.mobileqq.profile.vote.VoteHelper
15 | import com.tencent.mobileqq.profilecard.base.component.AbsProfileHeaderComponent
16 | import com.tencent.mobileqq.vas.api.IVasSingedApi
17 | import de.robv.android.xposed.XposedBridge
18 |
19 | class OneClickLikes: IAction {
20 |
21 | override fun onRun(ctx: Context) {
22 | // TIM不支持点赞行为
23 | if (PlatformTools.isMqq()) {
24 | val vote = VoteHelper::class.java.declaredMethods.firstOrNull {
25 | it.parameterCount == 2 && it.parameterTypes[0] == CardProfile::class.java && it.parameterTypes[1] == ImageView::class.java
26 | }
27 | val voteHelperField = VisitorsActivity::class.java.declaredFields.firstOrNull {
28 | it.type == VoteHelper::class.java
29 | }
30 |
31 | if (vote == null || voteHelperField == null) {
32 | logE(msg = "获取点赞方法失败")
33 | return
34 | }
35 |
36 | voteHelperField.isAccessible = true
37 | VisitorsActivity::class.java.hookMethod("onClick").before {
38 | val view = it.args[0] as View
39 | val tag = view.tag
40 |
41 | if (tag == null || tag !is CardProfile) return@before
42 |
43 | val voteHelper = voteHelperField.get(it.thisObject) as VoteHelper
44 | for (i in 0.. get() = setOf(ActionProcess.MAIN)
79 |
80 | }
81 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/hooks/RemoveQRLoginCheck.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt.hooks
2 |
3 | import android.content.Context
4 | import com.owo233.tcqt.ext.ActionProcess
5 | import com.owo233.tcqt.ext.IAction
6 | import com.owo233.tcqt.ext.XpClassLoader
7 | import com.owo233.tcqt.ext.beforeHook
8 | import com.owo233.tcqt.ext.hookMethod
9 |
10 | class RemoveQRLoginCheck: IAction {
11 |
12 | override fun onRun(ctx: Context) {
13 | XpClassLoader.load("com.tencent.open.agent.QrAgentLoginManager")
14 | ?.declaredMethods
15 | ?.firstOrNull {
16 | it.returnType == Void.TYPE && it.parameterTypes.size == 3 && it.parameterTypes[0] == Boolean::class.java
17 | }?.hookMethod(beforeHook {
18 | it.args[0] = false
19 | })
20 | }
21 |
22 | override val name: String get() = "移除扫码登录检查"
23 |
24 | override val processes: Set get() = setOf(ActionProcess.MAIN)
25 | }
26 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/hooks/SkipQRLoginWait.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt.hooks
2 |
3 | import android.content.Context
4 | import android.os.CountDownTimer
5 | import com.owo233.tcqt.ext.ActionProcess
6 | import com.owo233.tcqt.ext.FuzzyClassKit
7 | import com.owo233.tcqt.ext.IAction
8 | import com.owo233.tcqt.ext.beforeHook
9 | import de.robv.android.xposed.XposedBridge
10 |
11 | class SkipQRLoginWait: IAction {
12 |
13 | override fun onRun(ctx: Context) {
14 | FuzzyClassKit.findClassByMethod(
15 | prefix = "com.tencent.biz.qrcode.activity.QRLoginAuthActivity",
16 | isSubClass = true
17 | ) { clz, _ -> clz.superclass == CountDownTimer::class.java }
18 | ?.let {
19 | XposedBridge.hookAllConstructors(it, beforeHook { param ->
20 | param.args[1] = 0
21 | param.args[2] = 0
22 | })
23 | }
24 | }
25 |
26 | override val name: String get() = "跳过扫码登录等待"
27 |
28 | override val processes: Set get() = setOf(ActionProcess.MAIN)
29 | }
30 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/hooks/helper/ContactHelper.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt.hooks.helper
2 |
3 | import com.owo233.tcqt.hooks.maple.MapleContact
4 | import com.owo233.tcqt.internals.QQInterfaces
5 | import com.tencent.qqnt.kernel.nativeinterface.MsgConstant
6 | import kotlinx.coroutines.suspendCancellableCoroutine
7 | import java.lang.IllegalArgumentException
8 | import kotlin.coroutines.resume
9 |
10 | internal object ContactHelper {
11 | suspend fun getUinByUidAsync(uid: String): String {
12 | if (uid.isBlank() || uid == "0") {
13 | return "0"
14 | }
15 |
16 | val kernelService = NTServiceFetcher.kernelService
17 | val sessionService = kernelService.wrapperSession
18 |
19 | return suspendCancellableCoroutine { continuation ->
20 | sessionService.uixConvertService.getUin(hashSetOf(uid)) {
21 | continuation.resume(it)
22 | }
23 | } [uid]?.toString() ?: "0"
24 | }
25 |
26 | suspend fun getUidByUinAsync(peerId: Long): String {
27 | val kernelService = NTServiceFetcher.kernelService
28 | val sessionService = kernelService.wrapperSession
29 |
30 | return suspendCancellableCoroutine { continuation ->
31 | sessionService.uixConvertService.getUid(hashSetOf(peerId)) {
32 | continuation.resume(it)
33 | }
34 | }[peerId]!!
35 | }
36 |
37 | suspend fun generateContact(chatType: Int, id: String, subId: String = ""): MapleContact {
38 | val peerId = if (MsgConstant.KCHATTYPEC2C == chatType || MsgConstant.KCHATTYPETEMPC2CFROMGROUP == chatType) {
39 | if (id.startsWith("u_")) id else getUidByUinAsync(id.toLong())
40 | } else id
41 |
42 | return generateContactByUid(chatType, peerId, subId)
43 | }
44 |
45 | fun generateContactByUid(chatType: Int, uid: String, subId: String = ""): MapleContact {
46 | if (chatType == MsgConstant.KCHATTYPEC2C && !uid.startsWith("u_")) {
47 | throw IllegalArgumentException("uid must start with u_")
48 | }
49 | return MapleContact.new(QQInterfaces.maple, chatType, uid, subId)
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/hooks/helper/KernelServiceHelper.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt.hooks.helper
2 |
3 | import com.tencent.qqnt.kernel.api.IKernelService
4 | import com.tencent.qqnt.kernel.api.impl.MsgService
5 | import java.lang.reflect.Method
6 |
7 | internal object KernelServiceHelper {
8 | private lateinit var M_GET_MSG_SERVICE: Method
9 |
10 | fun getMsgService(service: IKernelService): MsgService? {
11 | if (!KernelServiceHelper::M_GET_MSG_SERVICE.isInitialized) {
12 | M_GET_MSG_SERVICE = IKernelService::class.java.getMethod("getMsgService")
13 | }
14 | return M_GET_MSG_SERVICE.invoke(service) as? MsgService
15 | }
16 | }
17 |
18 | internal val IKernelService.msgService: MsgService?
19 | get() = KernelServiceHelper.getMsgService(this)
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/hooks/helper/NTServiceFetcher.kt:
--------------------------------------------------------------------------------
1 | @file:OptIn(ExperimentalSerializationApi::class, DelicateCoroutinesApi::class)
2 | @file:Suppress("UNCHECKED_CAST")
3 |
4 | package com.owo233.tcqt.hooks.helper
5 |
6 | import com.owo233.tcqt.data.BuildWrapper
7 | import com.owo233.tcqt.ext.hookMethod
8 | import com.owo233.tcqt.utils.logD
9 | import com.owo233.tcqt.utils.logE
10 | import com.tencent.qqnt.kernel.api.IKernelService
11 | import com.tencent.qqnt.kernel.nativeinterface.IOperateCallback
12 | import com.tencent.qqnt.kernel.nativeinterface.IQQNTWrapperSession
13 | import com.tencent.qqnt.kernel.nativeinterface.SessionTicket
14 | import kotlinx.coroutines.DelicateCoroutinesApi
15 | import kotlinx.serialization.ExperimentalSerializationApi
16 |
17 | internal object NTServiceFetcher {
18 | private lateinit var iKernelService: IKernelService
19 | private var curKernelHash = 0
20 |
21 | fun onFetch(service: IKernelService) {
22 | val msgService = service.msgService ?: return
23 | val session = service.wrapperSession
24 | val curHash = service.hashCode() + msgService.hashCode()
25 |
26 | if (isInitForNt(curHash)) return
27 |
28 | curKernelHash = curHash
29 | this.iKernelService = service
30 |
31 | banBackGround(session)
32 | initHookOnMsfPush()
33 | // initHookUpdateTicket()
34 | }
35 |
36 | private fun isInitForNt(hash: Int) = hash == curKernelHash
37 |
38 | private fun banBackGround(session: IQQNTWrapperSession) {
39 | runCatching {
40 | session.javaClass.hookMethod("switchToBackGround").before {
41 | it.result = Unit
42 | }
43 |
44 | val service = session.msgService
45 | service.javaClass.hookMethod("switchBackGroundForMqq").before {
46 | val cb = it.args[1] as IOperateCallback
47 | cb.onResult(-1, "injected")
48 | it.result = Unit
49 | }
50 |
51 | service.javaClass.hookMethod("switchBackGround").before {
52 | val cb = it.args[1] as IOperateCallback
53 | cb.onResult(-1, "injected")
54 | it.result = Unit
55 | }
56 | }.onFailure {
57 | logE(msg = "try ban backGround failure", cause = it)
58 | }
59 | }
60 |
61 | private fun initHookOnMsfPush() {
62 | kernelService.wrapperSession.javaClass.hookMethod("onMsfPush").before { param ->
63 | val cmd = param.args[0] as String
64 | val buffer = param.args[1] as ByteArray
65 | when(cmd) {
66 | "trpc.msg.register_proxy.RegisterProxy.InfoSyncPush" -> {
67 | AioListener.handleInfoSyncPush(buffer, param)
68 | }
69 | "trpc.msg.olpush.OlPushService.MsgPush" -> {
70 | AioListener.handleMsgPush(buffer, param)
71 | }
72 | else -> { }
73 | }
74 | }
75 |
76 | if (BuildWrapper.DEBUG) { // 仅供调试
77 | kernelService.wrapperSession.javaClass.hookMethod("setQimei36").before {
78 | logD(msg = "setQimei36: ${it.args[0] as String}")
79 | }
80 | }
81 | }
82 |
83 | private fun initHookUpdateTicket() {
84 | if (BuildWrapper.DEBUG) {
85 | kernelService.wrapperSession.javaClass.hookMethod("updateTicket").before { // 仅供调试
86 | val ticket = it.args[0] as SessionTicket
87 |
88 | val a2 = ticket.a2
89 | val d2 = ticket.d2
90 | val d2Key = ticket.d2Key
91 |
92 | logD(msg = """
93 | updateTicket:
94 | a2: $a2
95 | d2: $d2
96 | d2Key: $d2Key
97 | """.trimIndent())
98 | }
99 | }
100 | }
101 |
102 | val kernelService: IKernelService
103 | get() = iKernelService
104 | }
105 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/hooks/maple/Maple.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt.hooks.maple
2 |
3 | enum class Maple {
4 | PublicKernel, // 9.0.70+
5 | Kernel, // 9.0.70-
6 | }
7 |
8 | interface IMaple {
9 | val maple: Maple
10 | }
11 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/hooks/maple/MapleContact.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt.hooks.maple
2 |
3 | import com.tencent.qqnt.kernel.nativeinterface.MsgConstant
4 | import com.tencent.qqnt.kernelpublic.nativeinterface.Contact as PC
5 | import com.tencent.qqnt.kernel.nativeinterface.Contact as C
6 |
7 | sealed class MapleContact(
8 | override val maple: Maple
9 | ): IMaple {
10 | companion object {
11 | fun from(instance: Any): MapleContact {
12 | return when (instance.javaClass.name) {
13 | "com.tencent.qqnt.kernelpublic.nativeinterface.Contact" -> PublicContact(instance)
14 | "com.tencent.qqnt.kernel.nativeinterface.Contact" -> Contact(instance)
15 | else -> throw IllegalArgumentException("Unknown instance type: ${instance.javaClass.name}")
16 | }
17 | }
18 |
19 | fun new(maple: Maple, chatType: Int, uid: String, subId: String = ""): MapleContact {
20 | if (chatType == MsgConstant.KCHATTYPEC2C && !uid.startsWith("u_")) {
21 | throw java.lang.IllegalArgumentException("uid must start with u_")
22 | }
23 | return if (maple == Maple.Kernel) {
24 | newV1(chatType, uid, subId)
25 | } else {
26 | newV2(chatType, uid, subId)
27 | }
28 | }
29 |
30 | // old nt api
31 | private fun newV1(chatType: Int, uid: String, subId: String): MapleContact {
32 | return Contact(C(chatType, uid, subId))
33 | }
34 |
35 | private fun newV2(chatType: Int, uid: String, subId: String): MapleContact {
36 | return PublicContact(PC(chatType, uid, subId))
37 | }
38 | }
39 |
40 | class PublicContact(
41 | instance: Any
42 | ): MapleContact(Maple.PublicKernel) {
43 | val inner: PC = instance as PC
44 | }
45 |
46 | class Contact(
47 | instance: Any
48 | ): MapleContact(Maple.Kernel) {
49 | val inner: C = instance as C
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/hooks/maple/MapleMsgRecord.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt.hooks.maple
2 |
3 | import com.tencent.qqnt.kernel.nativeinterface.MsgElement
4 | import com.tencent.qqnt.kernel.nativeinterface.MsgRecord as MR1
5 |
6 | sealed class MapleMsgRecord(
7 | override val maple: Maple
8 | ): IMaple {
9 | companion object {
10 | fun from(instance: Any): MapleMsgRecord {
11 | return if (instance.javaClass.name[23] == 'p') {
12 | PublicMsgRecord(instance)
13 | } else if (instance.javaClass.name[23] == '.') {
14 | KernelMsgRecord(instance)
15 | } else {
16 | throw IllegalArgumentException("Unknown MsgRecord type: ${instance.javaClass.name}")
17 | }
18 | }
19 | }
20 |
21 | abstract val msgType: Int
22 | abstract val chatType: Int
23 | abstract val peerUid: String
24 | abstract val elements: ArrayList
25 |
26 | abstract fun isEmpty(): Boolean
27 |
28 | class KernelMsgRecord(
29 | instance: Any
30 | ): MapleMsgRecord(Maple.Kernel) {
31 | private val innerRecord = instance as MR1
32 |
33 | override val msgType: Int
34 | get() = innerRecord.msgType
35 |
36 | override val chatType: Int
37 | get() = innerRecord.chatType
38 |
39 | override val peerUid: String
40 | get() = innerRecord.peerUid
41 | override val elements: ArrayList
42 | get() = innerRecord.elements
43 |
44 | override fun isEmpty() = innerRecord.elements?.isEmpty() ?: true
45 | }
46 |
47 | class PublicMsgRecord(
48 | instance: Any
49 | ): MapleMsgRecord(Maple.PublicKernel) {
50 | override val msgType: Int
51 | get() = error("Not implemented")
52 |
53 | override val chatType: Int
54 | get() = error("Not implemented")
55 | override val peerUid: String
56 | get() = error("Not implemented")
57 | override val elements: ArrayList
58 | get() = error("Not implemented")
59 |
60 | override fun isEmpty() = error("Not implemented")
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/internals/QQInterfaces.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt.internals
2 |
3 | import com.owo233.tcqt.hooks.maple.Maple
4 | import com.owo233.tcqt.utils.PlatformTools
5 | import com.owo233.tcqt.utils.PlatformTools.QQ_9_0_70_VER
6 | import com.owo233.tcqt.utils.PlatformTools.TIM_4_0_95_VER
7 | import com.tencent.common.app.AppInterface
8 | import com.owo233.tcqt.utils.PlatformTools.isMqqPackage
9 | import com.owo233.tcqt.utils.PlatformTools.getQQVersionCode
10 | import mqq.app.MobileQQ
11 |
12 | open class QQInterfaces {
13 | companion object {
14 | val app by lazy {
15 | (if (isMqqPackage())
16 | MobileQQ.getMobileQQ().waitAppRuntime()
17 | else
18 | MobileQQ.getMobileQQ().waitAppRuntime(null)) as AppInterface
19 | }
20 |
21 | val maple by lazy {
22 | val ver = getQQVersionCode()
23 | val usePublic = (PlatformTools.isMqq() && ver >= QQ_9_0_70_VER) ||
24 | (PlatformTools.isTim() && ver >= TIM_4_0_95_VER)
25 | if (usePublic) Maple.PublicKernel else Maple.Kernel
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/internals/helper/GroupHelper.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt.internals.helper
2 |
3 | import com.tencent.mobileqq.data.troop.TroopMemberInfo
4 | import com.tencent.mobileqq.data.troop.TroopMemberNickInfo
5 | import com.tencent.mobileqq.qroute.QRoute
6 | import com.tencent.qqnt.troopmemberlist.ITroopMemberListRepoApi
7 | import kotlinx.coroutines.suspendCancellableCoroutine
8 | import kotlinx.coroutines.withTimeoutOrNull
9 | import kotlin.coroutines.resume
10 | import kotlin.time.Duration.Companion.seconds
11 |
12 | internal object GroupHelper {
13 |
14 | suspend fun getTroopMemberNickByUin(
15 | groupId: Long,
16 | uin: Long
17 | ): TroopMemberNickInfo? {
18 | val api = QRoute.api(ITroopMemberListRepoApi::class.java)
19 | return withTimeoutOrNull(5.seconds) {
20 | suspendCancellableCoroutine { continuation ->
21 | runCatching {
22 | api.fetchTroopMemberName(groupId.toString(), uin.toString(), null, groupId.toString()) {
23 | continuation.resume(it)
24 | }
25 | }.onFailure {
26 | continuation.resume(null)
27 | }
28 | }
29 | }
30 | }
31 |
32 | fun getTroopMemberInfoByUinFromNt(
33 | groupId: Long,
34 | uin: Long
35 | ): Result {
36 | return runCatching {
37 | val api = QRoute.api(ITroopMemberListRepoApi::class.java)
38 | api.getTroopMemberFromCacheOrFetchAsync(
39 | groupId.toString(),
40 | uin.toString(),
41 | null,
42 | "AIONickBlockApiImpl-level",
43 | null
44 | ) ?: throw Exception("获取群成员信息失败")
45 | }
46 | }
47 |
48 | fun getTroopMemberInfoByUin(
49 | groupId: Long,
50 | uin: Long
51 | ): Result {
52 | val info = getTroopMemberInfoByUinFromNt(groupId, uin).getOrNull()
53 | return if (info != null) {
54 | Result.success(info)
55 | } else {
56 | Result.failure(Exception("获取群成员信息失败"))
57 | }
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/internals/msf/MsfHandler.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt.internals.msf
2 |
3 | import com.owo233.tcqt.utils.logE
4 | import com.tencent.qphone.base.remote.FromServiceMsg
5 | import com.tencent.qphone.base.remote.ToServiceMsg
6 | import kotlinx.atomicfu.atomic
7 | import kotlinx.coroutines.CancellableContinuation
8 | import kotlinx.coroutines.sync.Mutex
9 | import kotlinx.coroutines.sync.withLock
10 | import kotlin.coroutines.resume
11 |
12 | typealias MsfPush = (FromServiceMsg) -> Unit
13 | typealias MsfResp = CancellableContinuation>
14 |
15 | internal object MSFHandler {
16 | private val mPushHandlers = hashMapOf()
17 | private val mRespHandler = hashMapOf()
18 | private val mPushLock = Mutex()
19 | private val mRespLock = Mutex()
20 |
21 | private val seq = atomic(0)
22 |
23 | fun nextSeq(): Int {
24 | seq.compareAndSet(0xFFFFFFF, 0)
25 | return seq.incrementAndGet()
26 | }
27 |
28 | suspend fun registerPush(cmd: String, push: MsfPush) {
29 | mPushLock.withLock {
30 | mPushHandlers[cmd] = push
31 | }
32 | }
33 |
34 | suspend fun unregisterPush(cmd: String) {
35 | mPushLock.withLock {
36 | mPushHandlers.remove(cmd)
37 | }
38 | }
39 |
40 | suspend fun registerResp(cmd: Int, resp: MsfResp) {
41 | mRespLock.withLock {
42 | mRespHandler[cmd] = resp
43 | }
44 | }
45 |
46 | suspend fun unregisterResp(cmd: Int) {
47 | mRespLock.withLock {
48 | mRespHandler.remove(cmd)
49 | }
50 | }
51 |
52 | fun onPush(fromServiceMsg: FromServiceMsg) {
53 | val cmd = fromServiceMsg.serviceCmd
54 | if (cmd == "trpc.msg.olpush.OlPushService.MsgPush") {
55 | //PrimitiveListener.onPush(fromServiceMsg)
56 | } else {
57 | val push = mPushHandlers[cmd]
58 | push?.invoke(fromServiceMsg)
59 | }
60 | }
61 |
62 | fun onResp(toServiceMsg: ToServiceMsg, fromServiceMsg: FromServiceMsg) {
63 | runCatching {
64 | val cmd = toServiceMsg.getAttribute("tcqt_uid") as? Int?
65 | ?: return@runCatching
66 | val resp = mRespHandler[cmd]
67 | resp?.resume(toServiceMsg to fromServiceMsg)
68 | }.onFailure {
69 | logE(msg = "MSF.onResp failed: ${it.message}")
70 | }
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/utils/Log.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt.utils
2 |
3 | import android.util.Log
4 | import com.owo233.tcqt.data.BuildWrapper.DEBUG
5 | import com.owo233.tcqt.data.TCQTBuild.HOOK_TAG
6 | import de.robv.android.xposed.XposedBridge
7 | import java.text.SimpleDateFormat
8 | import java.util.Date
9 | import java.util.Locale
10 | import java.util.concurrent.Executors
11 |
12 | private val logExecutor = Executors.newSingleThreadExecutor()
13 |
14 | private fun parseLog(level: Int, tag: String, msg: String, cause: Throwable? = null) = buildString {
15 | val levelStr = when (level) {
16 | Log.DEBUG -> "DEBUG"
17 | Log.INFO -> "INFO"
18 | Log.WARN -> "WARN"
19 | Log.ERROR -> "ERROR"
20 | else -> "?????"
21 | }
22 | val date = SimpleDateFormat("MM-dd HH:mm:ss", Locale.getDefault()).format(Date())
23 | append("[$levelStr] $date ($tag) $msg")
24 | if (!endsWith('\n')) append('\n')
25 | if (cause != null) append(Log.getStackTraceString(cause))
26 | if (!endsWith('\n')) append('\n')
27 | }
28 |
29 | private fun log(level: Int, tag: String, msg: String, cause: Throwable? = null) {
30 | if (level <= Log.DEBUG && !DEBUG) return
31 | logExecutor.execute {
32 | val parsedLog = parseLog(level, tag, msg, cause)
33 | XposedBridge.log(parsedLog)
34 | }
35 | }
36 |
37 | fun logD(tag: String = HOOK_TAG, msg: String, cause: Throwable? = null) = log(Log.DEBUG, tag, msg, cause)
38 |
39 | fun logI(tag: String = HOOK_TAG, msg: String, cause: Throwable? = null) = log(Log.INFO, tag, msg, cause)
40 |
41 | fun logW(tag: String = HOOK_TAG, msg: String, cause: Throwable? = null) = log(Log.WARN, tag, msg, cause)
42 |
43 | fun logE(tag: String = HOOK_TAG, msg: String, cause: Throwable? = null) = log(Log.ERROR, tag, msg, cause)
44 |
--------------------------------------------------------------------------------
/app/src/main/java/com/owo233/tcqt/utils/PlatformTools.kt:
--------------------------------------------------------------------------------
1 | package com.owo233.tcqt.utils
2 |
3 | import android.annotation.SuppressLint
4 | import android.content.ClipData
5 | import android.content.ClipboardManager
6 | import android.content.Context
7 | import android.content.pm.PackageInfo
8 | import android.os.Handler
9 | import android.provider.Settings
10 | import android.widget.Toast
11 | import androidx.core.content.pm.PackageInfoCompat
12 | import com.owo233.tcqt.ext.XpClassLoader
13 | import mqq.app.MobileQQ
14 | import kotlin.random.Random
15 |
16 | object PlatformTools {
17 |
18 | const val QQ_9_0_70_VER = 6700L
19 | const val TIM_4_0_95_VER = 4002L
20 |
21 | internal lateinit var GlobalUi: Handler
22 |
23 | fun isQQNt(): Boolean {
24 | return try {
25 | XpClassLoader.load("com.tencent.qqnt.base.BaseActivity") != null
26 | } catch (_: Exception) {
27 | false
28 | }
29 | }
30 |
31 | fun getQQVersion(ctx: Context = MobileQQ.getContext()): String {
32 | val packageInfo: PackageInfo = ctx.packageManager.getPackageInfo(ctx.packageName, 0)
33 | return packageInfo.versionName ?: "unknown"
34 | }
35 |
36 | fun getQQVersionCode(ctx: Context = MobileQQ.getContext()): Long {
37 | val packageInfo = ctx.packageManager.getPackageInfo(ctx.packageName, 0)
38 | return PackageInfoCompat.getLongVersionCode(packageInfo)
39 | }
40 |
41 | fun getClientVersion(ctx: Context = MobileQQ.getContext()): String = "android ${getQQVersion(ctx)}"
42 |
43 | fun isMsfProcess(): Boolean {
44 | return MobileQQ.getMobileQQ().qqProcessName.contains("msf", ignoreCase = true)
45 | }
46 |
47 | fun isToolProcess(): Boolean {
48 | return MobileQQ.getMobileQQ().qqProcessName.contains("tool", ignoreCase = true)
49 | }
50 |
51 | fun isMqq(): Boolean {
52 | return MobileQQ.getMobileQQ().qqProcessName == "com.tencent.mobileqq"
53 | }
54 |
55 | fun isMqqPackage(): Boolean {
56 | return MobileQQ.getMobileQQ().qqProcessName.startsWith("com.tencent.mobileqq")
57 | }
58 |
59 | fun isTim(): Boolean {
60 | return MobileQQ.getMobileQQ().qqProcessName == "com.tencent.tim"
61 | }
62 |
63 | fun isMainProcess(): Boolean {
64 | return isMqq() || isTim()
65 | }
66 |
67 | @SuppressLint("HardwareIds")
68 | fun getAndroidID(): String {
69 | var androidId =
70 | Settings.Secure.getString(MobileQQ.getContext().contentResolver, "android_id")
71 | if (androidId == null) {
72 | val sb = StringBuilder()
73 | for (i in 0..15) {
74 | sb.append(Random.nextInt(10))
75 | }
76 | androidId = sb.toString()
77 | }
78 | return androidId
79 | }
80 |
81 | fun copyToClipboard(context: Context = MobileQQ.getContext(), text: String) {
82 | val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
83 | val clip = ClipData.newPlainText("label", text)
84 | clipboard.setPrimaryClip(clip)
85 | context.toast("已复制到剪切板")
86 | }
87 |
88 | private fun Context.toast(msg: String, flag: Int = Toast.LENGTH_SHORT) {
89 | if (!::GlobalUi.isInitialized) {
90 | logI(msg = msg)
91 | return
92 | }
93 | GlobalUi.post { Toast.makeText(this, msg, flag).show() }
94 | }
95 | }
96 |
--------------------------------------------------------------------------------
/app/src/main/proto/com/owo233/tcqt/entries/InfoSyncPush.proto:
--------------------------------------------------------------------------------
1 | syntax = "proto3";
2 | package com.owo233.tcqt.entries;
3 | option java_package = "com.owo233.tcqt.entries";
4 |
5 | import "com/owo233/tcqt/entries/QQMessage.proto";
6 |
7 | // import "google/protobuf/timestamp.proto";
8 | // proto有3个字段修饰符required(必选),optional(可选),repeated(重复)
9 | // 咱们的proto文件不使用required,只用optional,因为咱们也不知道哪个字段什么时候才有值,如果是数组一律用repeated修饰.
10 | // 消息只是包含一组类型化字段的聚合。许多标准简单数据类型都可用作字段类型,包括 bool 、 int32 、 float 、 double 和 string
11 | // peerId 就是 uin(是数字),uid是乱七八糟的字母
12 | message InfoSyncPush {
13 | int32 type = 3; //同步类型
14 | int32 pushId = 4; // 没啥用的信息貌似
15 |
16 | SyncContent syncContent = 7; //普通消息同步内容
17 | SyncRecallOperateInfo syncRecallContent = 8; // 撤回操作的操作信息
18 |
19 | message SyncContent {
20 | repeated GroupSyncContent groupSyncContent = 3; // 每个群的同步西信息
21 |
22 | message GroupSyncContent {
23 | int64 groupPeerId = 3; // 群聊的 peerId
24 | int32 startSeq = 4; //同步的开始seq
25 | int32 endSeq = 5; // 同步的结束seq
26 |
27 | // 如果移除撤回的信息,就在这里就移除了
28 | repeated QQMessage qqMessage = 6; // 消息数组,数组的数量为 endSeq - startSeq
29 | }
30 | }
31 |
32 |
33 | message SyncRecallOperateInfo {
34 | SyncInfoHead syncInfoHead = 3;
35 | repeated SyncInfoBody syncInfoBody = 4;
36 | SyncInfoHead subHead = 5;
37 |
38 | message SyncInfoHead {
39 | int64 syncTime = 1;
40 | }
41 |
42 | message SyncInfoBody {
43 | int64 senderPeerId = 1;
44 | string senderUid = 2;
45 | int64 eventTime = 5;
46 | repeated QQMessage msg = 8;
47 | }
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/app/src/main/proto/com/owo233/tcqt/entries/MsgPush.proto:
--------------------------------------------------------------------------------
1 | syntax = "proto3";
2 | package com.owo233.tcqt.entries;
3 |
4 | option java_package = "com.owo233.tcqt.entries";
5 |
6 |
7 | import "com/owo233/tcqt/entries/QQMessage.proto";
8 |
9 | message MsgPush {
10 | QQMessage qqMessage = 1;
11 | }
12 |
--------------------------------------------------------------------------------
/app/src/main/proto/com/owo233/tcqt/entries/QQMessage.proto:
--------------------------------------------------------------------------------
1 | syntax = "proto3";
2 | package com.owo233.tcqt.entries;
3 | option java_package = "com.owo233.tcqt.entries";
4 |
5 | message QQMessage {
6 | MessageHead messageHead = 1;
7 | MessageContentInfo messageContentInfo = 2;
8 | MessageBody messageBody = 3;
9 |
10 | message MessageHead {
11 | int64 senderPeerId = 1;
12 | string senderUid = 2;
13 | int64 receiverPeerId = 5;
14 | string receiverUid = 6;
15 | SenderInfo senderInfo = 8;
16 |
17 | message SenderInfo {
18 | int64 peerId = 1;
19 | int32 msgSubType = 2;
20 | string nickName = 4;
21 | }
22 | }
23 | message MessageContentInfo {
24 | int32 msgType = 1;
25 | int32 msgSubType = 2;
26 | int32 subSeq = 3;
27 | int32 msgSeq = 5;
28 | int64 msgTime = 6;
29 | }
30 | message MessageBody {
31 | RichMsg richMsg = 1;
32 | bytes operationInfo = 2;
33 |
34 | message RichMsg {
35 | repeated MsgContent msgContent = 2;
36 |
37 | message MsgContent {
38 | TextMsg textMsg = 1;
39 | MsgSender msgSender = 16;
40 |
41 | message TextMsg {
42 | string text = 1;
43 | }
44 |
45 | message MsgSender {
46 | string nickName = 1;
47 | }
48 | }
49 | }
50 |
51 | message GroupRecallOperationInfo {
52 | int64 peerId = 4;
53 | Info info = 11;
54 | int32 msgSeq = 37;
55 |
56 | message Info {
57 | string operatorUid = 1;
58 | MsgInfo msgInfo = 3;
59 |
60 | message MsgInfo {
61 | int32 msgSeq = 1;
62 | int64 msgTime = 2;
63 | string senderUid = 6;
64 | }
65 | }
66 | }
67 |
68 | message C2CRecallOperationInfo {
69 | Info info = 1;
70 |
71 | message Info {
72 | string operatorUid = 1;
73 | string receiverUid = 2;
74 | int64 msgTime = 5;
75 | int64 msgRandom = 6;
76 | int32 msgSeq = 20;
77 | }
78 | }
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/icon.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/values/arrays.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | - com.tencent.mobileqq
5 | - com.tencent.tim
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FFBB86FC
4 | #FF6200EE
5 | #FF3700B3
6 | #FF03DAC5
7 | #FF018786
8 | #FF000000
9 | #FFFFFFFF
10 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | TCQT
3 | TCQT by callng@github
4 |
--------------------------------------------------------------------------------
/build.gradle.kts:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 | plugins {
3 | alias(libs.plugins.android.application) apply false
4 | alias(libs.plugins.kotlin.android) apply false
5 | alias(libs.plugins.android.library) apply false
6 | alias(libs.plugins.protobuf) apply false
7 | }
8 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 | # IDE (e.g. Android Studio) users:
3 | # Gradle settings configured through the IDE *will override*
4 | # any settings specified in this file.
5 | # For more details on how to configure your build environment visit
6 | # http://www.gradle.org/docs/current/userguide/build_environment.html
7 | # Specifies the JVM arguments used for the daemon process.
8 | # The setting is particularly useful for tweaking memory settings.
9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
10 | # When configured, Gradle will run in incubating parallel mode.
11 | # This option should only be used with decoupled projects. For more details, visit
12 | # https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects
13 | # org.gradle.parallel=true
14 | # AndroidX package structure to make it clearer which packages are bundled with the
15 | # Android operating system, and which are packaged with your app's APK
16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn
17 | android.useAndroidX=true
18 | # Kotlin code style for this project: "official" or "obsolete":
19 | kotlin.code.style=official
20 | # Enables namespacing of each library's R class so that its R class includes only the
21 | # resources declared in the library itself and none from the library's dependencies,
22 | # thereby reducing the size of the R class for that library
23 | android.nonTransitiveRClass=true
--------------------------------------------------------------------------------
/gradle/libs.versions.toml:
--------------------------------------------------------------------------------
1 | [versions]
2 | agp = "8.11.1"
3 | kotlin = "2.2.0"
4 | core = "1.16.0"
5 | xposed = "82"
6 | kotlinx-serialization = "1.9.0"
7 | kotlinx-coroutines = "1.10.2"
8 | kotlinx-io = "0.1.16"
9 | protobuf-java = "4.31.1"
10 | protobuf = "0.9.5"
11 |
12 | [libraries]
13 | androidx-core = { group = "androidx.core", name = "core", version.ref = "core"}
14 | androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "core" }
15 | xposed-api = { group = "de.robv.android.xposed", name = "api", version.ref = "xposed"}
16 | kotlinx-io-jvm = { group = "org.jetbrains.kotlinx", name = "kotlinx-io-jvm", version.ref = "kotlinx-io" }
17 | kotlinx-coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "kotlinx-coroutines" }
18 | kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinx-serialization" }
19 | kotlinx-serialization-protobuf = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-protobuf", version.ref = "kotlinx-serialization" }
20 | protobuf-java = { group = "com.google.protobuf", name = "protobuf-java", version.ref = "protobuf-java" }
21 |
22 | [plugins]
23 | android-application = { id = "com.android.application", version.ref = "agp" }
24 | kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
25 | android-library = { id = "com.android.library", version.ref = "agp" }
26 | protobuf = { id = "com.google.protobuf", version.ref = "protobuf" }
27 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/callng/TCQT/d7d577a12fac467cb437702d3e9153eee9ef639d/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Wed Jul 02 15:52:35 CST 2025
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip
5 | zipStoreBase=GRADLE_USER_HOME
6 | zipStorePath=wrapper/dists
7 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | #
4 | # Copyright 2015 the original author or authors.
5 | #
6 | # Licensed under the Apache License, Version 2.0 (the "License");
7 | # you may not use this file except in compliance with the License.
8 | # You may obtain a copy of the License at
9 | #
10 | # https://www.apache.org/licenses/LICENSE-2.0
11 | #
12 | # Unless required by applicable law or agreed to in writing, software
13 | # distributed under the License is distributed on an "AS IS" BASIS,
14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | # See the License for the specific language governing permissions and
16 | # limitations under the License.
17 | #
18 |
19 | ##############################################################################
20 | ##
21 | ## Gradle start up script for UN*X
22 | ##
23 | ##############################################################################
24 |
25 | # Attempt to set APP_HOME
26 | # Resolve links: $0 may be a link
27 | PRG="$0"
28 | # Need this for relative symlinks.
29 | while [ -h "$PRG" ] ; do
30 | ls=`ls -ld "$PRG"`
31 | link=`expr "$ls" : '.*-> \(.*\)$'`
32 | if expr "$link" : '/.*' > /dev/null; then
33 | PRG="$link"
34 | else
35 | PRG=`dirname "$PRG"`"/$link"
36 | fi
37 | done
38 | SAVED="`pwd`"
39 | cd "`dirname \"$PRG\"`/" >/dev/null
40 | APP_HOME="`pwd -P`"
41 | cd "$SAVED" >/dev/null
42 |
43 | APP_NAME="Gradle"
44 | APP_BASE_NAME=`basename "$0"`
45 |
46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
48 |
49 | # Use the maximum available, or set MAX_FD != -1 to use that value.
50 | MAX_FD="maximum"
51 |
52 | warn () {
53 | echo "$*"
54 | }
55 |
56 | die () {
57 | echo
58 | echo "$*"
59 | echo
60 | exit 1
61 | }
62 |
63 | # OS specific support (must be 'true' or 'false').
64 | cygwin=false
65 | msys=false
66 | darwin=false
67 | nonstop=false
68 | case "`uname`" in
69 | CYGWIN* )
70 | cygwin=true
71 | ;;
72 | Darwin* )
73 | darwin=true
74 | ;;
75 | MINGW* )
76 | msys=true
77 | ;;
78 | NONSTOP* )
79 | nonstop=true
80 | ;;
81 | esac
82 |
83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
84 |
85 |
86 | # Determine the Java command to use to start the JVM.
87 | if [ -n "$JAVA_HOME" ] ; then
88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
89 | # IBM's JDK on AIX uses strange locations for the executables
90 | JAVACMD="$JAVA_HOME/jre/sh/java"
91 | else
92 | JAVACMD="$JAVA_HOME/bin/java"
93 | fi
94 | if [ ! -x "$JAVACMD" ] ; then
95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
96 |
97 | Please set the JAVA_HOME variable in your environment to match the
98 | location of your Java installation."
99 | fi
100 | else
101 | JAVACMD="java"
102 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
103 |
104 | Please set the JAVA_HOME variable in your environment to match the
105 | location of your Java installation."
106 | fi
107 |
108 | # Increase the maximum file descriptors if we can.
109 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
110 | MAX_FD_LIMIT=`ulimit -H -n`
111 | if [ $? -eq 0 ] ; then
112 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
113 | MAX_FD="$MAX_FD_LIMIT"
114 | fi
115 | ulimit -n $MAX_FD
116 | if [ $? -ne 0 ] ; then
117 | warn "Could not set maximum file descriptor limit: $MAX_FD"
118 | fi
119 | else
120 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
121 | fi
122 | fi
123 |
124 | # For Darwin, add options to specify how the application appears in the dock
125 | if $darwin; then
126 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
127 | fi
128 |
129 | # For Cygwin or MSYS, switch paths to Windows format before running java
130 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
131 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
132 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
133 |
134 | JAVACMD=`cygpath --unix "$JAVACMD"`
135 |
136 | # We build the pattern for arguments to be converted via cygpath
137 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
138 | SEP=""
139 | for dir in $ROOTDIRSRAW ; do
140 | ROOTDIRS="$ROOTDIRS$SEP$dir"
141 | SEP="|"
142 | done
143 | OURCYGPATTERN="(^($ROOTDIRS))"
144 | # Add a user-defined pattern to the cygpath arguments
145 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
146 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
147 | fi
148 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
149 | i=0
150 | for arg in "$@" ; do
151 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
152 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
153 |
154 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
155 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
156 | else
157 | eval `echo args$i`="\"$arg\""
158 | fi
159 | i=`expr $i + 1`
160 | done
161 | case $i in
162 | 0) set -- ;;
163 | 1) set -- "$args0" ;;
164 | 2) set -- "$args0" "$args1" ;;
165 | 3) set -- "$args0" "$args1" "$args2" ;;
166 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
167 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
168 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
169 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
170 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
171 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
172 | esac
173 | fi
174 |
175 | # Escape application args
176 | save () {
177 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
178 | echo " "
179 | }
180 | APP_ARGS=`save "$@"`
181 |
182 | # Collect all arguments for the java command, following the shell quoting and substitution rules
183 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
184 |
185 | exec "$JAVACMD" "$@"
186 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @rem
2 | @rem Copyright 2015 the original author or authors.
3 | @rem
4 | @rem Licensed under the Apache License, Version 2.0 (the "License");
5 | @rem you may not use this file except in compliance with the License.
6 | @rem You may obtain a copy of the License at
7 | @rem
8 | @rem https://www.apache.org/licenses/LICENSE-2.0
9 | @rem
10 | @rem Unless required by applicable law or agreed to in writing, software
11 | @rem distributed under the License is distributed on an "AS IS" BASIS,
12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | @rem See the License for the specific language governing permissions and
14 | @rem limitations under the License.
15 | @rem
16 |
17 | @if "%DEBUG%" == "" @echo off
18 | @rem ##########################################################################
19 | @rem
20 | @rem Gradle startup script for Windows
21 | @rem
22 | @rem ##########################################################################
23 |
24 | @rem Set local scope for the variables with windows NT shell
25 | if "%OS%"=="Windows_NT" setlocal
26 |
27 | set DIRNAME=%~dp0
28 | if "%DIRNAME%" == "" set DIRNAME=.
29 | set APP_BASE_NAME=%~n0
30 | set APP_HOME=%DIRNAME%
31 |
32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter.
33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
34 |
35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
37 |
38 | @rem Find java.exe
39 | if defined JAVA_HOME goto findJavaFromJavaHome
40 |
41 | set JAVA_EXE=java.exe
42 | %JAVA_EXE% -version >NUL 2>&1
43 | if "%ERRORLEVEL%" == "0" goto execute
44 |
45 | echo.
46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
47 | echo.
48 | echo Please set the JAVA_HOME variable in your environment to match the
49 | echo location of your Java installation.
50 |
51 | goto fail
52 |
53 | :findJavaFromJavaHome
54 | set JAVA_HOME=%JAVA_HOME:"=%
55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
56 |
57 | if exist "%JAVA_EXE%" goto execute
58 |
59 | echo.
60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
61 | echo.
62 | echo Please set the JAVA_HOME variable in your environment to match the
63 | echo location of your Java installation.
64 |
65 | goto fail
66 |
67 | :execute
68 | @rem Setup the command line
69 |
70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
71 |
72 |
73 | @rem Execute Gradle
74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
75 |
76 | :end
77 | @rem End local scope for the variables with windows NT shell
78 | if "%ERRORLEVEL%"=="0" goto mainEnd
79 |
80 | :fail
81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
82 | rem the _cmd.exe /c_ return code!
83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
84 | exit /b 1
85 |
86 | :mainEnd
87 | if "%OS%"=="Windows_NT" endlocal
88 |
89 | :omega
90 |
--------------------------------------------------------------------------------
/qqinterface/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/qqinterface/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import org.jetbrains.kotlin.gradle.dsl.JvmTarget
2 |
3 | plugins {
4 | alias(libs.plugins.android.library)
5 | alias(libs.plugins.kotlin.android)
6 | }
7 |
8 | android {
9 | namespace = "com.owo233.qqinterface"
10 | compileSdk = 36
11 |
12 | defaultConfig {
13 | minSdk = 27
14 | consumerProguardFiles("consumer-rules.pro")
15 | }
16 |
17 | buildTypes {
18 | release {
19 | isMinifyEnabled = false
20 | proguardFiles(
21 | getDefaultProguardFile("proguard-android-optimize.txt"),
22 | "proguard-rules.pro"
23 | )
24 | }
25 | }
26 | compileOptions {
27 | sourceCompatibility = JavaVersion.VERSION_17
28 | targetCompatibility = JavaVersion.VERSION_17
29 | }
30 | kotlin {
31 | compilerOptions {
32 | jvmTarget.set(JvmTarget.JVM_17)
33 | freeCompilerArgs.set(listOf(
34 | "-Xno-call-assertions",
35 | "-Xno-param-assertions",
36 | "-Xno-receiver-assertions"
37 | ))
38 | }
39 | }
40 | }
41 |
42 | dependencies {
43 | implementation(libs.androidx.core.ktx)
44 | }
45 |
--------------------------------------------------------------------------------
/qqinterface/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/callng/TCQT/d7d577a12fac467cb437702d3e9153eee9ef639d/qqinterface/consumer-rules.pro
--------------------------------------------------------------------------------
/qqinterface/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/qqinterface/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/androidx/lifecycle/LifecycleOwner.java:
--------------------------------------------------------------------------------
1 | package androidx.lifecycle;
2 |
3 | public interface LifecycleOwner {
4 | }
5 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/qq/jce/wup/UniPacket.java:
--------------------------------------------------------------------------------
1 | package com.qq.jce.wup;
2 |
3 | public class UniPacket {
4 | public UniPacket() {
5 | }
6 |
7 | public String getFuncName() {
8 | return null;
9 | }
10 |
11 | public int getOldRespIret() {
12 | return 0;
13 | }
14 |
15 | public int getPackageVersion() {
16 | return 0;
17 | }
18 |
19 | public int getRequestId() {
20 | return 0;
21 | }
22 |
23 | public String getServantName() {
24 | return null;
25 | }
26 |
27 | public void put(String str, T t) {
28 | throw new IllegalArgumentException("put name can not startwith . , now is " + str);
29 | }
30 |
31 | public void setFuncName(String str) {
32 | }
33 |
34 | public void setOldRespIret(int i2) {
35 | }
36 |
37 | public void setRequestId(int i2) {
38 | }
39 |
40 | public void setServantName(String str) {
41 | }
42 |
43 | public UniPacket(boolean z) {
44 | }
45 |
46 | public T get(String str, T t, Object obj) {
47 | return null;
48 | }
49 |
50 | public T getByClass(String str, T t) {
51 | return null;
52 | }
53 |
54 | public void decode(byte[] bArr) {
55 | throw new IllegalArgumentException("decode package must include size head");
56 | }
57 |
58 | public String getEncodeName() {
59 | return null;
60 | }
61 |
62 | public void setEncodeName(String str) {
63 | }
64 |
65 | public byte[] encode() {
66 | return null;
67 | }
68 | }
69 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/common/app/AppInterface.java:
--------------------------------------------------------------------------------
1 | package com.tencent.common.app;
2 |
3 | import com.tencent.mobileqq.app.BusinessHandler;
4 | import com.tencent.qphone.base.remote.ToServiceMsg;
5 |
6 | import mqq.app.AppRuntime;
7 |
8 | public abstract class AppInterface extends AppRuntime {
9 | public String getCurrentNickname() {
10 | return "";
11 | }
12 |
13 | public BusinessHandler getBusinessHandler(String className) {
14 | return null;
15 | }
16 |
17 | public void sendToService(ToServiceMsg toServiceMsg) {
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/activity/VisitorsActivity.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.activity;
2 |
3 | public class VisitorsActivity {
4 | }
5 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/app/BaseBusinessHandler.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.app;
2 |
3 | import com.qq.jce.wup.UniPacket;
4 | import com.tencent.qphone.base.remote.FromServiceMsg;
5 | import com.tencent.qphone.base.remote.ToServiceMsg;
6 |
7 | import java.util.Set;
8 |
9 | public abstract class BaseBusinessHandler extends OidbWrapper {
10 |
11 | @Override
12 | public ToServiceMsg createToServiceMsg(String cmd) {
13 | return null;
14 | }
15 |
16 | public final T decodePacket(byte[] data, String name, T obj) {
17 | UniPacket uniPacket = new UniPacket(true);
18 | try {
19 | uniPacket.setEncodeName("utf-8");
20 | uniPacket.decode(data);
21 | return (T) uniPacket.getByClass(name, obj);
22 | } catch (Exception unused) {
23 | return null;
24 | }
25 | }
26 |
27 | protected abstract Set getCommandList();
28 |
29 | protected abstract Set getPushCommandList();
30 |
31 | protected abstract Set getPushPBCommandList();
32 |
33 | public abstract void onReceive(ToServiceMsg toServiceMsg, FromServiceMsg fromServiceMsg, Object obj);
34 |
35 | public void send(ToServiceMsg toServiceMsg) {
36 | }
37 |
38 | public void sendPbReq(ToServiceMsg toServiceMsg) {
39 | }
40 |
41 | public String getCurrentAccountUin() {
42 | return "";
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/app/BusinessHandler.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.app;
2 |
3 | import com.tencent.common.app.AppInterface;
4 |
5 | import java.util.Set;
6 |
7 | public abstract class BusinessHandler extends BaseBusinessHandler {
8 | public BusinessHandler(AppInterface appInterface) {
9 | }
10 |
11 | @Override
12 | public Set getCommandList() {
13 | return null;
14 | }
15 |
16 | @Override
17 | public Set getPushCommandList() {
18 | return null;
19 | }
20 |
21 | @Override
22 | public Set getPushPBCommandList() {
23 | return null;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/app/BusinessHandlerFactory.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.app;
2 |
3 | public class BusinessHandlerFactory {
4 | public static String TROOP_MEMBER_CARD_HANDLER = null;
5 | public static String TROOP_LIST_HANDLER = null;
6 | public static String TROOP_MEMBER_LIST_HANDLER = null;
7 | public static final String TROOP_MODIFY_HANDLER = null;
8 | }
9 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/app/OidbWrapper.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.app;
2 |
3 | import com.tencent.qphone.base.remote.ToServiceMsg;
4 |
5 | public abstract class OidbWrapper {
6 | public abstract ToServiceMsg createToServiceMsg(String str);
7 | }
8 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/data/CardProfile.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.data;
2 |
3 | public class CardProfile {
4 | }
5 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/data/troop/TroopMemberInfo.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.data.troop;
2 |
3 | import java.io.Serializable;
4 |
5 | public class TroopMemberInfo implements Serializable {
6 | public static final long VALUE_DISTANCE_TO_SELF_UNKOWN = -100;
7 | protected static final int VALUE_INVALID = -100;
8 | public static final long VALUE_MEMBER_CLOSE_SHARE_LBS = -1001;
9 | public int addState;
10 |
11 | @Deprecated(since = "推荐使用TroopMemberNickInfo")
12 | public String autoremark;
13 | public long credit_level;
14 | public String displayedNamePinyinFirst;
15 | public int flagEx = 0;
16 |
17 | @Deprecated(since = "推荐使用TroopMemberNickInfo")
18 | public String friendnick;
19 | public long gagTimeStamp;
20 | public String honorList;
21 | public boolean isTroopFollowed;
22 | public long join_time;
23 | public long last_active_time;
24 | public int mBigClubVipType;
25 | public byte mHonorRichFlag;
26 | public boolean mIsShielded;
27 | public int mVipType;
28 | public String memberUid;
29 | public String memberuin;
30 | public TroopMemberNickInfo nickInfo;
31 | public int realLevel;
32 | public int titleId;
33 |
34 | @Deprecated(since = "推荐使用TroopMemberNickInfo")
35 | public String troopColorNick;
36 |
37 | @Deprecated(since = "推荐使用TroopMemberNickInfo")
38 | public int troopColorNickId;
39 |
40 | @Deprecated(since = "推荐使用TroopMemberNickInfo")
41 | public String troopnick;
42 | public String troopuin;
43 | }
44 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/data/troop/TroopMemberNickInfo.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.data.troop;
2 |
3 | import org.jetbrains.annotations.NotNull;
4 |
5 | public class TroopMemberNickInfo {
6 | @NotNull
7 | public final String component1() {
8 | return null;
9 | }
10 |
11 | @NotNull
12 | public final String component2() {
13 | return null;
14 | }
15 |
16 | @NotNull
17 | public final String component3() {
18 | return null;
19 | }
20 |
21 | @NotNull
22 | public final String component4() {
23 | return null;
24 | }
25 |
26 | public final int component5() {
27 | return 0;
28 | }
29 |
30 | @NotNull
31 | public final String component6() {
32 | return null;
33 | }
34 |
35 | @NotNull
36 | public final String component7() {
37 | return null;
38 | }
39 |
40 | @NotNull
41 | public final String component8() {
42 | return null;
43 | }
44 |
45 | @NotNull
46 | public final String getAutoRemark() {
47 | return null;
48 | }
49 |
50 | @NotNull
51 | public final String getColorNick() {
52 | return null;
53 | }
54 |
55 | public final int getColorNickId() {
56 | return 0;
57 | }
58 |
59 | @NotNull
60 | public final String getFriendNick() {
61 | return null;
62 | }
63 |
64 | @NotNull
65 | public final String getHBShowName() {
66 | return null;
67 | }
68 |
69 | @NotNull
70 | public final String getRemarkFromFriend() {
71 | return null;
72 | }
73 |
74 | @NotNull
75 | public final String getRemarkFromFriendV2() {
76 | return null;
77 | }
78 |
79 | @NotNull
80 | public final String getShowName() {
81 | return null;
82 | }
83 |
84 | @NotNull
85 | public final String getTroopNick() {
86 | return null;
87 | }
88 |
89 | @NotNull
90 | public final String getTroopUin() {
91 | return null;
92 | }
93 | }
94 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/msf/sdk/MsfCommand.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.msf.sdk;
2 |
3 | public enum MsfCommand {
4 | unknown,
5 | registerMsfService,
6 | unRegisterMsfService,
7 | loginAuth,
8 | verifyPasswd,
9 | verifyPasswdImage,
10 | verifyPasswdRefreshImage,
11 | changeUinLogin,
12 | delLoginedAccount,
13 | submitVerifyCode,
14 | refreVerifyCode,
15 | refreshTickets,
16 | getServerTime,
17 | registerPush,
18 | unRegisterPush,
19 | registerCmdCallback,
20 | resetCmdCallback,
21 | reportMsg,
22 | getServerConfig,
23 | onConnOpened,
24 | onReceFirstResp,
25 | onOepnConnAllFailed,
26 | onConnClosed,
27 | onConnWeakNet,
28 | onConnWeakNetNew,
29 | onNetNeedSignon,
30 | onInvalidSign,
31 | onTokenExpired,
32 | onTicketChanged,
33 | onProxyIpChanged,
34 | onOverloadPushNotify,
35 | onPCActive,
36 | onGrayCheckFailed,
37 | onRecvConfigPush,
38 | onRecvVerifyCode,
39 | onRecvPushMsg,
40 | onRecvNotifyMsg,
41 | onOnlineStatusChanged,
42 | _msf_RegPush,
43 | _msf_UnRegPush,
44 | _msf_queryPush,
45 | _msf_hello,
46 | _msf_refreToken,
47 | _msf_kickedAndCleanTokenResp,
48 | _msf_getConfig,
49 | _msf_HeartbeatAlive,
50 | _msf_NetException,
51 | SEND_WIRELESS_PSWREQ,
52 | SEND_WIRELESS_MEIBAOREQ,
53 | _setMsfSuspend,
54 | _setMsfResunmed,
55 | msfGetWeakNet,
56 | getPluginConfig,
57 | regUin_queryMobile,
58 | regUin_commitMobile,
59 | regUin_querySmsStat,
60 | regUin_reSendSms,
61 | regUin_commitSmsCode,
62 | regUin_commitPass,
63 | quick_register_checkAccount,
64 | quick_register_getAccount,
65 | checkRole,
66 | changeToken,
67 | proxyRegisterPush,
68 | proxyUnRegisterPush,
69 | appDataIncerment,
70 | getAppDataCount,
71 | accountTokenSyncCheckSign,
72 | appReportLog,
73 | getMsfDebugInfo,
74 | reportRdm,
75 | reportSocket,
76 | pushSetConfig,
77 | getKey,
78 | getAlterTickets,
79 | openConn,
80 | getGatewayIp,
81 | setMsfConnStatus,
82 | keepProcessAlive,
83 | sendVideoAck,
84 | wt_loginAuth,
85 | wt_exchange,
86 | wt_name2uin,
87 | wt_other,
88 | _msf_QualityTest,
89 | wt_GetStWithPasswd,
90 | wt_GetStWithoutPasswd,
91 | wt_CheckPictureAndGetSt,
92 | wt_RefreshPictureData,
93 | wt_VerifyCode,
94 | wt_CloseCode,
95 | wt_CancelCode,
96 | wt_GetA1WithA1,
97 | wt_GetOpenKeyWithoutPasswd,
98 | wt_QuickLoginByGateway,
99 | wt_GetStViaGatewayLogin,
100 | wt_getUIDWithoutPasswd,
101 | wt_GetSaltUinList,
102 | wt_GetStViaPhonePwdLogin,
103 | wt_CheckDevLockStatus,
104 | wt_AskDevLockSms,
105 | wt_CheckDevLockSms,
106 | wt_CloseDevLock,
107 | wt_RefreshSMSData,
108 | wt_CheckSMSAndGetSt,
109 | wt_CheckSMSAndGetStExt,
110 | wt_setRegDevLockFlag,
111 | wt_SetDevlockMobileType,
112 | wt_RegGetSMSVerifyLoginAccount,
113 | wt_CheckSMSVerifyLoginAccount,
114 | wt_RefreshSMSVerifyLoginCode,
115 | wt_VerifySMSVerifyLoginCode,
116 | wt_GetStViaSMSVerifyLogin,
117 | loginByWx,
118 | wt_getStViaWxLogin,
119 | gm_GuardEvent,
120 | qqwifi_notifyAvail,
121 | submitPuzzleVerifyCodeTicket,
122 | startPCActivePolling,
123 | stopPCActivePolling,
124 | openPCActive,
125 | _msf_QuickHeartBeat,
126 | msf_ssoping,
127 | msf_msgsignal,
128 | check_msf_conErro,
129 | msf_refreshDA2,
130 | msf_oshello,
131 | msf_step_counter,
132 | msf_pbSyncMsg,
133 | msf_send_wtpkg,
134 | msf_save_geoginfo,
135 | msf_manual_set_log_level,
136 | msf_update_battery,
137 | msf_update_locale_id,
138 | msfUpdateManagerConfig,
139 | msfUpdateToggle,
140 | wt_refreshMemorySig,
141 | msf_FEKit,
142 | msf_sec_dispatch_event,
143 | msf_active_log_report,
144 | msf_after_fetch_config_log_report,
145 | msf_update_weakNet_config,
146 | msf_update_common_config,
147 | msf_push_register_switch,
148 | msf_weak_net_switch,
149 | msf_update_complex_connect_config,
150 | msf_update_mmkv_config,
151 | msf_listen_msg_sync_end,
152 | msf_before_msg_sync_config
153 | }
154 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/pb/ByteStringMicro.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.pb;
2 |
3 | public class ByteStringMicro {
4 | public static final ByteStringMicro EMPTY = null;
5 |
6 | public static ByteStringMicro copyFrom(String str, String str2) {
7 | return null;
8 | }
9 |
10 | public static ByteStringMicro copyFrom(byte[] bArr) {
11 | return null;
12 | }
13 |
14 | public static ByteStringMicro copyFrom(byte[] bArr, int i2, int i3) {
15 | return null;
16 | }
17 |
18 | public static ByteStringMicro copyFromUtf8(String str) {
19 | return null;
20 | }
21 |
22 | public boolean isEmpty() {
23 | return false;
24 | }
25 |
26 | public int size() {
27 | return 0;
28 | }
29 |
30 | public byte[] toByteArray() {
31 | return null;
32 | }
33 |
34 | public String toString(String str) {
35 | return "";
36 | }
37 |
38 | public String toStringUtf8() {
39 | return "";
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/pb/MessageMicro.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.pb;
2 |
3 | import java.lang.reflect.Field;
4 | import java.util.Arrays;
5 |
6 | public class MessageMicro> {
7 | public static final class FieldMap {
8 | private Object[] defaultValues;
9 | private Field[] fields;
10 | private int[] tags;
11 |
12 | FieldMap(int[] iArr, String[] strArr, Object[] objArr, Class> cls) {
13 | this.tags = iArr;
14 | this.defaultValues = objArr;
15 | this.fields = new Field[iArr.length];
16 | for (int i2 = 0; i2 < iArr.length; i2++) {
17 | try {
18 | this.fields[i2] = cls.getField(strArr[i2]);
19 | } catch (Exception e2) {
20 | e2.printStackTrace();
21 | }
22 | }
23 | }
24 |
25 | void clear(MessageMicro> messageMicro) {
26 | }
27 |
28 | > void copyFields(U u, U u2) {
29 | }
30 |
31 | Field get(int i2) {
32 | int binarySearch = Arrays.binarySearch(this.tags, i2);
33 | if (binarySearch < 0) {
34 | return null;
35 | }
36 | return this.fields[binarySearch];
37 | }
38 |
39 | int getSerializedSize(MessageMicro> messageMicro) {
40 | return 0;
41 | }
42 | }
43 |
44 | public static FieldMap initFieldMap(int[] iArr, String[] strArr, Object[] objArr, Class> cls) {
45 | return new FieldMap(iArr, strArr, objArr, cls);
46 | }
47 |
48 | public final T mergeFrom(byte[] bArr) {
49 | return null;
50 | }
51 |
52 | public final byte[] toByteArray() {
53 | return null;
54 | }
55 |
56 | public T get() {
57 | return null;
58 | }
59 |
60 | public void set(T t) {
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/pb/PBBoolField.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.pb;
2 |
3 | public class PBBoolField extends PBPrimitiveField {
4 | public PBBoolField(boolean z, boolean z2) {
5 | }
6 |
7 | public void set(boolean z) {
8 | }
9 |
10 | public boolean get() {
11 | return false;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/pb/PBBytesField.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.pb;
2 |
3 | public class PBBytesField extends PBPrimitiveField {
4 | public static PBField __repeatHelper__;
5 |
6 | public PBBytesField(ByteStringMicro byteStringMicro, boolean z) {
7 | }
8 |
9 | public ByteStringMicro get() {
10 | return null;
11 | }
12 |
13 | public void set(ByteStringMicro byteStringMicro) {
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/pb/PBEnumField.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.pb;
2 |
3 | public class PBEnumField extends PBPrimitiveField{
4 | public PBEnumField(int i2, boolean z) {
5 | }
6 |
7 | public int get() {
8 | return 0;
9 | }
10 |
11 | public void set(int i2) {
12 | }
13 |
14 | }
15 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/pb/PBField.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.pb;
2 |
3 | public abstract class PBField {
4 | public static > PBRepeatMessageField initRepeatMessage(Class cls) {
5 | return new PBRepeatMessageField<>(cls);
6 | }
7 |
8 | public static PBRepeatField initRepeat(PBField pBField) {
9 | return new PBRepeatField<>(pBField);
10 | }
11 |
12 | public static PBUInt32Field initUInt32(int i2) {
13 | return new PBUInt32Field(i2, false);
14 | }
15 |
16 | public static PBStringField initString(String str) {
17 | return new PBStringField(str, false);
18 | }
19 |
20 | public static PBBytesField initBytes(ByteStringMicro byteStringMicro) {
21 | return new PBBytesField(byteStringMicro, false);
22 | }
23 |
24 | public static PBFloatField initFloat(float paramFloat) {
25 | return new PBFloatField(paramFloat, false);
26 | }
27 |
28 | public static PBBoolField initBool(boolean z) {
29 | return new PBBoolField(z, false);
30 | }
31 |
32 | public static PBInt32Field initInt32(int i2) {
33 | return new PBInt32Field(i2, false);
34 | }
35 |
36 | public static PBUInt64Field initUInt64(long j2) {
37 | return new PBUInt64Field(j2, false);
38 | }
39 |
40 | public static PBInt64Field initInt64(long j2) {
41 | return new PBInt64Field(j2, false);
42 | }
43 |
44 | public static PBEnumField initEnum(int i2) {
45 | return new PBEnumField(i2, false);
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/pb/PBFloatField.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.pb;
2 |
3 | public class PBFloatField extends PBPrimitiveField {
4 | public PBFloatField(float i2, boolean z) {
5 | }
6 |
7 | public int get() {
8 | return 0;
9 | }
10 |
11 | public void set(int i2) {
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/pb/PBInt32Field.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.pb;
2 |
3 | public class PBInt32Field extends PBPrimitiveField {
4 | public PBInt32Field(int i2, boolean z) {
5 | }
6 |
7 | public int get() {
8 | return 0;
9 | }
10 |
11 | public void set(int i2) {
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/pb/PBInt64Field.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.pb;
2 |
3 | public class PBInt64Field extends PBPrimitiveField {
4 | public PBInt64Field(long i2, boolean z) {
5 | }
6 |
7 | public void set(long i2) {
8 |
9 | }
10 |
11 | public long get() {
12 | return 0;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/pb/PBPrimitiveField.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.pb;
2 |
3 | public abstract class PBPrimitiveField extends PBField {
4 | public final boolean has() {
5 | return false;
6 | }
7 |
8 | public final void setHasFlag(boolean z) {
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/pb/PBRepeatField.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.pb;
2 |
3 | import java.util.Collection;
4 | import java.util.List;
5 |
6 | public final class PBRepeatField extends PBField> {
7 |
8 | public PBRepeatField(PBField pBField) {
9 | }
10 | public void add(T t) {
11 | get().add(t);
12 | }
13 |
14 | public void addAll(Collection collection) {
15 | get().addAll(collection);
16 | }
17 |
18 | public void clear(Object obj) {
19 | }
20 |
21 | public void copyFrom(PBField> pBField) {
22 | }
23 |
24 | public T get(int index) {
25 | return null;
26 | }
27 |
28 | public List get() {
29 | return null;
30 | }
31 |
32 | public boolean has() {
33 | return !isEmpty();
34 | }
35 |
36 | public boolean isEmpty() {
37 | return false;
38 | }
39 |
40 | public void remove(int index) {
41 | }
42 |
43 | public void set(int index, T t) {
44 | }
45 |
46 | public void set(List list) {
47 | }
48 |
49 | public int size() {
50 | return 0;
51 | }
52 | }
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/pb/PBRepeatMessageField.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.pb;
2 |
3 | import java.util.List;
4 |
5 | public final class PBRepeatMessageField> extends PBField> {
6 | public PBRepeatMessageField(Class cls) {
7 |
8 | }
9 |
10 | public void add(T t) {
11 |
12 | }
13 |
14 | public T get(int pos) {
15 | return null;
16 | }
17 |
18 | public List get() {
19 | return null;
20 | }
21 |
22 | public boolean isEmpty() {
23 | return false;
24 | }
25 |
26 | public void set(int i2, T t) {
27 | }
28 |
29 | public void set(List list) {
30 | }
31 |
32 | public int size() {
33 | return 0;
34 | }
35 |
36 |
37 | }
38 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/pb/PBStringField.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.pb;
2 |
3 | public class PBStringField extends PBPrimitiveField{
4 | public PBStringField(String str, boolean z) {
5 | }
6 |
7 | public void set(String str, boolean z) {
8 | }
9 |
10 | public void set(String str) {
11 | }
12 |
13 | public String get() {
14 | return "";
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/pb/PBUInt32Field.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.pb;
2 |
3 | public class PBUInt32Field extends PBPrimitiveField {
4 | public static PBUInt32Field __repeatHelper__;
5 |
6 | public PBUInt32Field(int i2, boolean z) {
7 | }
8 |
9 | public void set(int i2) {
10 |
11 | }
12 |
13 | public int get() {
14 | return 0;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/pb/PBUInt64Field.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.pb;
2 |
3 | public class PBUInt64Field extends PBPrimitiveField {
4 | public static PBField __repeatHelper__;
5 |
6 | public PBUInt64Field(long i2, boolean z) {
7 | }
8 |
9 | public void set(long i2) {
10 |
11 | }
12 |
13 | public long get() {
14 | return 0;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/profile/vote/VoteHelper.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.profile.vote;
2 |
3 | public class VoteHelper {
4 | }
5 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/profilecard/base/component/AbsProfileHeaderComponent.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.profilecard.base.component;
2 |
3 | public class AbsProfileHeaderComponent {
4 | }
5 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/qfix/ApplicationDelegate.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.qfix;
2 |
3 | import android.app.Application;
4 |
5 | public class ApplicationDelegate extends Application {
6 | }
7 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/qroute/QRoute.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.qroute;
2 |
3 | import androidx.annotation.NonNull;
4 |
5 | public class QRoute {
6 | @NonNull
7 | public static T api(Class cls) {
8 | return null;
9 | }
10 |
11 | public static T apiFromPlugin(Class cls) {
12 | return null;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/qroute/QRouteApi.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.qroute;
2 |
3 | public interface QRouteApi {
4 | }
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/troop/api/ITroopMemberInfoService.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.troop.api;
2 |
3 | import com.tencent.mobileqq.data.troop.TroopMemberInfo;
4 |
5 | import java.util.List;
6 |
7 | import mqq.app.api.IRuntimeService;
8 |
9 | public interface ITroopMemberInfoService extends IRuntimeService {
10 | List getAllTroopMembers(String groupUin);
11 |
12 | boolean deleteTroopMembers(String groupUin);
13 |
14 | TroopMemberInfo getTroopMember(String groupUin, String memberUin);
15 |
16 | void getTroopsMemberList();
17 |
18 | boolean deleteTroopMember(String groupUin, String memberUin);
19 |
20 | boolean isMemberInCache(String groupUin, String memberUin);
21 | }
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/vas/api/IVasManager.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.vas.api;
2 |
3 | import org.jetbrains.annotations.NotNull;
4 |
5 | public interface IVasManager {
6 | @NotNull
7 | String getManagerName();
8 | }
9 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/vas/api/IVasSingedApi.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.vas.api;
2 |
3 | import com.tencent.mobileqq.vip.IVipStatusManager;
4 | import org.jetbrains.annotations.NotNull;
5 | import mqq.app.api.IRuntimeService;
6 |
7 | public interface IVasSingedApi extends IRuntimeService {
8 | @NotNull
9 | IVipStatusManager getVipStatus();
10 | }
11 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/mobileqq/vip/IVipStatusManager.java:
--------------------------------------------------------------------------------
1 | package com.tencent.mobileqq.vip;
2 |
3 | import com.tencent.mobileqq.vas.api.IVasManager;
4 | import org.jetbrains.annotations.Nullable;
5 |
6 | public interface IVipStatusManager extends IVasManager {
7 | int getPrivilegeFlags(@Nullable String str);
8 |
9 | boolean isBigClub();
10 |
11 | boolean isSVip();
12 |
13 | boolean isStar();
14 |
15 | boolean isSuperQQ();
16 |
17 | boolean isVip();
18 | }
19 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qphone/base/remote/SimpleAccount.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qphone.base.remote;
2 |
3 | import java.util.HashMap;
4 |
5 | public class SimpleAccount {
6 | public static final String _ISLOGINED = "_isLogined";
7 | public static final String _LOGINPROCESS = "_loginedProcess";
8 | public static final String _LOGINTIME = "_loginTime";
9 | public static final String _UIN = "_uin";
10 |
11 | public boolean containsKey(String str) {
12 | return false;
13 | }
14 |
15 | public boolean equals(Object obj) {
16 | return false;
17 | }
18 |
19 | public String getAttribute(String str, String str2) {
20 | return str2;
21 | }
22 |
23 | public HashMap getAttributes() {
24 | return null;
25 | }
26 |
27 | public String getLoginProcess() {
28 | return "";
29 | }
30 |
31 | public String getUin() {
32 | return "";
33 | }
34 |
35 | public boolean isLogined() {
36 | return false;
37 | }
38 |
39 | public String removeAttribute(String str) {
40 | return "";
41 | }
42 |
43 | public void setAttribute(String str, String str2) {
44 | throw new RuntimeException("key found space ");
45 | }
46 |
47 | public void setLoginProcess(String str) {
48 | }
49 |
50 | public void setUin(String str) {
51 | }
52 |
53 | public String toStoreString() {
54 | return "";
55 | }
56 |
57 | public String toString() {
58 | return "";
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qphone/base/util/BaseApplication.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qphone.base.util;
2 |
3 | import com.tencent.mobileqq.qfix.ApplicationDelegate;
4 |
5 | public abstract class BaseApplication extends ApplicationDelegate {
6 | public static BaseApplication getContext() {
7 | throw new UnsupportedOperationException();
8 | }
9 |
10 | public abstract int getAppId();
11 |
12 | public abstract int getNTCoreVersion();
13 |
14 | public abstract String getQua();
15 | }
16 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/api/IKernelService.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.api;
2 |
3 | import com.tencent.qqnt.kernel.nativeinterface.IQQNTWrapperSession;
4 |
5 | import mqq.app.api.IRuntimeService;
6 |
7 | public interface IKernelService extends IRuntimeService {
8 | IQQNTWrapperSession getWrapperSession();
9 | }
10 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/api/impl/KernelServiceImpl.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.api.impl;
2 |
3 | public class KernelServiceImpl {
4 | }
5 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/api/impl/MsgService.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.api.impl;
2 |
3 |
4 | import com.tencent.qqnt.kernel.nativeinterface.IKernelMsgListener;
5 | import com.tencent.qqnt.kernel.nativeinterface.RichMediaFilePathInfo;
6 |
7 | import org.jetbrains.annotations.NotNull;
8 | import org.jetbrains.annotations.Nullable;
9 |
10 | public class MsgService {
11 | public void addMsgListener(IKernelMsgListener listener) {
12 | }
13 |
14 | // 9.0.8 混淆该方法
15 | //public void addLocalJsonGrayTipMsg(@NotNull Contact contact, @NotNull JsonGrayElement json, boolean needStore, boolean needRecentContact, @Nullable IAddJsonGrayTipMsgCallback iAddJsonGrayTipMsgCallback) {
16 | //}
17 |
18 | @Nullable
19 | public String getRichMediaFilePathForMobileQQSend(@NotNull RichMediaFilePathInfo richMediaFilePathInfo) {
20 | return null;
21 | }
22 | /* public String getRichMediaFilePathForGuild(@NotNull RichMediaFilePathInfo richMediaFilePathInfo) {
23 | return null;
24 | }
25 |
26 | public void prepareTempChat(TempChatPrepareInfo tempChatPrepareInfo, IOperateCallback cb) {
27 |
28 | }*/
29 | }
30 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/AVRecordElement.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | public final class AVRecordElement {
4 | Integer extraType;
5 | boolean hasRead;
6 | int mainType;
7 | String text;
8 | long time;
9 | int type;
10 |
11 | public AVRecordElement() {
12 | this.text = "";
13 | }
14 |
15 | public Integer getExtraType() {
16 | return this.extraType;
17 | }
18 |
19 | public boolean getHasRead() {
20 | return this.hasRead;
21 | }
22 |
23 | public int getMainType() {
24 | return this.mainType;
25 | }
26 |
27 | public String getText() {
28 | return this.text;
29 | }
30 |
31 | public long getTime() {
32 | return this.time;
33 | }
34 |
35 | public int getType() {
36 | return this.type;
37 | }
38 |
39 | public String toString() {
40 | return "AVRecordElement{type=" + this.type + ",time=" + this.time + ",text=" + this.text + ",mainType=" + this.mainType + ",hasRead=" + this.hasRead + ",extraType=" + this.extraType + ",}";
41 | }
42 |
43 | public AVRecordElement(int i2, long j2, String str, int i3, boolean z, Integer num) {
44 | this.text = "";
45 | this.type = i2;
46 | this.time = j2;
47 | this.text = str;
48 | this.mainType = i3;
49 | this.hasRead = z;
50 | this.extraType = num;
51 | }
52 | }
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/ArkElement.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | public final class ArkElement {
4 | String bytesData;
5 | LinkInfo linkInfo;
6 | Integer subElementType;
7 |
8 | public ArkElement() {
9 | this.bytesData = "";
10 | }
11 |
12 | public String getBytesData() {
13 | return this.bytesData;
14 | }
15 |
16 | public LinkInfo getLinkInfo() {
17 | return this.linkInfo;
18 | }
19 |
20 | public Integer getSubElementType() {
21 | return this.subElementType;
22 | }
23 |
24 | public String toString() {
25 | return "ArkElement{bytesData=" + this.bytesData + ",linkInfo=" + this.linkInfo + ",subElementType=" + this.subElementType + ",}";
26 | }
27 |
28 | public ArkElement(String data, LinkInfo linkInfo, Integer num) {
29 | this.bytesData = data;
30 | this.linkInfo = linkInfo;
31 | this.subElementType = num;
32 | }
33 | }
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/CalendarElement.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | import java.io.Serializable;
4 |
5 | public final class CalendarElement implements Serializable {
6 | long expireTimeMs;
7 |
8 | /* renamed from: msg reason: collision with root package name */
9 | String msg;
10 | String schema;
11 | int schemaType;
12 | long serialVersionUID;
13 | String summary;
14 |
15 | public CalendarElement() {
16 | this.serialVersionUID = 1L;
17 | this.summary = "";
18 | this.msg = "";
19 | this.schema = "";
20 | }
21 |
22 | public long getExpireTimeMs() {
23 | return this.expireTimeMs;
24 | }
25 |
26 | public String getMsg() {
27 | return this.msg;
28 | }
29 |
30 | public String getSchema() {
31 | return this.schema;
32 | }
33 |
34 | public int getSchemaType() {
35 | return this.schemaType;
36 | }
37 |
38 | public String getSummary() {
39 | return this.summary;
40 | }
41 |
42 | public String toString() {
43 | return "CalendarElement{summary=" + this.summary + ",msg=" + this.msg + ",expireTimeMs=" + this.expireTimeMs + ",schemaType=" + this.schemaType + ",schema=" + this.schema + ",}";
44 | }
45 |
46 | public CalendarElement(String str, String str2, long j2, int i2, String str3) {
47 | this.serialVersionUID = 1L;
48 | this.summary = str;
49 | this.msg = str2;
50 | this.expireTimeMs = j2;
51 | this.schemaType = i2;
52 | this.schema = str3;
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/Contact.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 |
4 | public final class Contact {
5 | int chatType;
6 | String guildId;
7 | String peerUid;
8 | long serialVersionUID;
9 |
10 | public Contact() {
11 | this.serialVersionUID = 1L;
12 | this.peerUid = "";
13 | this.guildId = "";
14 | }
15 |
16 | public int getChatType() {
17 | return this.chatType;
18 | }
19 |
20 | public String getGuildId() {
21 | return this.guildId;
22 | }
23 |
24 | public String getPeerUid() {
25 | return this.peerUid;
26 | }
27 |
28 | public void setChatType(int i2) {
29 | this.chatType = i2;
30 | }
31 |
32 | public void setGuildId(String str) {
33 | this.guildId = str;
34 | }
35 |
36 | public void setPeerUid(String str) {
37 | this.peerUid = str;
38 | }
39 |
40 | public String toString() {
41 | return "Contact{chatType=" + this.chatType + ",peerUid=" + this.peerUid + ",guildId=" + this.guildId + ",}";
42 | }
43 |
44 | public Contact(int i2, String str, String str2) {
45 | this.serialVersionUID = 1L;
46 | this.chatType = i2;
47 | this.peerUid = str;
48 | this.guildId = str2;
49 | }
50 | }
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/EmojiAD.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 |
4 | public final class EmojiAD {
5 | String desc;
6 | String url;
7 |
8 | public EmojiAD() {
9 | this.url = "";
10 | this.desc = "";
11 | }
12 |
13 | public String getDesc() {
14 | return this.desc;
15 | }
16 |
17 | public String getUrl() {
18 | return this.url;
19 | }
20 |
21 | public String toString() {
22 | return "EmojiAD{url=" + this.url + ",desc=" + this.desc + ",}";
23 | }
24 |
25 | public EmojiAD(String str, String str2) {
26 | this.url = "";
27 | this.desc = "";
28 | this.url = str;
29 | this.desc = str2;
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/EmojiMall.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 |
4 | public final class EmojiMall {
5 | int emojiId;
6 | int packageId;
7 |
8 | public EmojiMall() {
9 | }
10 |
11 | public int getEmojiId() {
12 | return this.emojiId;
13 | }
14 |
15 | public int getPackageId() {
16 | return this.packageId;
17 | }
18 |
19 | public String toString() {
20 | return "EmojiMall{packageId=" + this.packageId + ",emojiId=" + this.emojiId + ",}";
21 | }
22 |
23 | public EmojiMall(int i2, int i3) {
24 | this.packageId = i2;
25 | this.emojiId = i3;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/EmojiZPlan.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | public final class EmojiZPlan {
4 | int actionId;
5 | String actionName;
6 | int actionType;
7 | String bytesReserveInfo;
8 | long peerUid;
9 | int playerNumber;
10 |
11 | public EmojiZPlan() {
12 | this.actionName = "";
13 | this.bytesReserveInfo = "";
14 | }
15 |
16 | public int getActionId() {
17 | return this.actionId;
18 | }
19 |
20 | public String getActionName() {
21 | return this.actionName;
22 | }
23 |
24 | public int getActionType() {
25 | return this.actionType;
26 | }
27 |
28 | public String getBytesReserveInfo() {
29 | return this.bytesReserveInfo;
30 | }
31 |
32 | public long getPeerUid() {
33 | return this.peerUid;
34 | }
35 |
36 | public int getPlayerNumber() {
37 | return this.playerNumber;
38 | }
39 |
40 | public String toString() {
41 | return "EmojiZPlan{actionId=" + this.actionId + ",actionName=" + this.actionName + ",actionType=" + this.actionType + ",playerNumber=" + this.playerNumber + ",peerUid=" + this.peerUid + ",bytesReserveInfo=" + this.bytesReserveInfo + ",}";
42 | }
43 |
44 | public EmojiZPlan(int i2, String str, int i3, int i4, long j2, String str2) {
45 | this.actionName = "";
46 | this.bytesReserveInfo = "";
47 | this.actionId = i2;
48 | this.actionName = str;
49 | this.actionType = i3;
50 | this.playerNumber = i4;
51 | this.peerUid = j2;
52 | this.bytesReserveInfo = str2;
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/FaceBubbleElement.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | public final class FaceBubbleElement {
4 | String content;
5 | Integer faceCount;
6 | Integer faceFlag;
7 | String faceSummary;
8 | int faceType;
9 | String oldVersionStr;
10 | String others;
11 | SmallYellowFaceInfo yellowFaceInfo;
12 |
13 | public FaceBubbleElement() {
14 | }
15 |
16 | public String getContent() {
17 | return this.content;
18 | }
19 |
20 | public Integer getFaceCount() {
21 | return this.faceCount;
22 | }
23 |
24 | public Integer getFaceFlag() {
25 | return this.faceFlag;
26 | }
27 |
28 | public String getFaceSummary() {
29 | return this.faceSummary;
30 | }
31 |
32 | public int getFaceType() {
33 | return this.faceType;
34 | }
35 |
36 | public String getOldVersionStr() {
37 | return this.oldVersionStr;
38 | }
39 |
40 | public String getOthers() {
41 | return this.others;
42 | }
43 |
44 | public SmallYellowFaceInfo getYellowFaceInfo() {
45 | return this.yellowFaceInfo;
46 | }
47 |
48 | public void setContent(String str) {
49 | this.content = str;
50 | }
51 |
52 | public void setFaceCount(Integer num) {
53 | this.faceCount = num;
54 | }
55 |
56 | public void setFaceFlag(Integer num) {
57 | this.faceFlag = num;
58 | }
59 |
60 | public void setFaceSummary(String str) {
61 | this.faceSummary = str;
62 | }
63 |
64 | public void setFaceType(int i2) {
65 | this.faceType = i2;
66 | }
67 |
68 | public void setOldVersionStr(String str) {
69 | this.oldVersionStr = str;
70 | }
71 |
72 | public void setOthers(String str) {
73 | this.others = str;
74 | }
75 |
76 | public void setYellowFaceInfo(SmallYellowFaceInfo smallYellowFaceInfo) {
77 | this.yellowFaceInfo = smallYellowFaceInfo;
78 | }
79 |
80 | public String toString() {
81 | return "FaceBubbleElement{faceType=" + this.faceType + ",faceCount=" + this.faceCount + ",faceSummary=" + this.faceSummary + ",faceFlag=" + this.faceFlag + ",content=" + this.content + ",oldVersionStr=" + this.oldVersionStr + ",others=" + this.others + ",yellowFaceInfo=" + this.yellowFaceInfo + ",}";
82 | }
83 |
84 | public FaceBubbleElement(int i2, Integer num, String str, Integer num2, String str2, String str3, String str4, SmallYellowFaceInfo smallYellowFaceInfo) {
85 | this.faceType = i2;
86 | this.faceCount = num;
87 | this.faceSummary = str;
88 | this.faceFlag = num2;
89 | this.content = str2;
90 | this.oldVersionStr = str3;
91 | this.others = str4;
92 | this.yellowFaceInfo = smallYellowFaceInfo;
93 | }
94 | }
95 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/FaceElement.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | public final class FaceElement {
4 | Integer doubleHit;
5 | Integer faceBubbleCount;
6 | int faceIndex;
7 | String faceText;
8 | int faceType;
9 | Integer imageType;
10 | Integer msgType;
11 | String oldVersionStr;
12 | String packId;
13 | Integer pokeFlag;
14 | Integer pokeStrength;
15 | Integer pokeType;
16 | Integer randomType;
17 | String resultId;
18 | Integer sourceType;
19 | String spokeSummary;
20 | String stickerId;
21 | Integer stickerType;
22 | String surpriseId;
23 | Integer vaspokeId;
24 | String vaspokeMinver;
25 | String vaspokeName;
26 |
27 | public FaceElement() {
28 | }
29 |
30 | public Integer getDoubleHit() {
31 | return this.doubleHit;
32 | }
33 |
34 | public Integer getFaceBubbleCount() {
35 | return this.faceBubbleCount;
36 | }
37 |
38 | public int getFaceIndex() {
39 | return this.faceIndex;
40 | }
41 |
42 | public String getFaceText() {
43 | return this.faceText;
44 | }
45 |
46 | public int getFaceType() {
47 | return this.faceType;
48 | }
49 |
50 | public Integer getImageType() {
51 | return this.imageType;
52 | }
53 |
54 | public Integer getMsgType() {
55 | return this.msgType;
56 | }
57 |
58 | public String getOldVersionStr() {
59 | return this.oldVersionStr;
60 | }
61 |
62 | public String getPackId() {
63 | return this.packId;
64 | }
65 |
66 | public Integer getPokeFlag() {
67 | return this.pokeFlag;
68 | }
69 |
70 | public Integer getPokeStrength() {
71 | return this.pokeStrength;
72 | }
73 |
74 | public Integer getPokeType() {
75 | return this.pokeType;
76 | }
77 |
78 | public Integer getRandomType() {
79 | return this.randomType;
80 | }
81 |
82 | public String getResultId() {
83 | return this.resultId;
84 | }
85 |
86 | public Integer getSourceType() {
87 | return this.sourceType;
88 | }
89 |
90 | public String getSpokeSummary() {
91 | return this.spokeSummary;
92 | }
93 |
94 | public String getStickerId() {
95 | return this.stickerId;
96 | }
97 |
98 | public Integer getStickerType() {
99 | return this.stickerType;
100 | }
101 |
102 | public String getSurpriseId() {
103 | return this.surpriseId;
104 | }
105 |
106 | public Integer getVaspokeId() {
107 | return this.vaspokeId;
108 | }
109 |
110 | public String getVaspokeMinver() {
111 | return this.vaspokeMinver;
112 | }
113 |
114 | public String getVaspokeName() {
115 | return this.vaspokeName;
116 | }
117 |
118 | public void setDoubleHit(Integer num) {
119 | this.doubleHit = num;
120 | }
121 |
122 | public void setFaceBubbleCount(Integer num) {
123 | this.faceBubbleCount = num;
124 | }
125 |
126 | public void setFaceIndex(int i2) {
127 | this.faceIndex = i2;
128 | }
129 |
130 | public void setFaceText(String str) {
131 | this.faceText = str;
132 | }
133 |
134 | public void setFaceType(int i2) {
135 | this.faceType = i2;
136 | }
137 |
138 | public void setImageType(Integer num) {
139 | this.imageType = num;
140 | }
141 |
142 | public void setMsgType(Integer num) {
143 | this.msgType = num;
144 | }
145 |
146 | public void setOldVersionStr(String str) {
147 | this.oldVersionStr = str;
148 | }
149 |
150 | public void setPackId(String str) {
151 | this.packId = str;
152 | }
153 |
154 | public void setPokeFlag(Integer num) {
155 | this.pokeFlag = num;
156 | }
157 |
158 | public void setPokeStrength(Integer num) {
159 | this.pokeStrength = num;
160 | }
161 |
162 | public void setPokeType(Integer num) {
163 | this.pokeType = num;
164 | }
165 |
166 | public void setRandomType(Integer num) {
167 | this.randomType = num;
168 | }
169 |
170 | public void setResultId(String str) {
171 | this.resultId = str;
172 | }
173 |
174 | public void setSourceType(Integer num) {
175 | this.sourceType = num;
176 | }
177 |
178 | public void setSpokeSummary(String str) {
179 | this.spokeSummary = str;
180 | }
181 |
182 | public void setStickerId(String str) {
183 | this.stickerId = str;
184 | }
185 |
186 | public void setStickerType(Integer num) {
187 | this.stickerType = num;
188 | }
189 |
190 | public void setSurpriseId(String str) {
191 | this.surpriseId = str;
192 | }
193 |
194 | public void setVaspokeId(Integer num) {
195 | this.vaspokeId = num;
196 | }
197 |
198 | public void setVaspokeMinver(String str) {
199 | this.vaspokeMinver = str;
200 | }
201 |
202 | public void setVaspokeName(String str) {
203 | this.vaspokeName = str;
204 | }
205 |
206 | public String toString() {
207 | return "FaceElement{faceIndex=" + this.faceIndex + ",faceText=" + this.faceText + ",faceType=" + this.faceType + ",packId=" + this.packId + ",stickerId=" + this.stickerId + ",sourceType=" + this.sourceType + ",stickerType=" + this.stickerType + ",resultId=" + this.resultId + ",surpriseId=" + this.surpriseId + ",randomType=" + this.randomType + ",imageType=" + this.imageType + ",pokeType=" + this.pokeType + ",spokeSummary=" + this.spokeSummary + ",doubleHit=" + this.doubleHit + ",vaspokeId=" + this.vaspokeId + ",vaspokeName=" + this.vaspokeName + ",vaspokeMinver=" + this.vaspokeMinver + ",pokeStrength=" + this.pokeStrength + ",msgType=" + this.msgType + ",faceBubbleCount=" + this.faceBubbleCount + ",oldVersionStr=" + this.oldVersionStr + ",pokeFlag=" + this.pokeFlag + ",}";
208 | }
209 |
210 | public FaceElement(int i2, String str, int i3, String str2, String str3, Integer num, Integer num2, String str4, String str5, Integer num3, Integer num4, Integer num5, String str6, Integer num6, Integer num7, String str7, String str8, Integer num8, Integer num9, Integer num10, String str9, Integer num11) {
211 | this.faceIndex = i2;
212 | this.faceText = str;
213 | this.faceType = i3;
214 | this.packId = str2;
215 | this.stickerId = str3;
216 | this.sourceType = num;
217 | this.stickerType = num2;
218 | this.resultId = str4;
219 | this.surpriseId = str5;
220 | this.randomType = num3;
221 | this.imageType = num4;
222 | this.pokeType = num5;
223 | this.spokeSummary = str6;
224 | this.doubleHit = num6;
225 | this.vaspokeId = num7;
226 | this.vaspokeName = str7;
227 | this.vaspokeMinver = str8;
228 | this.pokeStrength = num8;
229 | this.msgType = num9;
230 | this.faceBubbleCount = num10;
231 | this.oldVersionStr = str9;
232 | this.pokeFlag = num11;
233 | }
234 | }
235 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/GiphyElement.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | public final class GiphyElement {
4 | int height;
5 | String id;
6 | boolean isClip;
7 | int width;
8 |
9 | public GiphyElement() {
10 | this.id = "";
11 | }
12 |
13 | public int getHeight() {
14 | return this.height;
15 | }
16 |
17 | public String getId() {
18 | return this.id;
19 | }
20 |
21 | public boolean getIsClip() {
22 | return this.isClip;
23 | }
24 |
25 | public int getWidth() {
26 | return this.width;
27 | }
28 |
29 | public String toString() {
30 | return "GiphyElement{id=" + this.id + ",isClip=" + this.isClip + ",width=" + this.width + ",height=" + this.height + ",}";
31 | }
32 |
33 | public GiphyElement(String str, boolean z, int i2, int i3) {
34 | this.id = "";
35 | this.id = str;
36 | this.isClip = z;
37 | this.width = i2;
38 | this.height = i3;
39 | }
40 | }
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/IAddJsonGrayTipMsgCallback.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | public interface IAddJsonGrayTipMsgCallback {
4 | void onResult(int result, long msgId);
5 | }
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/IClientKeyCallback.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | public interface IClientKeyCallback {
4 | void onResult(int i, String str, String str2, long j, String str3, long j2);
5 | }
6 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/IKernelGetUidInfoCallback.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | import java.util.HashMap;
4 |
5 | public interface IKernelGetUidInfoCallback {
6 | void onResult(HashMap hashMap);
7 | }
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/IKernelGetUinInfoCallback.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | import java.util.HashMap;
4 |
5 | public interface IKernelGetUinInfoCallback {
6 | void onResult(HashMap hashMap);
7 | }
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/IKernelGroupService.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 |
4 | public interface IKernelGroupService {
5 | /* void getTransferableMemberInfo(long uin, IGetTransferableMemberCallback cb);
6 |
7 | long addKernelGroupListener(IKernelGroupListener ln);*/
8 | }
9 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/IKernelMsgListener.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | public interface IKernelMsgListener {
4 | }
5 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/IKernelMsgService.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | public interface IKernelMsgService {
4 | /* void deleteMsg(Contact contact, ArrayList msgIdList, IOperateCallback callback);
5 |
6 | void fetchLongMsg(Contact contact, long msgId);
7 |
8 | void fetchLongMsgWithCb(Contact contact, long msgId, IOperateCallback back);
9 |
10 | void getRecallMsgsByMsgId(Contact contact, ArrayList msgIdList, IMsgOperateCallback callback);
11 |
12 | void recallMsg(Contact contact, ArrayList msgIdList, IOperateCallback callback);*/
13 |
14 | void addLocalJsonGrayTipMsg(Contact contact, JsonGrayElement jsonGrayElement, boolean z, boolean z2, IAddJsonGrayTipMsgCallback iAddJsonGrayTipMsgCallback);
15 |
16 | void addLocalJsonGrayTipMsg(com.tencent.qqnt.kernelpublic.nativeinterface.Contact contact, com.tencent.qqnt.kernelpublic.nativeinterface.JsonGrayElement jsonGrayElement, boolean z, boolean z2, IAddJsonGrayTipMsgCallback iAddJsonGrayTipMsgCallback);
17 |
18 | /* void addLocalRecordMsg(Contact contact, long msgId, MsgElement elem, HashMap hashMap, boolean z, IOperateCallback callback);
19 |
20 | long getMsgUniqueId(long time);
21 |
22 | void addSendMsg(long msgId, Contact contact, ArrayList msgList, HashMap hashMap);
23 |
24 | void getMsgs(@NotNull Contact contact, long startMsgId, int cnt, boolean queryOrder, @NotNull IMsgOperateCallback iMsgOperateCallback);
25 |
26 | void getMsgsIncludeSelf(Contact contact, long startMsgId, int count, boolean queryOrder, IMsgOperateCallback iMsgOperateCallback);
27 |
28 | void translatePtt2Text(long j2, Contact contact, MsgElement msgElement, IOperateCallback iOperateCallback);
29 |
30 | void getMultiMsg(Contact contact, long rootMsgId, long parentMsgId, IGetMultiMsgCallback cb);
31 |
32 | void multiForwardMsg(ArrayList arrayList, Contact from, Contact to, IOperateCallback cb);
33 |
34 | void setAllC2CAndGroupMsgRead(IOperateCallback cb);
35 |
36 | void clearMsgRecords(Contact contact, IClearMsgRecordsCallback cb);
37 |
38 | String createUidFromTinyId(long j2, long j3);
39 |
40 | void switchBackGround(BackGroundInfo backGroundInfo, IOperateCallback cb);
41 |
42 | void switchBackGroundForMqq(byte[] bArr, IOperateCallback cb);
43 |
44 | void switchForeGround(IOperateCallback cb);
45 |
46 | void switchForeGroundForMqq(byte[] bArr, IOperateCallback cb);*/
47 | }
48 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/IKernelRichMediaService.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 |
4 | public interface IKernelRichMediaService {
5 | /* void batchGetGroupFileCount(ArrayList arrayList, IBatchGroupFileCountCallback iBatchGroupFileCountCallback);
6 |
7 | void cancelSearcheGroupFile(int i2, int i3, String str);
8 |
9 | void cancelTransferTask(Contact contact, ArrayList arrayList, ArrayList arrayList2, IOperateTransferInfoCallback iOperateTransferInfoCallback);
10 |
11 | void deleteGroupFile(long groupCode, String fileUid, int bizId, IDeleteGroupFileCallback cb);
12 |
13 | void deleteTransferInfo(Contact contact, ArrayList arrayList, IOperateTransferInfoCallback iOperateTransferInfoCallback);
14 |
15 | void downloadFile(CommonFileInfo commonFileInfo, int i2, int i3, String str);
16 |
17 | void downloadFileForFileInfo(ArrayList arrayList, String str);
18 |
19 | void downloadFileForFileUuid(Contact contact, String str, ArrayList arrayList);
20 |
21 | void downloadFileForModelId(Contact contact, ArrayList arrayList, String str);
22 |
23 | void downloadRichMediaInVisit(RichDownLoadReq richDownLoadReq);
24 |
25 | void getGroupFileInfo(long j2, String str, IGroupFileInfoCallback iGroupFileInfoCallback);
26 |
27 | int getGroupFileList(long j2, GroupFileListForm groupFileListForm);
28 |
29 | void getGroupSpace(long j2, IGroupSpaceCallback iGroupSpaceCallback);
30 |
31 | int getGroupTransferList(long j2, GroupFileListForm groupFileListForm);
32 |
33 | String getRichMediaFileDir(int i2, int i3, boolean z);
34 |
35 | void getScreenOCR(String str, IWindowsOcrCallback iWindowsOcrCallback);
36 |
37 | void getVideoPlayUrl(Contact contact, long j2, long j3, VideoCodecFormatType videoCodecFormatType, VideoRequestWay videoRequestWay, IVideoPlayUrlCallback iVideoPlayUrlCallback);
38 |
39 | void getVideoPlayUrlInVisit(RichDownLoadReq richDownLoadReq, IVideoPlayUrlCallback iVideoPlayUrlCallback);
40 |
41 | void moveGroupFile(long j2, int i2, String str, String str2, String str3, IMoveGroupFileCallback iMoveGroupFileCallback);
42 |
43 | void onlyDownloadFile(Contact contact, String str, ArrayList arrayList);
44 |
45 | void onlyUploadFile(Contact contact, ArrayList fileParams);
46 |
47 | PicDownParams queryPicDownloadSize(PicReqParams picReqParams);
48 |
49 | void renameGroupFile(long j2, int i2, String str, String str2, String str3, IRenameGroupFileCallback iRenameGroupFileCallback);
50 |
51 | int searchGroupFile(ArrayList arrayList, SearchGroupFileParams searchGroupFileParams, IOperateCallback iOperateCallback);
52 |
53 | void searchGroupFileByWord(ArrayList arrayList, ArrayList arrayList2, String str, String str2, int i2, ISearchGroupFileCallback iSearchGroupFileCallback);
54 |
55 | void searchMoreGroupFile(int i2);
56 |
57 | void transGroupFile(long j2, String str, ITransGroupFileCallback iTransGroupFileCallback);
58 |
59 | void translateEnWordToZn(ArrayList arrayList, ITranslateWordsCallback iTranslateWordsCallback);
60 |
61 | void updateOnlineVideoElemStatus(UploadStatusParams uploadStatusParams);*/
62 | }
63 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/IKernelTicketListener.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | public interface IKernelTicketListener {
4 | }
5 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/IKernelTicketService.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | public interface IKernelTicketService {
4 | long addKernelTicketListener(IKernelTicketListener iKernelTicketListener);
5 |
6 | void forceFetchClientKey(String str, IClientKeyCallback iClientKeyCallback);
7 |
8 | void removeKernelTicketListener(long j);
9 | }
10 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/IKernelUixConvertService.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | import java.util.HashSet;
4 |
5 | public interface IKernelUixConvertService {
6 |
7 | void getUid(HashSet hashSet, IKernelGetUidInfoCallback iKernelGetUidInfoCallback);
8 |
9 | void getUin(HashSet hashSet, IKernelGetUinInfoCallback iKernelGetUinInfoCallback);
10 | }
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/IOperateCallback.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | public interface IOperateCallback {
4 | void onResult(int i, String str);
5 | }
6 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/IQQNTWrapperSession.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | import java.util.ArrayList;
4 |
5 | public interface IQQNTWrapperSession {
6 | final class CppProxy implements IQQNTWrapperSession {
7 | @Override
8 | public IKernelTicketService getTicketService() {
9 | return null;
10 | }
11 |
12 | @Override
13 | public IKernelUixConvertService getUixConvertService() {
14 | return null;
15 | }
16 |
17 | @Override
18 | public IKernelGroupService getGroupService() {
19 | return null;
20 | }
21 |
22 | @Override
23 | public ArrayList getCacheErrLog() {
24 | return null;
25 | }
26 |
27 | @Override
28 | public IKernelMsgService getMsgService() {
29 | return null;
30 | }
31 |
32 | @Override
33 | public IKernelRichMediaService getRichMediaService() {
34 | return null;
35 | }
36 |
37 | @Override
38 | public String getSessionId() {
39 | return null;
40 | }
41 |
42 | @Override
43 | public ArrayList getShortLinkBlacklist() {
44 | return null;
45 | }
46 |
47 | @Override
48 | public boolean offLineSync(boolean z) {
49 | return false;
50 | }
51 |
52 | @Override
53 | public void onDispatchPush(int i2, byte[] bArr) {
54 |
55 | }
56 |
57 | @Override
58 | public void onDispatchRequestReply(long j2, int i2, byte[] bArr) {
59 |
60 | }
61 |
62 | @Override
63 | public void switchToBackGround() {
64 |
65 | }
66 |
67 | @Override
68 | public void switchToFront() {
69 |
70 | }
71 |
72 | @Override
73 | public void updateTicket(SessionTicket sessionTicket) {
74 |
75 | }
76 |
77 | @Override
78 | public void setQimei36(String str) {
79 |
80 | }
81 | }
82 |
83 | IKernelTicketService getTicketService();
84 |
85 | IKernelUixConvertService getUixConvertService();
86 |
87 | IKernelGroupService getGroupService();
88 |
89 | ArrayList getCacheErrLog();
90 |
91 | IKernelMsgService getMsgService();
92 |
93 | IKernelRichMediaService getRichMediaService();
94 |
95 | String getSessionId();
96 |
97 | ArrayList getShortLinkBlacklist();
98 |
99 | boolean offLineSync(boolean z);
100 |
101 | void onDispatchPush(int i2, byte[] bArr);
102 |
103 | void onDispatchRequestReply(long j2, int i2, byte[] bArr);
104 |
105 | void switchToBackGround();
106 |
107 | void switchToFront();
108 |
109 | void updateTicket(SessionTicket sessionTicket);
110 |
111 | void setQimei36(String str);
112 | }
113 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/InlineKeyboardButton.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | import java.util.ArrayList;
4 |
5 | public final class InlineKeyboardButton {
6 | int anchor;
7 | boolean atBotShowChannelList;
8 | int clickLimit;
9 | String data;
10 | boolean enter;
11 | String id;
12 | boolean isReply;
13 | String label;
14 | int permissionType;
15 | ArrayList specifyRoleIds;
16 | ArrayList specifyTinyids;
17 | int style;
18 | ArrayList subscribeDataTemplateIds;
19 | int type;
20 | String unsupportTips;
21 | String visitedLabel;
22 |
23 | public InlineKeyboardButton() {
24 | this.id = "";
25 | this.label = "";
26 | this.visitedLabel = "";
27 | this.unsupportTips = "";
28 | this.data = "";
29 | this.specifyRoleIds = new ArrayList<>();
30 | this.specifyTinyids = new ArrayList<>();
31 | this.subscribeDataTemplateIds = new ArrayList<>();
32 | }
33 |
34 | public int getAnchor() {
35 | return this.anchor;
36 | }
37 |
38 | public boolean getAtBotShowChannelList() {
39 | return this.atBotShowChannelList;
40 | }
41 |
42 | public int getClickLimit() {
43 | return this.clickLimit;
44 | }
45 |
46 | public String getData() {
47 | return this.data;
48 | }
49 |
50 | public boolean getEnter() {
51 | return this.enter;
52 | }
53 |
54 | public String getId() {
55 | return this.id;
56 | }
57 |
58 | public boolean getIsReply() {
59 | return this.isReply;
60 | }
61 |
62 | public String getLabel() {
63 | return this.label;
64 | }
65 |
66 | public int getPermissionType() {
67 | return this.permissionType;
68 | }
69 |
70 | public ArrayList getSpecifyRoleIds() {
71 | return this.specifyRoleIds;
72 | }
73 |
74 | public ArrayList getSpecifyTinyids() {
75 | return this.specifyTinyids;
76 | }
77 |
78 | public int getStyle() {
79 | return this.style;
80 | }
81 |
82 | public ArrayList getSubscribeDataTemplateIds() {
83 | return this.subscribeDataTemplateIds;
84 | }
85 |
86 | public int getType() {
87 | return this.type;
88 | }
89 |
90 | public String getUnsupportTips() {
91 | return this.unsupportTips;
92 | }
93 |
94 | public String getVisitedLabel() {
95 | return this.visitedLabel;
96 | }
97 |
98 | public String toString() {
99 | return "InlineKeyboardButton{id=" + this.id + ",label=" + this.label + ",visitedLabel=" + this.visitedLabel + ",style=" + this.style + ",type=" + this.type + ",clickLimit=" + this.clickLimit + ",unsupportTips=" + this.unsupportTips + ",data=" + this.data + ",atBotShowChannelList=" + this.atBotShowChannelList + ",permissionType=" + this.permissionType + ",specifyRoleIds=" + this.specifyRoleIds + ",specifyTinyids=" + this.specifyTinyids + ",isReply=" + this.isReply + ",anchor=" + this.anchor + ",enter=" + this.enter + ",subscribeDataTemplateIds=" + this.subscribeDataTemplateIds + ",}";
100 | }
101 |
102 | public InlineKeyboardButton(String str, String str2, String str3, int i, int i2, int i3, String str4, String str5, boolean z, int i4, ArrayList arrayList, ArrayList arrayList2) {
103 |
104 | }
105 |
106 | public InlineKeyboardButton(String str, String str2, String str3, int i2, int i3, int i4, String str4, String str5, boolean z, int i5, ArrayList arrayList, ArrayList arrayList2, boolean z2, int i6, boolean z3, ArrayList arrayList3) {
107 | this.id = "";
108 | this.label = "";
109 | this.visitedLabel = "";
110 | this.unsupportTips = "";
111 | this.data = "";
112 | this.specifyRoleIds = new ArrayList<>();
113 | this.specifyTinyids = new ArrayList<>();
114 | this.subscribeDataTemplateIds = new ArrayList<>();
115 | this.id = str;
116 | this.label = str2;
117 | this.visitedLabel = str3;
118 | this.style = i2;
119 | this.type = i3;
120 | this.clickLimit = i4;
121 | this.unsupportTips = str4;
122 | this.data = str5;
123 | this.atBotShowChannelList = z;
124 | this.permissionType = i5;
125 | this.specifyRoleIds = arrayList;
126 | this.specifyTinyids = arrayList2;
127 | this.isReply = z2;
128 | this.anchor = i6;
129 | this.enter = z3;
130 | this.subscribeDataTemplateIds = arrayList3;
131 | }
132 | }
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/InlineKeyboardElement.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | import java.util.ArrayList;
4 |
5 |
6 | public final class InlineKeyboardElement {
7 | long botAppid;
8 | ArrayList rows;
9 |
10 | public InlineKeyboardElement() {
11 | this.rows = new ArrayList<>();
12 | }
13 |
14 | public long getBotAppid() {
15 | return this.botAppid;
16 | }
17 |
18 | public ArrayList getRows() {
19 | return this.rows;
20 | }
21 |
22 | public String toString() {
23 | return "InlineKeyboardElement{rows=" + this.rows + ",botAppid=" + this.botAppid + ",}";
24 | }
25 |
26 | public InlineKeyboardElement(ArrayList arrayList, long j2) {
27 | this.rows = new ArrayList<>();
28 | this.rows = arrayList;
29 | this.botAppid = j2;
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/InlineKeyboardRow.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | import java.util.ArrayList;
4 |
5 |
6 | public final class InlineKeyboardRow {
7 | ArrayList buttons;
8 |
9 | public InlineKeyboardRow() {
10 | this.buttons = new ArrayList<>();
11 | }
12 |
13 | public ArrayList getButtons() {
14 | return this.buttons;
15 | }
16 |
17 | public String toString() {
18 | return "InlineKeyboardRow{buttons=" + this.buttons + ",}";
19 | }
20 |
21 | public InlineKeyboardRow(ArrayList arrayList) {
22 | this.buttons = new ArrayList<>();
23 | this.buttons = arrayList;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/JsonGrayBusiId.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | public final class JsonGrayBusiId {
4 | public static final int AIO_AV_C2C_NOTICE = 2021;
5 | public static final int AIO_AV_GROUP_NOTICE = 2022;
6 | public static final int AIO_C2C_DONT_DISTURB = 2100;
7 | public static final int AIO_CRM_FLAGS_TIPS = 2050;
8 | public static final int AIO_GROUP_ESSENCE_MSG_TIP = 2401;
9 | public static final int AIO_NUDGE_CUSTOM_GUIDE = 2041;
10 | public static final int AIO_RECALL_MSGCUSTOM_WORDINGGUIDE = 2000;
11 | public static final int AIO_ROBOT_SAFETY_TIP = 2201;
12 | public static final int AIO_ZPLAN_EMOTICON_GUIDE = 2301;
13 | public static final int AIO_ZPLAN_SCENE_LINKAGE = 2302;
14 | public static final int AIO_ZPLAN_SEND_MEME = 2300;
15 | public static final int DISBAND_DISCUSSION_GRAY_TIP_ID = 2603;
16 | public static final int GROUP_AIO_CONFIGURABLE_GRAY_TIPS = 2407;
17 | public static final int GROUP_AIO_HOME_SCHOOL_WELCOME_GRAY_TIP_ID = 2404;
18 | public static final int GROUP_AIO_MSG_FREQUENCY_GRAY_TIP_ID = 2406;
19 | public static final int GROUP_AIO_SHUTUP_GRAY_TIP_ID = 2402;
20 | public static final int GROUP_AIO_TEMPORARY_GRAY_TIP_ID = 2405;
21 | public static final int GROUP_AIO_UNREAD_MSG_AI_SUMMARY = 2408;
22 | public static final int GROUP_AIO_UPLOAD_PERMISSIONS_GRAY_TIP_ID = 2403;
23 | public static final int ONLINE_FILE_CANCEL_RECV_ON_RECVING = 4;
24 | public static final int ONLINE_FILE_GO_OFFLINE = 11;
25 | public static final int ONLINE_FILE_GO_OFFLINE_ALL = 12;
26 | public static final int ONLINE_FILE_RECV_BY_MOBILE = 13;
27 | public static final int ONLINE_FILE_RECV_ERROR = 10;
28 | public static final int ONLINE_FILE_REFUSE_ALL_RECV = 7;
29 | public static final int ONLINE_FILE_REFUSE_ALL_RECV_ON_RECVING = 8;
30 | public static final int ONLINE_FILE_REFUSE_RECV = 3;
31 | public static final int ONLINE_FILE_SEND_ERROR = 9;
32 | public static final int ONLINE_FILE_STOP_ALL_SEND = 5;
33 | public static final int ONLINE_FILE_STOP_ALL_SEND_ON_SENDING = 6;
34 | public static final int ONLINE_FILE_STOP_SEND = 1;
35 | public static final int ONLINE_FILE_STOP_SEND_ON_SENDING = 2;
36 | public static final long ONLINE_GROUP_HOME_WORK = 51;
37 | public static final int PTT_AUTO_CHANGE_GUIDE = 2060;
38 | public static final int QCIRCLE_SHOW_FULE_TIPS = 2601;
39 | public static final int QWALLET_GRAY_TIP_ID = 2602;
40 | public static final long RED_BAG = 81;
41 | public static final int RELATION_C2C_GROUP_AIO_SETUP_GROUP_AND_REMARK = 1005;
42 | public static final int RELATION_C2C_LOVER_BONUS = 1003;
43 | public static final int RELATION_C2C_MEMBER_ADD = 1017;
44 | public static final int RELATION_C2C_REACTIVE_DEGRADE_MSG = 1019;
45 | public static final int RELATION_C2C_REACTIVE_UPGRADE_MSG = 1018;
46 | public static final int RELATION_C2C_SAY_HELLO = 1004;
47 | public static final int RELATION_CHAIN_BLACKED = 1000;
48 | public static final int RELATION_CHAIN_MATCH_FRIEND = 1007;
49 | public static final int RELATION_CREATE_GROUP_GRAY_TIP_ID = 1009;
50 | public static final int RELATION_EMOJIEGG_SHOW = 1001;
51 | public static final int RELATION_EMOJIEGG_WILL_DEGRADE = 1002;
52 | public static final int RELATION_FRIEND_CLONE_INFO = 1006;
53 | public static final int RELATION_GROUP_BATCH_ADD_FRIEND = 1020;
54 | public static final int RELATION_GROUP_MEMBER_ADD = 1022;
55 | public static final int RELATION_GROUP_MEMBER_ADD_WITH_MODIFY_NAME = 1015;
56 | public static final int RELATION_GROUP_MEMBER_ADD_WITH_WELCOME = 1016;
57 | public static final int RELATION_GROUP_MEMBER_RECOMMEND = 1021;
58 | public static final int RELATION_GROUP_SHUT_UP = 1014;
59 | public static final int RELATION_LIMIT_TMP_CONVERSATION_SET = 1011;
60 | public static final int RELATION_NEARBY_GOTO_VERIFY = 1008;
61 | public static final int RELATION_ONEWAY_FRIEND_GRAY_TIP_ID = 1012;
62 | public static final int RELATION_ONEWAY_FRIEND_NEW_GRAY_TIP_ID = 1013;
63 | public static final int RELATION_YQT = 1010;
64 | public static final long UI_RESERVE_100000_110000 = 100000;
65 | }
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/JsonGrayElement.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 |
4 | public final class JsonGrayElement {
5 | long busiId;
6 | boolean isServer;
7 | String jsonStr;
8 | String recentAbstract;
9 | XmlToJsonParam xmlToJsonParam;
10 |
11 | public JsonGrayElement() {
12 | this.jsonStr = "";
13 | this.recentAbstract = "";
14 | }
15 |
16 | public long getBusiId() {
17 | return this.busiId;
18 | }
19 |
20 | public boolean getIsServer() {
21 | return this.isServer;
22 | }
23 |
24 | public String getJsonStr() {
25 | return this.jsonStr;
26 | }
27 |
28 | public String getRecentAbstract() {
29 | return this.recentAbstract;
30 | }
31 |
32 | public XmlToJsonParam getXmlToJsonParam() {
33 | return this.xmlToJsonParam;
34 | }
35 |
36 | public String toString() {
37 | return "JsonGrayElement{busiId=" + this.busiId + ",jsonStr=" + this.jsonStr + ",recentAbstract=" + this.recentAbstract + ",isServer=" + this.isServer + ",xmlToJsonParam=" + this.xmlToJsonParam + ",}";
38 | }
39 |
40 | public JsonGrayElement(long j2, String str, String str2, boolean z, XmlToJsonParam xmlToJsonParam) {
41 | this.jsonStr = "";
42 | this.recentAbstract = "";
43 | this.busiId = j2;
44 | this.jsonStr = str;
45 | this.recentAbstract = str2;
46 | this.isServer = z;
47 | this.xmlToJsonParam = xmlToJsonParam;
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/LinkInfo.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | public final class LinkInfo {
4 | String icon;
5 | Integer tencentDocType;
6 | String title;
7 |
8 | public LinkInfo() {
9 | }
10 |
11 | public String getIcon() {
12 | return this.icon;
13 | }
14 |
15 | public Integer getTencentDocType() {
16 | return this.tencentDocType;
17 | }
18 |
19 | public String getTitle() {
20 | return this.title;
21 | }
22 |
23 | public String toString() {
24 | return "LinkInfo{title=" + this.title + ",icon=" + this.icon + ",tencentDocType=" + this.tencentDocType + ",}";
25 | }
26 |
27 | public LinkInfo(String str, String str2, Integer num) {
28 | this.title = str;
29 | this.icon = str2;
30 | this.tencentDocType = num;
31 | }
32 | }
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/MarkdownElement.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 |
4 | public final class MarkdownElement {
5 | String content;
6 |
7 | public MarkdownElement() {
8 | this.content = "";
9 | }
10 |
11 | public String getContent() {
12 | return this.content;
13 | }
14 |
15 | public String toString() {
16 | return "MarkdownElement{content=" + this.content + ",}";
17 | }
18 |
19 | public MarkdownElement(String str) {
20 | this.content = str;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/MarketFaceElement.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | import java.util.ArrayList;
4 |
5 |
6 | public final class MarketFaceElement {
7 | ArrayList apngSupportSize;
8 | String backColor;
9 | String dynamicFacePath;
10 | String emojiId;
11 | int emojiPackageId;
12 | Integer emojiType;
13 | Integer endTime;
14 | int faceInfo;
15 | String faceName;
16 | Integer hasIpProduct;
17 | int imageHeight;
18 | int imageWidth;
19 | int itemType;
20 | String key;
21 | int mediaType;
22 | byte[] mobileParam;
23 | byte[] param;
24 | String sourceJumpUrl;
25 | String sourceName;
26 | Integer sourceType;
27 | String sourceTypeName;
28 | Integer startTime;
29 | String staticFacePath;
30 | int subType;
31 | ArrayList supportSize;
32 | ArrayList voiceItemHeightArr;
33 | String volumeColor;
34 |
35 | public MarketFaceElement() {
36 | }
37 |
38 | public ArrayList getApngSupportSize() {
39 | return this.apngSupportSize;
40 | }
41 |
42 | public String getBackColor() {
43 | return this.backColor;
44 | }
45 |
46 | public String getDynamicFacePath() {
47 | return this.dynamicFacePath;
48 | }
49 |
50 | public String getEmojiId() {
51 | return this.emojiId;
52 | }
53 |
54 | public int getEmojiPackageId() {
55 | return this.emojiPackageId;
56 | }
57 |
58 | public Integer getEmojiType() {
59 | return this.emojiType;
60 | }
61 |
62 | public Integer getEndTime() {
63 | return this.endTime;
64 | }
65 |
66 | public int getFaceInfo() {
67 | return this.faceInfo;
68 | }
69 |
70 | public String getFaceName() {
71 | return this.faceName;
72 | }
73 |
74 | public Integer getHasIpProduct() {
75 | return this.hasIpProduct;
76 | }
77 |
78 | public int getImageHeight() {
79 | return this.imageHeight;
80 | }
81 |
82 | public int getImageWidth() {
83 | return this.imageWidth;
84 | }
85 |
86 | public int getItemType() {
87 | return this.itemType;
88 | }
89 |
90 | public String getKey() {
91 | return this.key;
92 | }
93 |
94 | public int getMediaType() {
95 | return this.mediaType;
96 | }
97 |
98 | public byte[] getMobileParam() {
99 | return this.mobileParam;
100 | }
101 |
102 | public byte[] getParam() {
103 | return this.param;
104 | }
105 |
106 | public String getSourceJumpUrl() {
107 | return this.sourceJumpUrl;
108 | }
109 |
110 | public String getSourceName() {
111 | return this.sourceName;
112 | }
113 |
114 | public Integer getSourceType() {
115 | return this.sourceType;
116 | }
117 |
118 | public String getSourceTypeName() {
119 | return this.sourceTypeName;
120 | }
121 |
122 | public Integer getStartTime() {
123 | return this.startTime;
124 | }
125 |
126 | public String getStaticFacePath() {
127 | return this.staticFacePath;
128 | }
129 |
130 | public int getSubType() {
131 | return this.subType;
132 | }
133 |
134 | public ArrayList getSupportSize() {
135 | return this.supportSize;
136 | }
137 |
138 | public ArrayList getVoiceItemHeightArr() {
139 | return this.voiceItemHeightArr;
140 | }
141 |
142 | public String getVolumeColor() {
143 | return this.volumeColor;
144 | }
145 |
146 | public String toString() {
147 | return "MarketFaceElement{itemType=" + this.itemType + ",faceInfo=" + this.faceInfo + ",emojiPackageId=" + this.emojiPackageId + ",subType=" + this.subType + ",mediaType=" + this.mediaType + ",imageWidth=" + this.imageWidth + ",imageHeight=" + this.imageHeight + ",faceName=" + this.faceName + ",emojiId=" + this.emojiId + ",key=" + this.key + ",param=" + this.param + ",mobileParam=" + this.mobileParam + ",sourceType=" + this.sourceType + ",startTime=" + this.startTime + ",endTime=" + this.endTime + ",emojiType=" + this.emojiType + ",hasIpProduct=" + this.hasIpProduct + ",voiceItemHeightArr=" + this.voiceItemHeightArr + ",sourceName=" + this.sourceName + ",sourceJumpUrl=" + this.sourceJumpUrl + ",sourceTypeName=" + this.sourceTypeName + ",backColor=" + this.backColor + ",volumeColor=" + this.volumeColor + ",staticFacePath=" + this.staticFacePath + ",dynamicFacePath=" + this.dynamicFacePath + ",supportSize=" + this.supportSize + ",apngSupportSize=" + this.apngSupportSize + ",}";
148 | }
149 |
150 | public MarketFaceElement(int itemType, int faceInfo, int packageId, int subtype, int mediaType,
151 | int width, int height, String faceName, String emojiId, String key,
152 | byte[] param, byte[] mobileParam,
153 | Integer sourceType, Integer startTime, Integer endTime,
154 | Integer emojiType, Integer hasIpProduct,
155 | ArrayList voiceItemHeightArr,
156 | String sourceName, String jumpurl, String sourceTypeName,
157 | String backgroundColor, String volumColor,
158 | String staticPath, String dynamicPath,
159 | ArrayList supportSize,
160 | ArrayList apngSupportSize) {
161 | this.itemType = itemType;
162 | this.faceInfo = faceInfo;
163 | this.emojiPackageId = packageId;
164 | this.subType = subtype;
165 | this.mediaType = mediaType;
166 | this.imageWidth = width;
167 | this.imageHeight = height;
168 | this.faceName = faceName;
169 | this.emojiId = emojiId;
170 | this.key = key;
171 | this.param = param;
172 | this.mobileParam = mobileParam;
173 | this.sourceType = sourceType;
174 | this.startTime = startTime;
175 | this.endTime = endTime;
176 | this.emojiType = emojiType;
177 | this.hasIpProduct = hasIpProduct;
178 | this.voiceItemHeightArr = voiceItemHeightArr;
179 | this.sourceName = sourceName;
180 | this.sourceJumpUrl = jumpurl;
181 | this.sourceTypeName = sourceTypeName;
182 | this.backColor = backgroundColor;
183 | this.volumeColor = volumColor;
184 | this.staticFacePath = staticPath;
185 | this.dynamicFacePath = dynamicPath;
186 | this.supportSize = supportSize;
187 | this.apngSupportSize = apngSupportSize;
188 | }
189 | }
190 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/MarketFaceSupportSize.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 |
4 | public final class MarketFaceSupportSize {
5 | int height;
6 | int width;
7 |
8 | public MarketFaceSupportSize() {
9 | }
10 |
11 | public int getHeight() {
12 | return this.height;
13 | }
14 |
15 | public int getWidth() {
16 | return this.width;
17 | }
18 |
19 | public String toString() {
20 | return "MarketFaceSupportSize{width=" + this.width + ",height=" + this.height + ",}";
21 | }
22 |
23 | public MarketFaceSupportSize(int i2, int i3) {
24 | this.width = i2;
25 | this.height = i3;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/MultiForwardMsgElement.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | public final class MultiForwardMsgElement {
4 | String fileName;
5 | String resId;
6 | String xmlContent;
7 |
8 | public MultiForwardMsgElement() {
9 | }
10 |
11 | public String getFileName() {
12 | return this.fileName;
13 | }
14 |
15 | public String getResId() {
16 | return this.resId;
17 | }
18 |
19 | public String getXmlContent() {
20 | return this.xmlContent;
21 | }
22 |
23 | public String toString() {
24 | return "MultiForwardMsgElement{xmlContent=" + this.xmlContent + ",resId=" + this.resId + ",fileName=" + this.fileName + ",}";
25 | }
26 |
27 | public MultiForwardMsgElement(String str, String str2, String str3) {
28 | this.xmlContent = str;
29 | this.resId = str2;
30 | this.fileName = str3;
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/ReplyAbsElement.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 |
4 | public final class ReplyAbsElement {
5 | ReplyAbsFaceElement faceElem;
6 | int replyAbsElemType;
7 | String textElemContent;
8 |
9 | public ReplyAbsElement() {
10 | }
11 |
12 | public ReplyAbsFaceElement getFaceElem() {
13 | return this.faceElem;
14 | }
15 |
16 | public int getReplyAbsElemType() {
17 | return this.replyAbsElemType;
18 | }
19 |
20 | public String getTextElemContent() {
21 | return this.textElemContent;
22 | }
23 |
24 | public String toString() {
25 | return "ReplyAbsElement{replyAbsElemType=" + this.replyAbsElemType + ",textElemContent=" + this.textElemContent + ",faceElem=" + this.faceElem + ",}";
26 | }
27 |
28 | public ReplyAbsElement(int i2, String str, ReplyAbsFaceElement replyAbsFaceElement) {
29 | this.replyAbsElemType = i2;
30 | this.textElemContent = str;
31 | this.faceElem = replyAbsFaceElement;
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/ReplyAbsFaceElement.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 |
4 | public final class ReplyAbsFaceElement {
5 | int faceIndex;
6 | String faceText;
7 | int faceType;
8 |
9 | public ReplyAbsFaceElement() {
10 | }
11 |
12 | public int getFaceIndex() {
13 | return this.faceIndex;
14 | }
15 |
16 | public String getFaceText() {
17 | return this.faceText;
18 | }
19 |
20 | public int getFaceType() {
21 | return this.faceType;
22 | }
23 |
24 | public String toString() {
25 | return "ReplyAbsFaceElement{faceIndex=" + this.faceIndex + ",faceText=" + this.faceText + ",faceType=" + this.faceType + ",}";
26 | }
27 |
28 | public ReplyAbsFaceElement(int i2, String str, int i3) {
29 | this.faceIndex = i2;
30 | this.faceText = str;
31 | this.faceType = i3;
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/ReplyElement.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | import java.io.Serializable;
4 | import java.util.ArrayList;
5 |
6 | public final class ReplyElement implements Serializable {
7 | String anonymousNickName;
8 | Integer originalMsgState;
9 | long replayMsgId;
10 | Long replayMsgRootCommentCnt;
11 | Long replayMsgRootMsgId;
12 | Long replayMsgRootSeq;
13 | Long replayMsgSeq;
14 | Long replyMsgClientSeq;
15 | int replyMsgRevokeType;
16 | Long replyMsgTime;
17 | Long senderUid;
18 | String senderUidStr;
19 | long serialVersionUID;
20 | boolean sourceMsgExpired;
21 | Long sourceMsgIdInRecords;
22 | boolean sourceMsgIsIncPic;
23 | String sourceMsgText;
24 | ArrayList sourceMsgTextElems;
25 |
26 | public ReplyElement() {
27 | this.serialVersionUID = 1L;
28 | this.sourceMsgTextElems = new ArrayList<>();
29 | }
30 |
31 | public String getAnonymousNickName() {
32 | return this.anonymousNickName;
33 | }
34 |
35 | public Integer getOriginalMsgState() {
36 | return this.originalMsgState;
37 | }
38 |
39 | public long getReplayMsgId() {
40 | return this.replayMsgId;
41 | }
42 |
43 | public Long getReplayMsgRootCommentCnt() {
44 | return this.replayMsgRootCommentCnt;
45 | }
46 |
47 | public Long getReplayMsgRootMsgId() {
48 | return this.replayMsgRootMsgId;
49 | }
50 |
51 | public Long getReplayMsgRootSeq() {
52 | return this.replayMsgRootSeq;
53 | }
54 |
55 | public Long getReplayMsgSeq() {
56 | return this.replayMsgSeq;
57 | }
58 |
59 | public Long getReplyMsgClientSeq() {
60 | return this.replyMsgClientSeq;
61 | }
62 |
63 | public int getReplyMsgRevokeType() {
64 | return this.replyMsgRevokeType;
65 | }
66 |
67 | public Long getReplyMsgTime() {
68 | return this.replyMsgTime;
69 | }
70 |
71 | public Long getSenderUid() {
72 | return this.senderUid;
73 | }
74 |
75 | public String getSenderUidStr() {
76 | return this.senderUidStr;
77 | }
78 |
79 | public boolean getSourceMsgExpired() {
80 | return this.sourceMsgExpired;
81 | }
82 |
83 | public Long getSourceMsgIdInRecords() {
84 | return this.sourceMsgIdInRecords;
85 | }
86 |
87 | public boolean getSourceMsgIsIncPic() {
88 | return this.sourceMsgIsIncPic;
89 | }
90 |
91 | public String getSourceMsgText() {
92 | return this.sourceMsgText;
93 | }
94 |
95 | public ArrayList getSourceMsgTextElems() {
96 | return this.sourceMsgTextElems;
97 | }
98 |
99 | public void setAnonymousNickName(String str) {
100 | this.anonymousNickName = str;
101 | }
102 |
103 | public void setOriginalMsgState(Integer num) {
104 | this.originalMsgState = num;
105 | }
106 |
107 | public void setReplayMsgId(long j2) {
108 | this.replayMsgId = j2;
109 | }
110 |
111 | public void setReplayMsgRootCommentCnt(Long l2) {
112 | this.replayMsgRootCommentCnt = l2;
113 | }
114 |
115 | public void setReplayMsgRootMsgId(Long l2) {
116 | this.replayMsgRootMsgId = l2;
117 | }
118 |
119 | public void setReplayMsgRootSeq(Long l2) {
120 | this.replayMsgRootSeq = l2;
121 | }
122 |
123 | public void setReplayMsgSeq(Long l2) {
124 | this.replayMsgSeq = l2;
125 | }
126 |
127 | public void setReplyMsgClientSeq(Long l2) {
128 | this.replyMsgClientSeq = l2;
129 | }
130 |
131 | public void setReplyMsgRevokeType(int i2) {
132 | this.replyMsgRevokeType = i2;
133 | }
134 |
135 | public void setReplyMsgTime(Long l2) {
136 | this.replyMsgTime = l2;
137 | }
138 |
139 | public void setSenderUid(Long l2) {
140 | this.senderUid = l2;
141 | }
142 |
143 | public void setSenderUidStr(String str) {
144 | this.senderUidStr = str;
145 | }
146 |
147 | public void setSourceMsgExpired(boolean z) {
148 | this.sourceMsgExpired = z;
149 | }
150 |
151 | public void setSourceMsgIdInRecords(Long l2) {
152 | this.sourceMsgIdInRecords = l2;
153 | }
154 |
155 | public void setSourceMsgIsIncPic(boolean z) {
156 | this.sourceMsgIsIncPic = z;
157 | }
158 |
159 | public void setSourceMsgText(String str) {
160 | this.sourceMsgText = str;
161 | }
162 |
163 | public void setSourceMsgTextElems(ArrayList arrayList) {
164 | this.sourceMsgTextElems = arrayList;
165 | }
166 |
167 | public String toString() {
168 | return "ReplyElement{replayMsgId=" + this.replayMsgId + ",replayMsgSeq=" + this.replayMsgSeq + ",replayMsgRootSeq=" + this.replayMsgRootSeq + ",replayMsgRootMsgId=" + this.replayMsgRootMsgId + ",replayMsgRootCommentCnt=" + this.replayMsgRootCommentCnt + ",sourceMsgIdInRecords=" + this.sourceMsgIdInRecords + ",sourceMsgText=" + this.sourceMsgText + ",sourceMsgTextElems=" + this.sourceMsgTextElems + ",senderUid=" + this.senderUid + ",senderUidStr=" + this.senderUidStr + ",replyMsgClientSeq=" + this.replyMsgClientSeq + ",replyMsgTime=" + this.replyMsgTime + ",replyMsgRevokeType=" + this.replyMsgRevokeType + ",sourceMsgIsIncPic=" + this.sourceMsgIsIncPic + ",sourceMsgExpired=" + this.sourceMsgExpired + ",anonymousNickName=" + this.anonymousNickName + ",originalMsgState=" + this.originalMsgState + ",}";
169 | }
170 |
171 | public ReplyElement(long j2, Long l2, Long l3, Long l4, Long l5, Long l6, String str, ArrayList arrayList, Long l7, String str2, Long l8, Long l9, int i2, boolean z, boolean z2, String str3, Integer num) {
172 | this.serialVersionUID = 1L;
173 | this.sourceMsgTextElems = new ArrayList<>();
174 | this.replayMsgId = j2;
175 | this.replayMsgSeq = l2;
176 | this.replayMsgRootSeq = l3;
177 | this.replayMsgRootMsgId = l4;
178 | this.replayMsgRootCommentCnt = l5;
179 | this.sourceMsgIdInRecords = l6;
180 | this.sourceMsgText = str;
181 | this.sourceMsgTextElems = arrayList;
182 | this.senderUid = l7;
183 | this.senderUidStr = str2;
184 | this.replyMsgClientSeq = l8;
185 | this.replyMsgTime = l9;
186 | this.replyMsgRevokeType = i2;
187 | this.sourceMsgIsIncPic = z;
188 | this.sourceMsgExpired = z2;
189 | this.anonymousNickName = str3;
190 | this.originalMsgState = num;
191 | }
192 | }
193 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/RichMediaFilePathInfo.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | public final class RichMediaFilePathInfo {
4 | int downloadType;
5 | int elementSubType;
6 | int elementType;
7 | String fileName;
8 | String fileUuid;
9 | byte[] importRichMediaContext;
10 | String md5HexStr;
11 | boolean needCreate;
12 | int thumbSize;
13 |
14 | public RichMediaFilePathInfo() {
15 | this.md5HexStr = "";
16 | this.fileName = "";
17 | this.fileUuid = "";
18 | }
19 |
20 | public int getDownloadType() {
21 | return this.downloadType;
22 | }
23 |
24 | public int getElementSubType() {
25 | return this.elementSubType;
26 | }
27 |
28 | public int getElementType() {
29 | return this.elementType;
30 | }
31 |
32 | public String getFileName() {
33 | return this.fileName;
34 | }
35 |
36 | public String getFileUuid() {
37 | return this.fileUuid;
38 | }
39 |
40 | public byte[] getImportRichMediaContext() {
41 | return this.importRichMediaContext;
42 | }
43 |
44 | public String getMd5HexStr() {
45 | return this.md5HexStr;
46 | }
47 |
48 | public boolean getNeedCreate() {
49 | return this.needCreate;
50 | }
51 |
52 | public int getThumbSize() {
53 | return this.thumbSize;
54 | }
55 |
56 | public RichMediaFilePathInfo(int elementType, int elementSubType, String md5Hex, String fileName, int downloadType, int thumbSiz, byte[] importRichMediaContext, String uuid, boolean needCreate) {
57 | this.md5HexStr = "";
58 | this.fileName = "";
59 | this.fileUuid = "";
60 | this.elementType = elementType;
61 | this.elementSubType = elementSubType;
62 | this.md5HexStr = md5Hex;
63 | this.fileName = fileName;
64 | this.downloadType = downloadType;
65 | this.thumbSize = thumbSiz;
66 | this.importRichMediaContext = importRichMediaContext;
67 | this.fileUuid = uuid;
68 | this.needCreate = needCreate;
69 | }
70 | }
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/SessionTicket.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | import androidx.annotation.NonNull;
4 |
5 | public final class SessionTicket {
6 | public String a2;
7 | public String d2;
8 | public String d2Key;
9 |
10 | public SessionTicket() {
11 | this.a2 = "";
12 | this.d2 = "";
13 | this.d2Key = "";
14 | }
15 |
16 | public String getA2() {
17 | return this.a2;
18 | }
19 |
20 | public String getD2() {
21 | return this.d2;
22 | }
23 |
24 | public String getD2Key() {
25 | return this.d2Key;
26 | }
27 |
28 | @NonNull
29 | public String toString() {
30 | return "SessionTicket{a2=" + this.a2 + ",d2=" + this.d2 + ",d2Key=" + this.d2Key + ",}";
31 | }
32 |
33 | public SessionTicket(String str, String str2, String str3) {
34 | this.a2 = str;
35 | this.d2 = str2;
36 | this.d2Key = str3;
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/ShareLocationElement.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 |
4 |
5 | public final class ShareLocationElement {
6 | String ext;
7 | String text;
8 |
9 | public ShareLocationElement() {
10 | }
11 |
12 | public String getExt() {
13 | return this.ext;
14 | }
15 |
16 | public String getText() {
17 | return this.text;
18 | }
19 |
20 | public void setExt(String str) {
21 | this.ext = str;
22 | }
23 |
24 | public void setText(String str) {
25 | this.text = str;
26 | }
27 |
28 | public String toString() {
29 | return "ShareLocationElement{text=" + this.text + ",ext=" + this.ext + ",}";
30 | }
31 |
32 | public ShareLocationElement(String str, String str2) {
33 | this.text = str;
34 | this.ext = str2;
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/SmallYellowFaceInfo.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 |
4 |
5 | public final class SmallYellowFaceInfo {
6 | String buf;
7 | String compatibleText;
8 | int index;
9 | String text;
10 |
11 | public SmallYellowFaceInfo() {
12 | }
13 |
14 | public String getBuf() {
15 | return this.buf;
16 | }
17 |
18 | public String getCompatibleText() {
19 | return this.compatibleText;
20 | }
21 |
22 | public int getIndex() {
23 | return this.index;
24 | }
25 |
26 | public String getText() {
27 | return this.text;
28 | }
29 |
30 | public void setBuf(String str) {
31 | this.buf = str;
32 | }
33 |
34 | public void setCompatibleText(String str) {
35 | this.compatibleText = str;
36 | }
37 |
38 | public void setIndex(int i2) {
39 | this.index = i2;
40 | }
41 |
42 | public void setText(String str) {
43 | this.text = str;
44 | }
45 |
46 | public String toString() {
47 | return "SmallYellowFaceInfo{index=" + this.index + ",text=" + this.text + ",compatibleText=" + this.compatibleText + ",buf=" + this.buf + ",}";
48 | }
49 |
50 | public SmallYellowFaceInfo(int i2, String str, String str2, String str3) {
51 | this.index = i2;
52 | this.text = str;
53 | this.compatibleText = str2;
54 | this.buf = str3;
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/StructLongMsgElement.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 |
4 |
5 | public final class StructLongMsgElement {
6 | String resId;
7 | String xmlContent;
8 |
9 | public StructLongMsgElement() {
10 | }
11 |
12 | public String getResId() {
13 | return this.resId;
14 | }
15 |
16 | public String getXmlContent() {
17 | return this.xmlContent;
18 | }
19 |
20 | public String toString() {
21 | return "StructLongMsgElement{xmlContent=" + this.xmlContent + ",resId=" + this.resId + ",}";
22 | }
23 |
24 | public StructLongMsgElement(String str, String str2) {
25 | this.xmlContent = str;
26 | this.resId = str2;
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/StructMsgElement.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | public final class StructMsgElement {
4 | String xmlContent;
5 |
6 | public StructMsgElement() {
7 | }
8 |
9 | public String getXmlContent() {
10 | return this.xmlContent;
11 | }
12 |
13 | public String toString() {
14 | return "StructMsgElement{xmlContent=" + this.xmlContent + ",}";
15 | }
16 |
17 | public StructMsgElement(String str) {
18 | this.xmlContent = str;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/SubscribeMsgTemplateID.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | public class SubscribeMsgTemplateID {
4 | }
5 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/TextElement.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | public final class TextElement {
4 | Long atChannelId;
5 | String atNtUid;
6 | Integer atRoleColor;
7 | Long atRoleId;
8 | String atRoleName;
9 | long atTinyId;
10 | int atType;
11 | long atUid;
12 | String content;
13 | LinkInfo linkInfo;
14 | Integer needNotify;
15 | Integer subElementType;
16 |
17 | public TextElement() {
18 | this.content = "";
19 | }
20 |
21 | public Long getAtChannelId() {
22 | return this.atChannelId;
23 | }
24 |
25 | public String getAtNtUid() {
26 | return this.atNtUid;
27 | }
28 |
29 | public Integer getAtRoleColor() {
30 | return this.atRoleColor;
31 | }
32 |
33 | public Long getAtRoleId() {
34 | return this.atRoleId;
35 | }
36 |
37 | public String getAtRoleName() {
38 | return this.atRoleName;
39 | }
40 |
41 | public long getAtTinyId() {
42 | return this.atTinyId;
43 | }
44 |
45 | public int getAtType() {
46 | return this.atType;
47 | }
48 |
49 | public long getAtUid() {
50 | return this.atUid;
51 | }
52 |
53 | public String getContent() {
54 | return this.content;
55 | }
56 |
57 | public LinkInfo getLinkInfo() {
58 | return this.linkInfo;
59 | }
60 |
61 | public Integer getNeedNotify() {
62 | return this.needNotify;
63 | }
64 |
65 | public Integer getSubElementType() {
66 | return this.subElementType;
67 | }
68 |
69 | public void setAtChannelId(Long l2) {
70 | this.atChannelId = l2;
71 | }
72 |
73 | public void setAtNtUid(String str) {
74 | this.atNtUid = str;
75 | }
76 |
77 | public void setAtRoleColor(Integer num) {
78 | this.atRoleColor = num;
79 | }
80 |
81 | public void setAtRoleId(Long l2) {
82 | this.atRoleId = l2;
83 | }
84 |
85 | public void setAtRoleName(String str) {
86 | this.atRoleName = str;
87 | }
88 |
89 | public void setAtTinyId(long j2) {
90 | this.atTinyId = j2;
91 | }
92 |
93 | public void setAtType(int i2) {
94 | this.atType = i2;
95 | }
96 |
97 | public void setAtUid(long j2) {
98 | this.atUid = j2;
99 | }
100 |
101 | public void setContent(String str) {
102 | this.content = str;
103 | }
104 |
105 | public void setLinkInfo(LinkInfo linkInfo) {
106 | this.linkInfo = linkInfo;
107 | }
108 |
109 | public void setNeedNotify(Integer num) {
110 | this.needNotify = num;
111 | }
112 |
113 | public void setSubElementType(Integer num) {
114 | this.subElementType = num;
115 | }
116 |
117 | public String toString() {
118 | return "TextElement{content=" + this.content + ",atType=" + this.atType + ",atUid=" + this.atUid + ",atTinyId=" + this.atTinyId + ",atNtUid=" + this.atNtUid + ",subElementType=" + this.subElementType + ",atChannelId=" + this.atChannelId + ",linkInfo=" + this.linkInfo + ",atRoleId=" + this.atRoleId + ",atRoleColor=" + this.atRoleColor + ",atRoleName=" + this.atRoleName + ",needNotify=" + this.needNotify + ",}";
119 | }
120 |
121 | public TextElement(String str, int i2, long j2, long j3, String str2, Integer num, Long l2, LinkInfo linkInfo, Long l3, Integer num2, String str3, Integer num3) {
122 | this.content = "";
123 | this.content = str;
124 | this.atType = i2;
125 | this.atUid = j2;
126 | this.atTinyId = j3;
127 | this.atNtUid = str2;
128 | this.subElementType = num;
129 | this.atChannelId = l2;
130 | this.linkInfo = linkInfo;
131 | this.atRoleId = l3;
132 | this.atRoleColor = num2;
133 | this.atRoleName = str3;
134 | this.needNotify = num3;
135 | }
136 | }
137 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/VideoCodecFormatType.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 |
4 | public enum VideoCodecFormatType {
5 | KCODECFORMATH264,
6 | KCODECFORMATH265
7 | }
8 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernel/nativeinterface/XmlToJsonParam.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernel.nativeinterface;
2 |
3 | public class XmlToJsonParam {
4 | }
5 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernelpublic/nativeinterface/Contact.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernelpublic.nativeinterface;
2 |
3 |
4 | public final class Contact {
5 | int chatType;
6 | String guildId;
7 | String peerUid;
8 | long serialVersionUID;
9 |
10 | public Contact() {
11 | this.serialVersionUID = 1L;
12 | this.peerUid = "";
13 | this.guildId = "";
14 | }
15 |
16 | public int getChatType() {
17 | return this.chatType;
18 | }
19 |
20 | public String getGuildId() {
21 | return this.guildId;
22 | }
23 |
24 | public String getPeerUid() {
25 | return this.peerUid;
26 | }
27 |
28 | public void setChatType(int i2) {
29 | this.chatType = i2;
30 | }
31 |
32 | public void setGuildId(String str) {
33 | this.guildId = str;
34 | }
35 |
36 | public void setPeerUid(String str) {
37 | this.peerUid = str;
38 | }
39 |
40 | public String toString() {
41 | return "Contact{chatType=" + this.chatType + ",peerUid=" + this.peerUid + ",guildId=" + this.guildId + ",}";
42 | }
43 |
44 | public Contact(int i2, String str, String str2) {
45 | this.serialVersionUID = 1L;
46 | this.chatType = i2;
47 | this.peerUid = str;
48 | this.guildId = str2;
49 | }
50 | }
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernelpublic/nativeinterface/JsonGrayElement.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernelpublic.nativeinterface;
2 |
3 |
4 | public final class JsonGrayElement {
5 | long busiId;
6 | boolean isServer;
7 | String jsonStr;
8 | String recentAbstract;
9 | XmlToJsonParam xmlToJsonParam;
10 |
11 | public JsonGrayElement() {
12 | this.jsonStr = "";
13 | this.recentAbstract = "";
14 | }
15 |
16 | public long getBusiId() {
17 | return this.busiId;
18 | }
19 |
20 | public boolean getIsServer() {
21 | return this.isServer;
22 | }
23 |
24 | public String getJsonStr() {
25 | return this.jsonStr;
26 | }
27 |
28 | public String getRecentAbstract() {
29 | return this.recentAbstract;
30 | }
31 |
32 | public XmlToJsonParam getXmlToJsonParam() {
33 | return this.xmlToJsonParam;
34 | }
35 |
36 | public String toString() {
37 | return "JsonGrayElement{busiId=" + this.busiId + ",jsonStr=" + this.jsonStr + ",recentAbstract=" + this.recentAbstract + ",isServer=" + this.isServer + ",xmlToJsonParam=" + this.xmlToJsonParam + ",}";
38 | }
39 |
40 | public JsonGrayElement(long j2, String str, String str2, boolean z, XmlToJsonParam xmlToJsonParam) {
41 | this.jsonStr = "";
42 | this.recentAbstract = "";
43 | this.busiId = j2;
44 | this.jsonStr = str;
45 | this.recentAbstract = str2;
46 | this.isServer = z;
47 | this.xmlToJsonParam = xmlToJsonParam;
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/kernelpublic/nativeinterface/XmlToJsonParam.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.kernelpublic.nativeinterface;
2 |
3 | public class XmlToJsonParam {
4 | }
5 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/troopmemberlist/ITroopMemberListRepoApi.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.troopmemberlist;
2 |
3 | import androidx.lifecycle.LifecycleOwner;
4 | import com.tencent.mobileqq.data.troop.TroopMemberInfo;
5 | import com.tencent.mobileqq.data.troop.TroopMemberNickInfo;
6 | import com.tencent.mobileqq.qroute.QRouteApi;
7 | import org.jetbrains.annotations.NotNull;
8 | import org.jetbrains.annotations.Nullable;
9 | import java.util.List;
10 | import java.util.Map;
11 | import kotlin.Unit;
12 | import kotlin.jvm.functions.Function1;
13 | import kotlin.jvm.functions.Function2;
14 |
15 | public interface ITroopMemberListRepoApi extends QRouteApi {
16 | //void fetchGagTroopMemberInfo(@Nullable String str, @Nullable LifecycleOwner lifecycleOwner, boolean z, @NotNull String str2, @Nullable f fVar);
17 |
18 | //void fetchTroopMemberInfo(@Nullable String str, @Nullable String str2, boolean z, @Nullable LifecycleOwner lifecycleOwner, @NotNull String str3, @Nullable g gVar);
19 |
20 | //void fetchTroopMemberInfoWithExtInfo(@Nullable String str, @Nullable String str2, boolean z, @Nullable LifecycleOwner lifecycleOwner, @NotNull String str3, @Nullable g gVar);
21 |
22 | //void fetchTroopMemberList(@Nullable String str, @Nullable LifecycleOwner lifecycleOwner, boolean z, @NotNull String str2, @Nullable f fVar);
23 |
24 | //void fetchTroopMemberListWithExtInfo(@Nullable String str, @Nullable LifecycleOwner lifecycleOwner, boolean z, @NotNull String str2, @Nullable f fVar);
25 |
26 | void fetchTroopMemberName(@Nullable String str, @Nullable String str2, @Nullable LifecycleOwner lifecycleOwner, @NotNull String str3, @Nullable Function1 super TroopMemberNickInfo, Unit> cb);
27 |
28 | void fetchTroopMemberName(@Nullable String str, @Nullable String str2, @NotNull String str3, @Nullable Function1 super TroopMemberNickInfo, Unit> cb);
29 |
30 |
31 | void fetchTroopMemberUid(@Nullable String str, @NotNull Function2 super Boolean, ? super String, Unit> function2);
32 |
33 | void fetchTroopMemberUid(@NotNull List list, @NotNull Function2 super Boolean, ? super Map, Unit> function2);
34 |
35 | void fetchTroopMemberUin(@Nullable String str, @NotNull Function2 super Boolean, ? super String, Unit> function2);
36 |
37 | void fetchTroopMemberUin(@NotNull List list, @NotNull Function2 super Boolean, ? super Map, Unit> function2);
38 |
39 | //void fetchTroopMemberUinListInfo(@Nullable String str, @Nullable List list, boolean z, @Nullable LifecycleOwner lifecycleOwner, @NotNull String str2, @Nullable f fVar);
40 |
41 | //void fetchTroopMemberUinListInfoWithExtInfo(@Nullable String str, @Nullable List list, boolean z, @Nullable LifecycleOwner lifecycleOwner, @NotNull String str2, @Nullable f fVar);
42 |
43 | @Nullable
44 | TroopMemberInfo getTroopMemberFromCacheOrFetchAsync(@Nullable String groupId, @Nullable String userId, @Nullable LifecycleOwner lifecycleOwner, @NotNull String str3, @Nullable g gVar);
45 |
46 | int getTroopMemberInfoDBVersion();
47 |
48 | //@Deprecated(message = "兼容旧逻辑,过渡用,新逻辑不要使用")
49 | //@Nullable
50 | //TroopMemberInfo getTroopMemberInfoSync(@Nullable String groupId, @Nullable String userId, @Nullable LifecycleOwner lifecycleOwner, @NotNull String from);
51 |
52 | //@Deprecated(message = "兼容旧逻辑,过渡用,新逻辑不要使用")
53 | //@Nullable
54 | //TroopMemberInfo getTroopMemberInfoSync(@Nullable String str, @Nullable String str2, @Nullable LifecycleOwner lifecycleOwner, @NotNull String str3, long j);
55 |
56 | @Nullable
57 | TroopMemberInfo getTroopMemberWithExtFromCacheOrFetchAsync(@Nullable String groupId, @Nullable String userId, @Nullable LifecycleOwner lifecycleOwner, @NotNull String str3, @Nullable g gVar);
58 |
59 | //@Deprecated(message = "兼容旧逻辑,过渡用,新逻辑不要使用")
60 | //@Nullable
61 | //TroopMemberInfo getTroopMemberWithExtInfoSync(@Nullable String str, @Nullable String str2, @Nullable LifecycleOwner lifecycleOwner, @NotNull String str3);
62 |
63 | boolean isTroopMemberInfoDBInited(@NotNull String str);
64 |
65 | //void preLoadTroopMemberUinListInfo(@Nullable String str, @Nullable List list, boolean z, @Nullable LifecycleOwner lifecycleOwner, @NotNull String str2, @Nullable f fVar);
66 | }
67 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/com/tencent/qqnt/troopmemberlist/g.java:
--------------------------------------------------------------------------------
1 | package com.tencent.qqnt.troopmemberlist;
2 |
3 | import com.tencent.mobileqq.data.troop.TroopMemberInfo;
4 | import org.jetbrains.annotations.Nullable;
5 |
6 | public interface g {
7 | void a(@Nullable TroopMemberInfo troopMemberInfo);
8 | }
9 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/mqq/app/AppRuntime.java:
--------------------------------------------------------------------------------
1 | package mqq.app;
2 |
3 | import android.os.Bundle;
4 |
5 | import androidx.annotation.NonNull;
6 |
7 | import com.tencent.qphone.base.remote.SimpleAccount;
8 |
9 | import mqq.app.api.IRuntimeService;
10 |
11 | public abstract class AppRuntime {
12 | public static final int ACCOUNT_MANAGER = 0;
13 | public static final int WTLOGIN_MANAGER = 1;
14 | public static final int TICKET_MANAGER = 2;
15 | public static final int SERVER_CONFIG_MANAGER = 3;
16 | public static final int END_UN_LOGIN_MANAGER = 4;
17 |
18 | public enum Status {
19 | online(11),
20 | offline(21),
21 | away(31),
22 | invisiable(41),
23 | busy(50),
24 | qme(60),
25 | dnd(70),
26 | receiveofflinemsg(95);
27 |
28 | private final int value;
29 |
30 | Status(int i2) {
31 | this.value = i2;
32 | }
33 |
34 | public static Status build(int i2) {
35 | if (i2 != 11) {
36 | if (i2 != 21) {
37 | if (i2 != 31) {
38 | if (i2 != 41) {
39 | if (i2 != 50) {
40 | if (i2 != 60) {
41 | if (i2 != 70) {
42 | if (i2 != 95) {
43 | return null;
44 | }
45 | return receiveofflinemsg;
46 | }
47 | return dnd;
48 | }
49 | return qme;
50 | }
51 | return busy;
52 | }
53 | return invisiable;
54 | }
55 | return away;
56 | }
57 | return offline;
58 | }
59 | return online;
60 | }
61 |
62 | public int getValue() {
63 | return this.value;
64 | }
65 | }
66 |
67 | public T getRuntimeService(Class cls, String namespace) {
68 | throw new UnsupportedOperationException();
69 | }
70 |
71 | public T getRuntimeServiceIPCSync(@NonNull Class cls, String str) {
72 | throw new UnsupportedOperationException();
73 | }
74 |
75 | public void switchAccount(SimpleAccount simpleAccount, String process) {
76 |
77 | }
78 | public String getAccount() {
79 | return "";
80 | }
81 |
82 | public abstract String getCurrentAccountUin();
83 | public String getCurrentUin() {
84 | return !"0".equals(getCurrentAccountUin()) ? getCurrentAccountUin() : "";
85 | }
86 |
87 | public String getCurrentUid() {
88 | return "";
89 | }
90 |
91 | public long getLongAccountUin() {
92 | return 0;
93 | }
94 |
95 | public boolean isLogin() {
96 | return false;
97 | }
98 |
99 | public void onCreate(Bundle bundle) {
100 |
101 | }
102 | }
103 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/mqq/app/BaseActivity.java:
--------------------------------------------------------------------------------
1 | package mqq.app;
2 |
3 | public class BaseActivity {
4 | }
5 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/mqq/app/MobileQQ.java:
--------------------------------------------------------------------------------
1 | package mqq.app;
2 |
3 | import com.tencent.qphone.base.remote.SimpleAccount;
4 | import com.tencent.qphone.base.util.BaseApplication;
5 |
6 | import java.util.List;
7 |
8 | public abstract class MobileQQ extends BaseApplication {
9 | public static MobileQQ getMobileQQ() {
10 | throw new UnsupportedOperationException("only view.");
11 | }
12 |
13 | public String getQQProcessName() {
14 | throw new UnsupportedOperationException("only view.");
15 | }
16 |
17 | public AppRuntime peekAppRuntime() {
18 | throw new RuntimeException();
19 | }
20 |
21 | public AppRuntime waitAppRuntime(BaseActivity baseActivity) {
22 | return null;
23 | }
24 |
25 | public AppRuntime waitAppRuntime() {
26 | return waitAppRuntime(null);
27 | }
28 |
29 | public List getAllAccounts() {
30 | return null;
31 | }
32 |
33 | public int getMsfConnectedNetType() {
34 | return 0;
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/qqinterface/src/main/java/mqq/app/api/IRuntimeService.java:
--------------------------------------------------------------------------------
1 | package mqq.app.api;
2 |
3 | import mqq.app.AppRuntime;
4 |
5 | public interface IRuntimeService {
6 | void onCreate(AppRuntime appRuntime);
7 |
8 | void onDestroy();
9 | }
--------------------------------------------------------------------------------
/qqinterface/src/main/java/tencent/im/oidb/oidb_sso.java:
--------------------------------------------------------------------------------
1 | package tencent.im.oidb;
2 |
3 | import com.tencent.mobileqq.pb.ByteStringMicro;
4 | import com.tencent.mobileqq.pb.MessageMicro;
5 | import com.tencent.mobileqq.pb.PBBytesField;
6 | import com.tencent.mobileqq.pb.PBField;
7 | import com.tencent.mobileqq.pb.PBRepeatMessageField;
8 | import com.tencent.mobileqq.pb.PBStringField;
9 | import com.tencent.mobileqq.pb.PBUInt32Field;
10 |
11 | public class oidb_sso {
12 | public static class OIDBSSOPkg extends MessageMicro {
13 | public final PBUInt32Field uint32_command = PBField.initUInt32(0);
14 | public final PBUInt32Field uint32_service_type = PBField.initUInt32(0);
15 | public final PBUInt32Field uint32_result = PBField.initUInt32(0);
16 | public final PBBytesField bytes_bodybuffer = PBField.initBytes(ByteStringMicro.EMPTY);
17 | public final PBStringField str_error_msg = PBField.initString("");
18 | public final PBStringField str_client_version = PBField.initString("");
19 | public final PBRepeatMessageField trpc_trans_info = PBField.initRepeatMessage(MetaData.class);
20 | }
21 |
22 | public static class MetaData extends MessageMicro {
23 | public final PBStringField key = PBField.initString("");
24 | public final PBStringField value = PBField.initString("");
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/settings.gradle.kts:
--------------------------------------------------------------------------------
1 | @file:Suppress("UnstableApiUsage")
2 |
3 | pluginManagement {
4 | repositories {
5 | google {
6 | content {
7 | includeGroupByRegex("com\\.android.*")
8 | includeGroupByRegex("com\\.google.*")
9 | includeGroupByRegex("androidx.*")
10 | }
11 | }
12 | mavenCentral()
13 | gradlePluginPortal()
14 | }
15 | }
16 | dependencyResolutionManagement {
17 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
18 | repositories {
19 | google()
20 | mavenCentral()
21 | maven("https://api.xposed.info")
22 | maven("https://jitpack.io")
23 | maven("https://repo1.maven.org/maven2")
24 | }
25 | }
26 |
27 | rootProject.name = "TCQT"
28 | include(":app")
29 | include(":qqinterface")
30 |
--------------------------------------------------------------------------------