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..b3547a0 100644 --- a/PreventAudioFocus/src/main/AndroidManifest.xml +++ b/PreventAudioFocus/src/main/AndroidManifest.xml @@ -2,18 +2,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..b2281ef --- /dev/null +++ b/PreventAudioFocus/src/main/res/layout/radio.xml @@ -0,0 +1,11 @@ + + 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..d4662df --- /dev/null +++ b/PreventAudioFocus/src/main/res/layout/settings_activity.xml @@ -0,0 +1,13 @@ + + + + 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..ee02adb --- /dev/null +++ b/PreventAudioFocus/src/main/res/values-v21/themes.xml @@ -0,0 +1,5 @@ + + + + +