Skip to content

Commit

Permalink
preview live bottom padding
Browse files Browse the repository at this point in the history
  • Loading branch information
GangJust committed Dec 11, 2023
1 parent b432924 commit 11ded22
Show file tree
Hide file tree
Showing 21 changed files with 591 additions and 371 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 111
versionName "1.2.5-dev"
versionCode 112
versionName "1.2.5"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
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.5-dev-111
1.2.5-112
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.ss.android.ugc.aweme.feed.adapter;

public interface IFeedViewHolder {
}
54 changes: 52 additions & 2 deletions core/src/main/java/io/github/fplus/core/helper/DexkitBuilder.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import com.freegang.ktutils.json.getIntOrDefault
import com.freegang.ktutils.json.getJSONArrayOrDefault
import com.freegang.ktutils.json.getStringOrDefault
import com.freegang.ktutils.log.KLogCat
import com.freegang.ktutils.text.KTextUtils
import io.github.fplus.core.config.ConfigV1
import io.github.xpler.core.findClass
import io.github.xpler.core.findMethod
Expand Down Expand Up @@ -41,12 +42,14 @@ object DexkitBuilder {
var poiCreateInstanceImplClazz: Class<*>? = null
var videoPlayerStateClazz: Class<*>? = null
var videoPlayerHelperClazz: Class<*>? = null
var abstractFeedAdapterClazz: Class<*>? = null
var recommendFeedFetchPresenterClazz: Class<*>? = null
var fullFeedFollowFetchPresenterClazz: Class<*>? = null
var detailPageFragmentClazz: Class<*>? = null
var emojiApiProxyClazz: Class<*>? = null
var emojiPopupWindowClazz: Class<*>? = null
var ripsChatRoomFragmentClazz: Class<*>? = null
var restartUtilsClazz: Class<*>? = null

// methods
var videoViewHolderMethods: List<Method> = listOf()
Expand Down Expand Up @@ -199,6 +202,32 @@ object DexkitBuilder {
}
}.singleInstance("conversationFragment")

abstractFeedAdapterClazz = bridge.findClass {
matcher {
fields {
add {
type = "android.view.LayoutInflater"
}
add {
type = "com.ss.android.ugc.aweme.feed.model.BaseFeedPageParams"
}
}

methods {
add {
name = "getItemPosition"
}
add {
name = "finishUpdate"
}
}

usingStrings {
add("AbstractFeedAdapter aweme.aid = ")
}
}
}.singleInstance("abstractFeedAdapter")

