From 45ed8a3a888ae73874669ac1a43c86f40e6f51b3 Mon Sep 17 00:00:00 2001 From: Kavish Devar Date: Fri, 9 May 2025 08:56:10 +0530 Subject: [PATCH] android: listen for intents to set anc mode --- .../librepods/services/AirPodsService.kt | 52 ++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/android/app/src/main/java/me/kavishdevar/librepods/services/AirPodsService.kt b/android/app/src/main/java/me/kavishdevar/librepods/services/AirPodsService.kt index 9b88369..8c553e8 100644 --- a/android/app/src/main/java/me/kavishdevar/librepods/services/AirPodsService.kt +++ b/android/app/src/main/java/me/kavishdevar/librepods/services/AirPodsService.kt @@ -901,13 +901,58 @@ class AirPodsService : Service() { Log.d("AirPodsService", "Metadata set: $metadataSet") } } - + val ancModeFilter = IntentFilter("me.kavishdevar.librepods.SET_ANC_MODE") + var ancModeReceiver: BroadcastReceiver? = null @SuppressLint("InlinedApi", "MissingPermission", "UnspecifiedRegisterReceiverFlag") override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { Log.d("AirPodsService", "Service started") ServiceManager.setService(this) startForegroundNotification() initGestureDetector() + + ancModeReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + if (intent?.action == "me.kavishdevar.librepods.SET_ANC_MODE") { + if (intent.hasExtra("mode")) { + // If a specific mode is requested, use it + val mode = intent.getIntExtra("mode", -1) + if (mode in 1..4) { + setANCMode(mode) + } + } else { + val currentMode = ancNotification.status + val offListeningMode = sharedPreferences.getBoolean("off_listening_mode", true) + + val nextMode = if (offListeningMode) { + when (currentMode) { + 1 -> 2 + 2 -> 3 + 3 -> 4 + 4 -> 1 + else -> 1 + } + } else { + when (currentMode) { + 1 -> 2 + 2 -> 3 + 3 -> 4 + 4 -> 2 + else -> 2 + } + } + + setANCMode(nextMode) + Log.d("AirPodsService", "Cycling ANC mode from $currentMode to $nextMode (offListeningMode: $offListeningMode)") + } + } + } + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + registerReceiver(ancModeReceiver, ancModeFilter, RECEIVER_EXPORTED) + } else { + registerReceiver(ancModeReceiver, ancModeFilter) + } val audioManager = this@AirPodsService.getSystemService(AUDIO_SERVICE) as AudioManager MediaController.initialize( @@ -1962,6 +2007,11 @@ class AirPodsService : Service() { } catch (e: Exception) { e.printStackTrace() } + try { + unregisterReceiver(ancModeReceiver) + } catch (e: Exception) { + e.printStackTrace() + } try { unregisterReceiver(connectionReceiver) } catch (e: Exception) {