Skip to content

Commit

Permalink
landscape video download
Browse files Browse the repository at this point in the history
  • Loading branch information
GangJust committed Feb 21, 2024
1 parent 70e16f1 commit c5f3209
Show file tree
Hide file tree
Showing 37 changed files with 867 additions and 264 deletions.
4 changes: 2 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ android {
applicationId "io.github.fplus"
minSdk 24
targetSdk 33
versionCode 117
versionName "1.2.6"
versionCode 121
versionName "1.2.7"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
v1.2.7
增加聊天消息防止撤回
增加视频下载自定义编码格式
增加定时、空闲退出支持保留应用后台
增加全屏播放“复制链接”唤起下载弹窗
恢复“分享->复制链接”,需手动开启功能
调整部分逻辑(可能需要重新设置模块)
修复部分小问题

v1.2.6
增加下载弹窗文案复制选项
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/assets/version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.2.6-117
1.2.7-121
8 changes: 4 additions & 4 deletions app/src/main/java/io/github/fplus/activity/HomeActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ class HomeActivity : ComponentActivity() {
onLongClick = {
lifecycleScope.launch {
updateLog = withContext(Dispatchers.IO) {
val inputStream = assets.open("update.log")
val inputStream = assets.open("update.txt")
val bytes = inputStream.readBytes()
val text = bytes.decodeToString()
inputStream.close()
Expand Down Expand Up @@ -293,9 +293,9 @@ class HomeActivity : ComponentActivity() {
horizontalAlignment = Alignment.CenterHorizontally
) {
val packageInfo =
KAppUtils.getPackageInfo(application, Constant.scopes[0].packageName)
KAppUtils.getPackageInfo(application, Constant.scopes.elementAt(0).packageName)
val lspatchActive =
HookStatus.isLSPatchActive(application, Constant.scopes[0].packageName)
HookStatus.isLSPatchActive(application, Constant.scopes.elementAt(0).packageName)
if (lspatchActive.isNotEmpty()) {
moduleState.value = "Lspatch加载成功!"
Text(
Expand Down Expand Up @@ -668,7 +668,7 @@ class HomeActivity : ComponentActivity() {

val intent = Intent()
intent.setClassName(
Constant.scopes[0].packageName,
Constant.scopes.elementAt(0).packageName,
"com.ss.android.ugc.aweme.main.MainActivity"
)
intent.putExtra("startModuleSetting", true)
Expand Down
4 changes: 4 additions & 0 deletions aweme/src/main/java/com/bytedance/im/core/model/Message.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.bytedance.im.core.model;

public class Message {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.ss.android.ugc.aweme.longervideo.landscape.home.activity;

import android.app.Activity;
import android.os.Bundle;

import androidx.annotation.Nullable;

public class LandscapeFeedActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
throw new RuntimeException("stub!!");
}
}
2 changes: 1 addition & 1 deletion core/src/main/java/io/github/fplus/Constant.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import io.github.xpler.core.wrapper.at
object Constant {
val modulePackage = "io.github.fplus"

val scopes = arrayOf(
val scopes = setOf(
"com.ss.android.ugc.aweme" at ("com.ss.android.ugc.aweme.app.host.AwemeHostApplication" to "com.ss.android.ugc.aweme"),
"com.ss.android.ugc.aweme.lite" at ("com.ss.android.ugc.aweme.app.host.AwemeHostApplication" to "com.ss.android.ugc.aweme.lite"),
"com.ss.android.ugc.live" at ("com.ss.android.ugc.aweme.app.host.AwemeHostApplication" to "com.ss.android.ugc.live"),
Expand Down
3 changes: 2 additions & 1 deletion core/src/main/java/io/github/fplus/HookInit.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,12 @@ class HookInit : HookEntrance<HookInit>(), ApplicationHookStart {
override val modulePackage: String
get() = Constant.modulePackage

override val scopes: Array<ApplicationHookStart.Scope>
override val scopes: Set<ApplicationHookStart.Scope>
get() = Constant.scopes

override fun onCreateBefore(lp: XC_LoadPackage.LoadPackageParam, hostApp: Application) {
//
// injectClassLoader(lp,hostApp.classLoader)
}

override fun onCreateAfter(lp: XC_LoadPackage.LoadPackageParam, hostApp: Application) {
Expand Down
92 changes: 67 additions & 25 deletions core/src/main/java/io/github/fplus/core/config/ConfigV1.kt
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,9 @@ class ConfigV1 private constructor() {
/// 首页控件透明度 [顶部导航, 视频控件, 视频控件右侧, 底部导航]
var translucentValue: List<Int> = listOf(50, 50, 50, 50)
get() {
field = mmkv.getString("translucentValue", "50, 50, 50, 50")!!.split(",").map { it.trim().toInt() }
field = mmkv.getString("translucentValue", "50, 50, 50, 50")!!
.split(",")
.map { it.trim().toInt() }

return if (field.size == 3) {
listOf(field[0], field[1], field[1], field[2])
Expand Down Expand Up @@ -184,6 +186,28 @@ class ConfigV1 private constructor() {
field = value
}

/// 隐藏顶部tab
var isHideTopTab: Boolean = false
get() {
field = mmkv.getBoolean("isHideTopTab", false)
return field
}
set(value) {
mmkv.putBoolean("isHideTopTab", value)
field = value
}

/// 隐藏顶部tab包含的关键字, 逗号隔开
var hideTopTabKeywords: String = "经验, 探索, 商城"
get() {
field = mmkv.getString("hideTopTabKeywords", "经验, 探索, 商城")!!
return field
}
set(value) {
mmkv.putString("hideTopTabKeywords", value)
field = value
}

/// 隐藏底部加号按钮
var isHidePhotoButton: Boolean = false
get() {
Expand Down Expand Up @@ -344,6 +368,30 @@ class ConfigV1 private constructor() {
field = value
}

/// 消息防撤回
var isPreventRecalled: Boolean = false
get() {
field = mmkv.getBoolean("isPreventRecalled", false)
return field
}
set(value) {
mmkv.putBoolean("isPreventRecalled", value)
field = value
}

/// 撤回其他设置
var preventRecalledOtherSetting: List<Boolean> = listOf(false)
get() {
field = mmkv.getString("preventRecalledOtherSetting", "false")!!
.split(",")
.map { it.trim().toBoolean() }
return field
}
set(value) {
mmkv.putString("preventRecalledOtherSetting", value.joinToString())
field = value
}

/// 全屏沉浸式
var isImmersive: Boolean = false
get() {
Expand All @@ -357,7 +405,10 @@ class ConfigV1 private constructor() {
// 系统隐藏项(状态栏、导航栏)
var systemControllerValue: List<Boolean> = listOf(false, false)
get() {
return mmkv.getString("systemControllerValue", "false, false")!!.split(",").map { it.trim().toBoolean() }
field = mmkv.getString("systemControllerValue", "false, false")!!
.split(",")
.map { it.trim().toBoolean() }
return field
}
set(value) {
mmkv.putString("systemControllerValue", value.joinToString())
Expand All @@ -384,28 +435,6 @@ class ConfigV1 private constructor() {
field = value
}

/// 隐藏顶部tab
var isHideTab: Boolean = false
get() {
field = mmkv.getBoolean("isHideTab", false)
return field
}
set(value) {
mmkv.putBoolean("isHideTab", value)
field = value
}

/// 隐藏顶部tab包含的关键字, 逗号隔开
var hideTabKeywords: String = "经验, 探索, 商城"
get() {
field = mmkv.getString("hideTabKeywords", "经验, 探索, 商城")!!
return field
}
set(value) {
mmkv.putString("hideTabKeywords", value)
field = value
}

/// 是否开启WebDav
var isWebDav: Boolean = false
get() {
Expand Down Expand Up @@ -475,14 +504,27 @@ class ConfigV1 private constructor() {
/// 定时退出 [运行时间, 空闲时间]
var timedShutdownValue: List<Int> = listOf(10, 3)
get() {
field = mmkv.getString("timedShutdownValue", "10, 3")!!.split(",").map { it.trim().toInt() }
field = mmkv.getString("timedShutdownValue", "10, 3")!!
.split(",")
.map { it.trim().toInt() }
return field
}
set(value) {
mmkv.putString("timedShutdownValue", value.joinToString())
field = value
}

/// 保留应用后台
var keepAppBackend: Boolean = false
get() {
field = mmkv.getBoolean("keepAppBackend", false)
return field
}
set(value) {
mmkv.putBoolean("keepAppBackend", value)
field = value
}

/// 去插件化
var isDisablePlugin: Boolean = false
get() {
Expand Down
87 changes: 80 additions & 7 deletions core/src/main/java/io/github/fplus/core/helper/DexkitBuilder.kt
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ object DexkitBuilder {
var emojiApiProxyClazz: Class<*>? = null
var emojiPopupWindowClazz: Class<*>? = null
var bottomCtrlBarClazz: Class<*>? = null
var chatListRecyclerViewAdapterClazz: Class<*>? = null
var chatListRecalledHintClazz: Class<*>? = null
var restartUtilsClazz: Class<*>? = null

// methods
Expand Down Expand Up @@ -83,9 +85,9 @@ object DexkitBuilder {
this.app = app
this.cacheVersion = version

KLogCat.tagD(TAG, "当前进程: ${lpparam.processName}")
KLogCat.tagI(TAG, "当前进程: ${lpparam.processName}")
if (readCache()) {
KLogCat.tagD(TAG, "缓存读取成功!")
KLogCat.tagI(TAG, "缓存读取成功!")
return
}
startSearch()
Expand All @@ -96,7 +98,7 @@ object DexkitBuilder {
* Dexkit开始搜索
*/
private fun startSearch() {
KLogCat.tagD(TAG, "Dexkit开始搜索: ${lpparam.appInfo.sourceDir}")
KLogCat.tagI(TAG, "Dexkit开始搜索: ${lpparam.appInfo.sourceDir}")
System.loadLibrary("dexkit")
DexKitBridge.create(lpparam.appInfo.sourceDir).use { bridge ->
searchClass(bridge)
Expand Down Expand Up @@ -399,6 +401,75 @@ object DexkitBuilder {
}
}.singleInstance("bottomCtrlBar")

chatListRecyclerViewAdapterClazz = bridge.findClass {
// searchPackages("X")
matcher {
fields {
add {
type = "com.ss.android.ugc.aweme.im.sdk.chat.SessionInfo"
}
add {
type = "androidx.recyclerview.widget.RecyclerView"
}
add {
type = "androidx.recyclerview.widget.RecyclerView\$ItemAnimator"
}
add {
type = "java.util.Set"
}
add {
type = "java.util.Set"
}
}

methods {
add {
name = "onBindViewHolder"
paramTypes = listOf(
"androidx.recyclerview.widget.RecyclerView\$ViewHolder",
"int",
"java.util.List",
)
}
}
}
}.singleInstance("chatListRecyclerViewAdapter")

chatListRecalledHintClazz = bridge.findClass {
matcher {
fields {
add {
type = "android.widget.TextView"
}

add {
type = "com.ss.android.ugc.aweme.views.InterceptTouchLinearLayout"
}

add {
type {
superClass = "androidx.lifecycle.ViewModel"
}
}
}

methods {
add {
name = "getFastEventBusSubscriberClass"
returnType = "java.lang.Class"
}

add {
paramTypes = listOf(
null,
"int",
"java.util.List"
)
}
}
}
}.singleInstance("chatListRecalledHint")

restartUtilsClazz = bridge.findClass {
searchPackages("X")
matcher {
Expand Down Expand Up @@ -492,7 +563,7 @@ object DexkitBuilder {
readClassCache(cache)
readMethodsCache(cache)

KLogCat.tagD(TAG, cache.toString(2))
KLogCat.tagI(TAG, cache.toString(2))

return true
}
Expand Down Expand Up @@ -520,6 +591,8 @@ object DexkitBuilder {
detailPageFragmentClazz = classCache.getStringOrDefault("detailPageFragment").loadOrFindClass()
emojiApiProxyClazz = classCache.getStringOrDefault("emojiApiProxy").loadOrFindClass()
bottomCtrlBarClazz = classCache.getStringOrDefault("bottomCtrlBar").loadOrFindClass()
chatListRecyclerViewAdapterClazz = classCache.getStringOrDefault("chatListRecyclerViewAdapter").loadOrFindClass()
chatListRecalledHintClazz = classCache.getStringOrDefault("chatListRecalledHint").loadOrFindClass()
restartUtilsClazz = classCache.getStringOrDefault("restartUtils").loadOrFindClass()
}

Expand Down Expand Up @@ -550,14 +623,14 @@ object DexkitBuilder {
// 拓展方法
private fun Map<String, ClassDataList>.singleInstance(key: String): Class<*>? {
val classData = this[key]?.singleOrNull()
KLogCat.tagD(TAG, "found-class[$key]: ${classData?.name}")
KLogCat.tagI(TAG, "found-class[$key]: ${classData?.name}")
classCacheJson.put(key, "${classData?.name}")
return classData?.getInstance(lpparam.classLoader)
}

private fun ClassDataList.singleInstance(label: String): Class<*>? {
val classData = this.singleOrNull()
KLogCat.tagD(TAG, "found-class[$label]: ${classData?.name}")
KLogCat.tagI(TAG, "found-class[$label]: ${classData?.name}")
classCacheJson.put(label, "${classData?.name}")
return classData?.getInstance(lpparam.classLoader)
}
Expand All @@ -568,7 +641,7 @@ object DexkitBuilder {
return this.filter {
it.isMethod
}.map {
KLogCat.tagD(TAG, "found-method[$label]: $it")
KLogCat.tagI(TAG, "found-method[$label]: $it")
array.put(it.toJson())
it.getMethodInstance(lpparam.classLoader)
}
Expand Down
Loading

0 comments on commit c5f3209

Please sign in to comment.