├── .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 | 6 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/deploymentTargetSelector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 19 | 20 | -------------------------------------------------------------------------------- /.idea/migrations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 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 cb); 27 | 28 | void fetchTroopMemberName(@Nullable String str, @Nullable String str2, @NotNull String str3, @Nullable Function1 cb); 29 | 30 | 31 | void fetchTroopMemberUid(@Nullable String str, @NotNull Function2 function2); 32 | 33 | void fetchTroopMemberUid(@NotNull List list, @NotNull Function2, Unit> function2); 34 | 35 | void fetchTroopMemberUin(@Nullable String str, @NotNull Function2 function2); 36 | 37 | void fetchTroopMemberUin(@NotNull List list, @NotNull Function2, 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 | --------------------------------------------------------------------------------