diff --git a/app/src/main/java/me/iacn/biliroaming/BiliBiliPackage.kt b/app/src/main/java/me/iacn/biliroaming/BiliBiliPackage.kt index 0133d03586..0838a4089a 100644 --- a/app/src/main/java/me/iacn/biliroaming/BiliBiliPackage.kt +++ b/app/src/main/java/me/iacn/biliroaming/BiliBiliPackage.kt @@ -183,6 +183,7 @@ class BiliBiliPackage constructor(private val mClassLoader: ClassLoader, mContex val resolveClientCompanionClass by Weak { mHookInfo.resolveClientCompanion.class_ from mClassLoader } val videoDownloadEntryClass by Weak { "com.bilibili.videodownloader.model.VideoDownloadEntry" from mClassLoader } val rewardAdClass by Weak { mHookInfo.rewardAd.class_ from mClassLoader } + val tripleSpeedServiceClass by Weak { "com.bilibili.ship.theseus.united.player.TripleSpeedService\$runOldTripleSpeed\$1\$listener\$1\$onLongPress\$1" from mClassLoader } // for v8.17.0+ val useNewMossFunc = instance.viewMossClass?.declaredMethods?.any { diff --git a/app/src/main/java/me/iacn/biliroaming/SettingDialog.kt b/app/src/main/java/me/iacn/biliroaming/SettingDialog.kt index 21a45fee5a..ddd0858b15 100644 --- a/app/src/main/java/me/iacn/biliroaming/SettingDialog.kt +++ b/app/src/main/java/me/iacn/biliroaming/SettingDialog.kt @@ -111,6 +111,7 @@ class SettingDialog(context: Context) : AlertDialog.Builder(context) { findPreference("filter_comment")?.onPreferenceClickListener = this findPreference("copy_access_key")?.onPreferenceClickListener = this findPreference("purify_story_video_ad")?.onPreferenceClickListener = this + findPreference("long_press_speed")?.onPreferenceClickListener = this checkCompatibleVersion() searchItems = retrieve(preferenceScreen) checkUpdate() @@ -923,6 +924,39 @@ class SettingDialog(context: Context) : AlertDialog.Builder(context) { "(累计拦截 $blockedCount 条)" } + private fun onLongPressSpeedClick(): Boolean { + AlertDialog.Builder(activity).run { + val view = context.inflateLayout(R.layout.seekbar_dialog) + val seekBar = view.findViewById(R.id.seekBar) + seekBar.max = 100 + val tvHint = view.findViewById(R.id.tvHint) + seekBar.setOnSeekBarChangeListener(object : OnSeekBarChangeListener { + @SuppressLint("SetTextI18n") + override fun onProgressChanged( + seekBar: SeekBar?, progress: Int, fromUser: Boolean + ) { + tvHint.text = "${progress * 10}%" + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) {} + override fun onStopTrackingTouch(seekBar: SeekBar?) {} + }) + val current = prefs.getInt("long_press_speed", 300) + @SuppressLint("SetTextI18n") + tvHint.text = "${current * 10}%" + seekBar.progress = current / 10 + setTitle(R.string.long_press_speed) + setNegativeButton(android.R.string.cancel, null) + setPositiveButton(android.R.string.ok) { _, _ -> + prefs.edit().putInt("long_press_speed", seekBar.progress * 10).apply() + } + setView(view) + show() + + } + return true + } + @Deprecated("Deprecated in Java") override fun onPreferenceClick(preference: Preference) = when (preference.key) { "version" -> onVersionClick() @@ -945,6 +979,7 @@ class SettingDialog(context: Context) : AlertDialog.Builder(context) { "filter_comment" -> onFilterCommentClick() "copy_access_key" -> onCopyAccessKeyClick() "purify_story_video_ad" -> onPurifyStoryVideoAdClick() + "long_press_speed" -> onLongPressSpeedClick() else -> false } } diff --git a/app/src/main/java/me/iacn/biliroaming/XposedInit.kt b/app/src/main/java/me/iacn/biliroaming/XposedInit.kt index a863c99d4b..a6ee9eab95 100644 --- a/app/src/main/java/me/iacn/biliroaming/XposedInit.kt +++ b/app/src/main/java/me/iacn/biliroaming/XposedInit.kt @@ -124,6 +124,7 @@ class XposedInit : IXposedHookLoadPackage, IXposedHookZygoteInit { startHook { MultiWindowHook(lpparam.classLoader) } startHook { LiveQualityHook(lpparam.classLoader) } startHook { StoryPlayerAdHook(lpparam.classLoader) } + startHook { LongPressSpeed(lpparam.classLoader) } } lpparam.processName.endsWith(":web") -> { diff --git a/app/src/main/java/me/iacn/biliroaming/hook/LongPressSpeed.kt b/app/src/main/java/me/iacn/biliroaming/hook/LongPressSpeed.kt new file mode 100644 index 0000000000..a4fd6825ab --- /dev/null +++ b/app/src/main/java/me/iacn/biliroaming/hook/LongPressSpeed.kt @@ -0,0 +1,23 @@ +package me.iacn.biliroaming.hook + +import me.iacn.biliroaming.BiliBiliPackage.Companion.instance +import me.iacn.biliroaming.utils.hookAfterAllConstructors +import me.iacn.biliroaming.utils.sPrefs + + +class LongPressSpeed(cl: ClassLoader) : BaseHook(cl) { + private val speed: Float = sPrefs.getInt("long_press_speed", 300) / 100f + + + override fun startHook() { + if (speed == 3f) return + + instance.tripleSpeedServiceClass!!.hookAfterAllConstructors { + val obj = it.thisObject + obj::class.java.getDeclaredField("\$speed").apply { + isAccessible = true + set(obj, speed) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/me/iacn/biliroaming/hook/VipSectionHook.kt b/app/src/main/java/me/iacn/biliroaming/hook/VipSectionHook.kt index 28398270a5..cb9f56f568 100644 --- a/app/src/main/java/me/iacn/biliroaming/hook/VipSectionHook.kt +++ b/app/src/main/java/me/iacn/biliroaming/hook/VipSectionHook.kt @@ -1,22 +1,18 @@ package me.iacn.biliroaming.hook import android.os.Bundle -import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup import me.iacn.biliroaming.BiliBiliPackage.Companion.instance -import me.iacn.biliroaming.utils.findFieldByExactType -import me.iacn.biliroaming.utils.from import me.iacn.biliroaming.utils.hookAfterMethod import me.iacn.biliroaming.utils.sPrefs + class VipSectionHook(classLoader: ClassLoader) : BaseHook(classLoader) { override fun startHook() { if (!sPrefs.getBoolean("hidden", false) || !sPrefs.getBoolean("remove_vip_section", false) ) return - instance.homeUserCenterClass!!.hookAfterMethod( "onViewCreated", View::class.java, diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1c2aefc924..1ca463c611 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -310,4 +310,5 @@ 有了这个,终于能过第二关了😋(需重启两次哔哩哔哩) 净化竖屏模式广告/推广 有了这个,连第一关都看不到了😭 + 长按播放速度设置 diff --git a/app/src/main/res/xml/prefs_setting.xml b/app/src/main/res/xml/prefs_setting.xml index 366d22255d..baf447ea4d 100644 --- a/app/src/main/res/xml/prefs_setting.xml +++ b/app/src/main/res/xml/prefs_setting.xml @@ -285,6 +285,11 @@ android:key="fake_non_multiwindow" android:title="@string/fake_non_multiwindow_title" android:summary="@string/fake_non_multiwindow_summary"/> + +