From 83c51519e20f11bf16c9fcc0ff02334f36f08aac Mon Sep 17 00:00:00 2001 From: programminghoch10 <16062290+programminghoch10@users.noreply.github.com> Date: Tue, 26 Aug 2025 16:49:49 +0200 Subject: [PATCH 1/2] implement settings activity for PreventAudioFocus --- PreventAudioFocus/build.gradle.kts | 8 +++- .../src/main/AndroidManifest.xml | 24 +++++++--- .../PreventAudioFocus/Common.kt | 9 ++++ .../PreventAudioFocus/Hook.java | 18 ------- .../PreventAudioFocus/Hook.kt | 30 ++++++++++++ .../PreventAudioFocus/RadioPreference.kt | 23 +++++++++ .../PreventAudioFocus/SettingsActivity.kt | 47 +++++++++++++++++++ .../src/main/res/layout/radio.xml | 9 ++++ .../src/main/res/layout/settings_activity.xml | 10 ++++ .../src/main/res/values-v21/themes.xml | 4 ++ .../src/main/res/values/strings.xml | 5 ++ .../src/main/res/values/themes.xml | 9 ++++ 12 files changed, 171 insertions(+), 25 deletions(-) create mode 100644 PreventAudioFocus/src/main/java/com/programminghoch10/PreventAudioFocus/Common.kt delete mode 100644 PreventAudioFocus/src/main/java/com/programminghoch10/PreventAudioFocus/Hook.java create mode 100644 PreventAudioFocus/src/main/java/com/programminghoch10/PreventAudioFocus/Hook.kt create mode 100644 PreventAudioFocus/src/main/java/com/programminghoch10/PreventAudioFocus/RadioPreference.kt create mode 100644 PreventAudioFocus/src/main/java/com/programminghoch10/PreventAudioFocus/SettingsActivity.kt create mode 100644 PreventAudioFocus/src/main/res/layout/radio.xml create mode 100644 PreventAudioFocus/src/main/res/layout/settings_activity.xml create mode 100644 PreventAudioFocus/src/main/res/values-v21/themes.xml create mode 100644 PreventAudioFocus/src/main/res/values/strings.xml create mode 100644 PreventAudioFocus/src/main/res/values/themes.xml diff --git a/PreventAudioFocus/build.gradle.kts b/PreventAudioFocus/build.gradle.kts index 70ca5a3..d83d726 100644 --- a/PreventAudioFocus/build.gradle.kts +++ b/PreventAudioFocus/build.gradle.kts @@ -1,5 +1,6 @@ plugins { alias(libs.plugins.buildlogic.android.application) + alias(libs.plugins.buildlogic.kotlin.android) } android { @@ -7,6 +8,11 @@ android { defaultConfig { minSdk = 23 - targetSdk = 35 + targetSdk = 36 } } + +dependencies { + implementation(libs.androidx.fragment.ktx) + implementation(libs.androidx.preference.ktx) +} diff --git a/PreventAudioFocus/src/main/AndroidManifest.xml b/PreventAudioFocus/src/main/AndroidManifest.xml index f33ab93..a99766b 100644 --- a/PreventAudioFocus/src/main/AndroidManifest.xml +++ b/PreventAudioFocus/src/main/AndroidManifest.xml @@ -1,19 +1,31 @@ - - - + + + + + + + + + + clazz = AudioManager.class; - if (lpparam.packageName.equals("android")) clazz = XposedHelpers.findClass("com.android.server.audio.MediaFocusControl", lpparam.classLoader); - XposedBridge.hookAllMethods(clazz, "requestAudioFocus", XC_MethodReplacement.returnConstant(AudioManager.AUDIOFOCUS_REQUEST_GRANTED)); - } -} diff --git a/PreventAudioFocus/src/main/java/com/programminghoch10/PreventAudioFocus/Hook.kt b/PreventAudioFocus/src/main/java/com/programminghoch10/PreventAudioFocus/Hook.kt new file mode 100644 index 0000000..4cac542 --- /dev/null +++ b/PreventAudioFocus/src/main/java/com/programminghoch10/PreventAudioFocus/Hook.kt @@ -0,0 +1,30 @@ +package com.programminghoch10.PreventAudioFocus + +import android.media.AudioManager +import de.robv.android.xposed.IXposedHookLoadPackage +import de.robv.android.xposed.XC_MethodReplacement +import de.robv.android.xposed.XSharedPreferences +import de.robv.android.xposed.XposedBridge +import de.robv.android.xposed.XposedHelpers +import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam + +class Hook : IXposedHookLoadPackage { + override fun handleLoadPackage(lpparam: LoadPackageParam) { + var clazz: Class<*>? = AudioManager::class.java + if (lpparam.packageName == "android") clazz = XposedHelpers.findClass( + "com.android.server.audio.MediaFocusControl", lpparam.classLoader + ) + val sharedPreferences = XSharedPreferences(BuildConfig.APPLICATION_ID, SHARED_PREFERENCES_NAME) + val constant = ENTRIES.map { + Triple( + it.key, + it.value, + sharedPreferences.getBoolean(it.key, false), + ) + }.find { it.third }?.second ?: ENTRIES_DEFAULT + XposedBridge.hookAllMethods( + clazz, "requestAudioFocus", XC_MethodReplacement.returnConstant(constant) + ) + } +} + diff --git a/PreventAudioFocus/src/main/java/com/programminghoch10/PreventAudioFocus/RadioPreference.kt b/PreventAudioFocus/src/main/java/com/programminghoch10/PreventAudioFocus/RadioPreference.kt new file mode 100644 index 0000000..282448e --- /dev/null +++ b/PreventAudioFocus/src/main/java/com/programminghoch10/PreventAudioFocus/RadioPreference.kt @@ -0,0 +1,23 @@ +package com.programminghoch10.PreventAudioFocus + +import android.annotation.SuppressLint +import android.content.Context +import androidx.preference.CheckBoxPreference + +@SuppressLint("PrivateResource") +class RadioPreference(context: Context) : CheckBoxPreference(context) { + + init { + widgetLayoutResource = R.layout.radio + } + + override fun setChecked(checked: Boolean) { + if (isChecked) return + super.setChecked(checked) + } + + fun onRadioPreferenceSelected(radioPreference: RadioPreference) { + if (radioPreference == this) return + super.setChecked(false) + } +} diff --git a/PreventAudioFocus/src/main/java/com/programminghoch10/PreventAudioFocus/SettingsActivity.kt b/PreventAudioFocus/src/main/java/com/programminghoch10/PreventAudioFocus/SettingsActivity.kt new file mode 100644 index 0000000..583206d --- /dev/null +++ b/PreventAudioFocus/src/main/java/com/programminghoch10/PreventAudioFocus/SettingsActivity.kt @@ -0,0 +1,47 @@ +package com.programminghoch10.PreventAudioFocus + +import android.annotation.SuppressLint +import android.os.Bundle +import androidx.fragment.app.FragmentActivity +import androidx.preference.PreferenceFragmentCompat + +class SettingsActivity : FragmentActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.settings_activity) + if (savedInstanceState == null) { + supportFragmentManager.beginTransaction().replace(R.id.settings, SettingsFragment()).commit() + } + actionBar?.setDisplayHomeAsUpEnabled(true) + } + + override fun onNavigateUp(): Boolean { + finish() + return true + } + + class SettingsFragment : PreferenceFragmentCompat() { + @SuppressLint("WorldReadableFiles") + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + preferenceManager.sharedPreferencesName = SHARED_PREFERENCES_NAME + preferenceManager.sharedPreferencesMode = MODE_WORLD_READABLE + val context = requireContext() + preferenceScreen = preferenceManager.createPreferenceScreen(context) + + val radioPreferences = mutableListOf() + for (entry in ENTRIES) { + val preference = RadioPreference(context) + preference.key = entry.key + preference.title = entry.key + preference.setDefaultValue(entry.value == ENTRIES_DEFAULT) + radioPreferences.add(preference) + preference.setOnPreferenceChangeListener { preference, newValue -> + radioPreferences.forEach { it.onRadioPreferenceSelected(preference as RadioPreference) } + true + } + preferenceScreen.addPreference(preference) + } + } + } +} diff --git a/PreventAudioFocus/src/main/res/layout/radio.xml b/PreventAudioFocus/src/main/res/layout/radio.xml new file mode 100644 index 0000000..41de0b3 --- /dev/null +++ b/PreventAudioFocus/src/main/res/layout/radio.xml @@ -0,0 +1,9 @@ + + diff --git a/PreventAudioFocus/src/main/res/layout/settings_activity.xml b/PreventAudioFocus/src/main/res/layout/settings_activity.xml new file mode 100644 index 0000000..9941209 --- /dev/null +++ b/PreventAudioFocus/src/main/res/layout/settings_activity.xml @@ -0,0 +1,10 @@ + + + + diff --git a/PreventAudioFocus/src/main/res/values-v21/themes.xml b/PreventAudioFocus/src/main/res/values-v21/themes.xml new file mode 100644 index 0000000..6ee0359 --- /dev/null +++ b/PreventAudioFocus/src/main/res/values-v21/themes.xml @@ -0,0 +1,4 @@ + + + + From 7c2c5b63b36acf9bbb507dad954f5e049668c14a Mon Sep 17 00:00:00 2001 From: binarynoise Date: Wed, 1 Oct 2025 21:30:23 +0200 Subject: [PATCH 2/2] fix formatting --- PreventAudioFocus/src/main/AndroidManifest.xml | 9 +++++---- PreventAudioFocus/src/main/res/layout/radio.xml | 8 +++++--- .../src/main/res/layout/settings_activity.xml | 11 +++++++---- PreventAudioFocus/src/main/res/values-v21/themes.xml | 1 + 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/PreventAudioFocus/src/main/AndroidManifest.xml b/PreventAudioFocus/src/main/AndroidManifest.xml index a99766b..b3547a0 100644 --- a/PreventAudioFocus/src/main/AndroidManifest.xml +++ b/PreventAudioFocus/src/main/AndroidManifest.xml @@ -1,20 +1,21 @@ - - + + - + - + android:focusable="false" + /> diff --git a/PreventAudioFocus/src/main/res/layout/settings_activity.xml b/PreventAudioFocus/src/main/res/layout/settings_activity.xml index 9941209..d4662df 100644 --- a/PreventAudioFocus/src/main/res/layout/settings_activity.xml +++ b/PreventAudioFocus/src/main/res/layout/settings_activity.xml @@ -1,10 +1,13 @@ - - + android:theme="@style/AppTheme.Edge2EdgeFix" + > + + android:layout_height="match_parent" + /> diff --git a/PreventAudioFocus/src/main/res/values-v21/themes.xml b/PreventAudioFocus/src/main/res/values-v21/themes.xml index 6ee0359..ee02adb 100644 --- a/PreventAudioFocus/src/main/res/values-v21/themes.xml +++ b/PreventAudioFocus/src/main/res/values-v21/themes.xml @@ -1,4 +1,5 @@ +