Skip to content

Commit

Permalink
添加歌词暂停方案选项
Browse files Browse the repository at this point in the history
优化log
  • Loading branch information
xiaowine committed Mar 15, 2024
1 parent 52d2b8f commit ecb3964
Show file tree
Hide file tree
Showing 5 changed files with 81 additions and 55 deletions.
2 changes: 2 additions & 0 deletions app/src/main/java/cn/lyric/getter/config/Config.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,7 @@ class Config {
var isFirstLookRules: Boolean by serialLazy(true)
var updateTime: Long by serialLazy(0L)
var showTitle: Boolean by serialLazy(false)
var stopOption1: Boolean by serialLazy(true)
var stopOption2: Boolean by serialLazy(true)
}

114 changes: 59 additions & 55 deletions app/src/main/java/cn/lyric/getter/hook/app/SystemUi.kt
Original file line number Diff line number Diff line change
Expand Up @@ -43,78 +43,82 @@ object SystemUi : BaseHook() {

override fun init() {
super.init()
if (Build.VERSION.SDK_INT <= 33) {
if (config.stopOption1) {
if (Build.VERSION.SDK_INT <= 33) {
// Android13及其以下适用这个方法
loadClassOrNull("com.android.systemui.statusbar.NotificationMediaManager").isNotNull {
it.methodFinder().filterByName("clearCurrentMediaNotification").first().createHook {
after {
if (!isPlayer || useOwnMusicController) return@after
isPlayer = false
eventTools.cleanLyric()
"clearCurrentMediaNotification".log()
loadClassOrNull("com.android.systemui.statusbar.NotificationMediaManager").isNotNull {
it.methodFinder().filterByName("clearCurrentMediaNotification").first().createHook {
after {
if (!isPlayer || useOwnMusicController) return@after
isPlayer = false
eventTools.cleanLyric()
"clearCurrentMediaNotification".log()
}
}
}
}
} else {
} else {
// Android14 clearCurrentMediaNotification消失了,使用removePlayer代替
loadClassOrNull("com.android.systemui.media.controls.ui.MediaCarouselController").isNotNull {
it.methodFinder().filterByName("removePlayer\$default").first().createHook {
after {
if (!isPlayer || useOwnMusicController) return@after
isPlayer = false
eventTools.cleanLyric()
"removePlayer\$default".log()
loadClassOrNull("com.android.systemui.media.controls.ui.MediaCarouselController").isNotNull {
it.methodFinder().filterByName("removePlayer\$default").first().createHook {
after {
if (!isPlayer || useOwnMusicController) return@after
isPlayer = false
eventTools.cleanLyric()
"removePlayer\$default".log()
}
}
}
}
}
for (i in 0..10) {
val clazz = loadClassOrNull("com.android.systemui.statusbar.NotificationMediaManager$$i")
if (clazz.isNotNull()) {
if (clazz!!.hasMethod("onPlaybackStateChanged")) {
clazz.methodFinder().filterByName("onPlaybackStateChanged").first().createHook {
after { hookParam ->
if (!isPlayer || useOwnMusicController) return@after
val playbackState = hookParam.args[0] as PlaybackState
if (playbackState.state == 2) {
isPlayer = false
eventTools.cleanLyric()
"onPlaybackStateChanged".log()
for (i in 0..10) {
val clazz = loadClassOrNull("com.android.systemui.statusbar.NotificationMediaManager$$i")
if (clazz.isNotNull()) {
if (clazz!!.hasMethod("onPlaybackStateChanged")) {
clazz.methodFinder().filterByName("onPlaybackStateChanged").first().createHook {
after { hookParam ->
if (!isPlayer || useOwnMusicController) return@after
val playbackState = hookParam.args[0] as PlaybackState
if (playbackState.state == 2) {
isPlayer = false
eventTools.cleanLyric()
"onPlaybackStateChanged".log()
}
}
}
break
}
break
}
}
}
loadClass("android.media.session.MediaController").methodFinder().filterByParamCount(1).filterByName("unregisterCallback").first().createHook {
after {
if (!isPlayer || useOwnMusicController) return@after
if (it.args[0]::class.java.name.contains("statusbar")) {
isPlayer = false
eventTools.cleanLyric()
"unregisterCallback".log()
}
if (config.stopOption2) {
loadClass("android.media.session.MediaController").methodFinder().filterByParamCount(1).filterByName("unregisterCallback").first().createHook {
after {
if (!isPlayer || useOwnMusicController) return@after
if (it.args[0]::class.java.name.contains("statusbar")) {
isPlayer = false
eventTools.cleanLyric()
"unregisterCallback".log()
}

}
}
}
loadClass("android.media.session.MediaController").methodFinder().filterByParamCount(1).filterByName("registerCallback").first().createHook {
after {
if (!isPlayer || useOwnMusicController) return@after
if (it.args[0]::class.java.name.contains("statusbar")) {
(it.thisObject as MediaController).registerCallback(object : MediaController.Callback() {
override fun onPlaybackStateChanged(state: PlaybackState?) {
super.onPlaybackStateChanged(state)
if (state != null) {
if (state.state == PlaybackState.STATE_PAUSED) {
isPlayer = false
eventTools.cleanLyric()
"registerCallback".log()
}
loadClass("android.media.session.MediaController").methodFinder().filterByParamCount(1).filterByName("registerCallback").first().createHook {
after {
if (!isPlayer || useOwnMusicController) return@after
if (it.args[0]::class.java.name.contains("statusbar")) {
(it.thisObject as MediaController).registerCallback(object : MediaController.Callback() {
override fun onPlaybackStateChanged(state: PlaybackState?) {
super.onPlaybackStateChanged(state)
if (state != null) {
if (state.state == PlaybackState.STATE_PAUSED) {
isPlayer = false
eventTools.cleanLyric()
"registerCallback".log()
}

}
}
}
})
})
}
}
}
}
Expand Down
16 changes: 16 additions & 0 deletions app/src/main/java/cn/lyric/getter/ui/fragment/SettingsFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,22 @@ class SettingsFragment : Fragment() {
false
}
}
switch("stop_option1") {
titleRes = R.string.stop_option1
defaultValue = config.stopOption1
onClick {
config.stopOption1 = checked
false
}
}
switch("stop_option2") {
titleRes = R.string.stop_option2
defaultValue = config.stopOption2
onClick {
config.stopOption2 = checked
false
}
}
}
binding.recyclerView.apply {
layoutManager = LinearLayoutManager(activity, RecyclerView.VERTICAL, false)
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-zh/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -72,4 +72,6 @@
<string name="salt_use_flyme_summary">在API模式正常时,不建议切换</string>
<string name="multiple_modes_work">有多个可正常使用的模式</string>
<string name="show_title">强制显示标题</string>
<string name="stop_option1">歌词暂停方案一</string>
<string name="stop_option2">歌词暂停方案二</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -72,4 +72,6 @@
<string name="salt_use_flyme_summary">It is not recommended to switch when the API mode is normal</string>
<string name="multiple_modes_work">There are multiple modes that can be used normally</string>
<string name="show_title">Force Show Title</string>
<string name="stop_option1">Lyrics pause option one</string>
<string name="stop_option2">Lyrics pause plan two</string>
</resources>

0 comments on commit ecb3964

Please sign in to comment.