recommendFeedFetchPresenterClazz = bridge.findClass {
matcher {
methods {
Expand Down Expand Up @@ -394,6 +423,21 @@ object DexkitBuilder {
}
}.singleInstance("mainBottomTabView")

restartUtilsClazz = bridge.findClass {
searchPackages("X")
matcher {
methods {
add {
paramTypes = listOf("android.content.Context")
usingNumbers = listOf(0x10008000)
}
}
usingStrings {
add("System.exit returned normally, while it was supposed to halt JVM.")
}
}
}.singleInstance("restartUtils")

val findMaps = bridge.batchFindClassUsingStrings {
addSearchGroup {
groupName = "videoPlayerHelper"
Expand Down Expand Up @@ -504,12 +548,14 @@ object DexkitBuilder {
poiCreateInstanceImplClazz = classCache.getStringOrDefault("poiCreateInstanceImpl").loadOrFindClass()
videoPlayerStateClazz = classCache.getStringOrDefault("videoPlayerState").loadOrFindClass()
videoPlayerHelperClazz = classCache.getStringOrDefault("videoPlayerHelper").loadOrFindClass()
abstractFeedAdapterClazz = classCache.getStringOrDefault("abstractFeedAdapter").loadOrFindClass()
recommendFeedFetchPresenterClazz = classCache.getStringOrDefault("recommendFeedFetchPresenter").loadOrFindClass()
fullFeedFollowFetchPresenterClazz = classCache.getStringOrDefault("fullFeedFollowFetchPresenter").loadOrFindClass()
emojiPopupWindowClazz = classCache.getStringOrDefault("emojiPopupWindow").loadOrFindClass()
detailPageFragmentClazz = classCache.getStringOrDefault("detailPageFragment").loadOrFindClass()
emojiApiProxyClazz = classCache.getStringOrDefault("emojiApiProxy").loadOrFindClass()
ripsChatRoomFragmentClazz = classCache.getStringOrDefault("ripsChatRoomFragment").loadOrFindClass()
restartUtilsClazz = classCache.getStringOrDefault("restartUtils").loadOrFindClass()
}

/**
Expand Down Expand Up @@ -587,13 +633,17 @@ object DexkitBuilder {
}

private fun String.loadOrFindClass(): Class<*>? {
if (this.isEmpty()) {
if (KTextUtils.isEmpty(this)) {
return null
}

return try {
app?.classLoader?.loadClass(this)
} catch (e: ClassNotFoundException) {
} catch (e: Throwable) {
if (e is LinkageError && "${e.message}".contains("overrides final")) {
return null // 过滤类似错误
}

lpparam.findClass(this)
}
}
Expand Down
38 changes: 9 additions & 29 deletions core/src/main/java/io/github/fplus/core/helper/ImmersiveHelper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,49 +4,29 @@ import android.app.Activity
import android.graphics.Color
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import com.freegang.ktutils.app.navBarInteractionMode

object ImmersiveHelper {
@get:Synchronized
@set:Synchronized
var isEdgeToEdgeEnabled = false

fun immersive(activity: Activity) {
val window = activity.window
if (activity.navBarInteractionMode == 2) {
ImmersiveHelper.isEdgeToEdgeEnabled = true
WindowCompat.setDecorFitsSystemWindows(window, false)
window.statusBarColor = Color.TRANSPARENT
window.navigationBarColor = Color.TRANSPARENT
} else {
window.statusBarColor = Color.TRANSPARENT
window.navigationBarColor = Color.parseColor("#161616")
}
}

fun statusBar(activity: Activity, isHide: Boolean) {
fun immersive(
activity: Activity,
hideStatusBar: Boolean = false,
hideNavigationBars: Boolean = false,
) {
val window = activity.window
WindowCompat.setDecorFitsSystemWindows(window, false)
window.statusBarColor = Color.TRANSPARENT
WindowCompat.getInsetsController(window, window.decorView).apply {
if (isHide) {
if (hideStatusBar) {
hide(WindowInsetsCompat.Type.statusBars())
} else {
show(WindowInsetsCompat.Type.statusBars())
}
}
}

fun navigationBars(activity: Activity, isHide: Boolean) {
val window = activity.window
WindowCompat.setDecorFitsSystemWindows(window, false)
window.navigationBarColor = Color.TRANSPARENT
WindowCompat.getInsetsController(window, window.decorView).apply {
if (isHide) {
if (hideNavigationBars) {
hide(WindowInsetsCompat.Type.navigationBars())
} else {
show(WindowInsetsCompat.Type.navigationBars())
}
}
window.statusBarColor = Color.TRANSPARENT
window.navigationBarColor = Color.TRANSPARENT
}
}
7 changes: 3 additions & 4 deletions core/src/main/java/io/github/fplus/core/hook/DouYinMain.kt
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ class DouYinMain(private val app: Application) {
// search and hook
DexkitBuilder.running(
app = app,
version = 3,
version = 4,
searchBefore = {
HActivity(lpparam)
HMainActivity(lpparam)
Expand All @@ -82,8 +82,6 @@ class DouYinMain(private val app: Application) {
HFlippableViewPager(lpparam)
HCustomizedUISeekBar(lpparam)
HPlayerController(lpparam)
// HVideoViewHolder(lpparam)
HBaseCommonLiveViewHolder(lpparam)
HVideoViewHolderRootView(lpparam)
HPenetrateTouchRelativeLayout(lpparam)
HInteractStickerParent(lpparam)
Expand All @@ -105,7 +103,8 @@ class DouYinMain(private val app: Application) {
HPoiCreateInstanceImpl(lpparam)
HSeekBarSpeedModeBottomMask(lpparam)
HVideoPlayerHelper(lpparam)
HVideoViewHolderV1(lpparam)
HVideoViewHolder(lpparam)
HAbstractFeedAdapter(lpparam)
HVerticalViewPager(lpparam)
HDetailPageFragment(lpparam)
HEmojiDetailDialogNew(lpparam)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,36 +9,43 @@ import androidx.core.view.updatePadding
import com.freegang.ktutils.display.dip2px
import com.freegang.ktutils.extension.asOrNull
import com.freegang.ktutils.log.KLogCat
import com.freegang.ktutils.reflect.fieldGets
import com.freegang.ktutils.view.onEachChild
import com.ss.android.ugc.aweme.ad.feed.VideoViewHolderRootView
import de.robv.android.xposed.XC_MethodHook
import de.robv.android.xposed.callbacks.XC_LoadPackage
import io.github.fplus.core.base.BaseHook
import io.github.fplus.core.config.ConfigV1
import io.github.fplus.core.helper.DexkitBuilder
import io.github.xpler.core.NoneHook
import io.github.xpler.core.OnAfter
import io.github.xpler.core.Param
import io.github.xpler.core.hookBlockRunning

class HBaseCommonLiveViewHolder(lpparam: XC_LoadPackage.LoadPackageParam) :
class HAbstractFeedAdapter(lpparam: XC_LoadPackage.LoadPackageParam) :
BaseHook<Any>(lpparam) {
companion object {
const val TAG = "HBaseCommonLiveViewHolder"
const val TAG = "HAbstractFeedAdapter"
}

private val config get() = ConfigV1.get()

override fun setTargetClass(): Class<*> {
return findClass("com.ss.android.ugc.aweme.feed.viewholder.BaseCommonLiveViewHolder")
return DexkitBuilder.abstractFeedAdapterClazz ?: NoneHook::class.java
}

@OnAfter("bind")
fun bindAfter(params: XC_MethodHook.MethodHookParam) {
@OnAfter
fun methodAfter(
params: XC_MethodHook.MethodHookParam,
@Param("null") any: Any?,
view: View?,
i: Int,
) {
// 垫高?
hookBlockRunning(params) {
if (config.isImmersive) {
val view = thisObject.fieldGets(type = View::class.java)
.firstOrNull()

// KLogCat.d("view: $view")
if (view is FrameLayout) {
view ?: return
if (view is FrameLayout && view !is VideoViewHolderRootView) {
view.onEachChild { if (background is GradientDrawable) background = null }
val bottomPadding = view.context.dip2px(58f) // BottomTabBarHeight
val viewGroup = view.children.last().asOrNull<ViewGroup>() ?: return
Expand Down
24 changes: 10 additions & 14 deletions core/src/main/java/io/github/fplus/core/hook/HActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,11 @@ class HActivity(lpparam: XC_LoadPackage.LoadPackageParam) :
DouYinMain.freeExitCountDown?.restart()
if (event.action == MotionEvent.ACTION_DOWN) {// 重新沉浸
if (config.isImmersive) {
if (config.systemControllerValue[0]) {
ImmersiveHelper.statusBar(thisActivity, true)
}
if (config.systemControllerValue[1]) {
ImmersiveHelper.navigationBars(thisActivity, true)
}
ImmersiveHelper.immersive(thisActivity)
ImmersiveHelper.immersive(
thisActivity,
hideStatusBar = config.systemControllerValue[0],
hideNavigationBars = config.systemControllerValue[1],
)
}
}
}.onFailure {
Expand All @@ -46,13 +44,11 @@ class HActivity(lpparam: XC_LoadPackage.LoadPackageParam) :
fun onCreateAfter(params: XC_MethodHook.MethodHookParam, savedInstanceState: Bundle?) {
hookBlockRunning(params) {
if (config.isImmersive) {
if (config.systemControllerValue[0]) {
ImmersiveHelper.statusBar(thisActivity, true)
}
if (config.systemControllerValue[1]) {
ImmersiveHelper.navigationBars(thisActivity, true)
}
ImmersiveHelper.immersive(thisActivity)
ImmersiveHelper.immersive(
thisActivity,
hideStatusBar = config.systemControllerValue[0],
hideNavigationBars = config.systemControllerValue[1],
)
}
}.onFailure {
KLogCat.tagE(TAG, it)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ class HDetailActivity(lpparam: XC_LoadPackage.LoadPackageParam) :
DownloadLogic(
this@HDetailActivity,
activity,
aweme ?: HVideoViewHolderV1.aweme,
aweme ?: HVideoViewHolder.aweme,
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import io.github.fplus.core.config.ConfigV1
import io.github.fplus.core.helper.ImmersiveHelper
import io.github.xpler.core.FutureHook
import io.github.xpler.core.OnAfter
import io.github.xpler.core.OnBefore
import io.github.xpler.core.hookBlockRunning
import io.github.xpler.core.thisActivity

Expand All @@ -25,13 +26,16 @@ class HLivePlayActivity(lpparam: XC_LoadPackage.LoadPackageParam) :
}

@FutureHook
@OnBefore("onWindowFocusChanged")
@OnAfter("onWindowFocusChanged")
fun onWindowFocusChangedAfter(params: XC_MethodHook.MethodHookParam, boolean: Boolean) {
hookBlockRunning(params) {
if (config.isImmersive) {
ImmersiveHelper.immersive(thisActivity)
// ImmersiveHelper.statusBar(thisActivity, true)
// ImmersiveHelper.navigationBars(thisActivity, true)
ImmersiveHelper.immersive(
thisActivity,
hideStatusBar = true,
hideNavigationBars = true,
)
}
}.onFailure {
KLogCat.tagE(TAG, it)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ class HMainActivity(lpparam: XC_LoadPackage.LoadPackageParam) :
DownloadLogic(
this@HMainActivity,
activity,
aweme ?: HVideoViewHolderV1.aweme,
aweme ?: HVideoViewHolder.aweme,
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,13 +124,6 @@ class HSideBarNestedScrollView(lpparam: XC_LoadPackage.LoadPackageParam) :
view.context.startActivity(intent, options.toBundle())
}
onlyChild.addView(binding.root)

if (config.isImmersive) {
// 全面屏手势沉浸式底部垫高 (首页侧滑),底部导航栏则不处理
if (ImmersiveHelper.isEdgeToEdgeEnabled) {
onlyChild.updatePadding(bottom = context.navigationBarHeight)
}
}
}
}
}
Loading

0 comments on commit 11ded22

Please sign in to comment.