Skip to content

Commit fb7b2b5

Browse files
committed
feat: add support for Bluetooth Media Button
1 parent 567ec84 commit fb7b2b5

File tree

7 files changed

+334
-32
lines changed

7 files changed

+334
-32
lines changed

app/build.gradle.kts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ android {
4747
applicationId = "com.ilseon"
4848
minSdk = 24
4949
targetSdk = 36
50-
versionCode = 119
51-
versionName = "0.38.2"
50+
versionCode = 120
51+
versionName = "0.39.0"
5252

5353
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
5454
}
@@ -170,6 +170,9 @@ dependencies {
170170
// In-app reviews
171171
implementation(libs.play.review)
172172

173+
// Media for Bluetooth buttons
174+
implementation(libs.androidx.media)
175+
173176
// ** Test Dependencies **
174177
testImplementation(libs.kotlinx.coroutines.test)
175178
testImplementation(libs.mockk)

app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
<uses-permission android:name="android.permission.RECORD_AUDIO" />
1818
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
1919
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE" />
20+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
2021

2122
<uses-feature android:name="android.hardware.bluetooth" android:required="false"/>
2223

@@ -107,6 +108,7 @@
107108
android:exported="false"
108109
android:foregroundServiceType="microphone" />
109110

111+
110112
</application>
111113

112114
</manifest>

app/src/main/java/com/ilseon/SettingsViewModel.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,13 @@ class SettingsViewModel @Inject constructor(
4949
initialValue = false
5050
)
5151

52+
val mediaButtonTriggerEnabled = settingsRepository.mediaButtonTriggerEnabled
53+
.stateIn(
54+
scope = viewModelScope,
55+
started = SharingStarted.WhileSubscribed(5000),
56+
initialValue = false
57+
)
58+
5259
val sstLanguage = settingsRepository.sstLanguage
5360
.stateIn(
5461
scope = viewModelScope,
@@ -74,6 +81,12 @@ class SettingsViewModel @Inject constructor(
7481
}
7582
}
7683

84+
fun setMediaButtonTriggerEnabled(enabled: Boolean) {
85+
viewModelScope.launch {
86+
settingsRepository.setMediaButtonTriggerEnabled(enabled)
87+
}
88+
}
89+
7790
fun setSstLanguage(language: String) {
7891
viewModelScope.launch {
7992
settingsRepository.setSstLanguage(language)

app/src/main/java/com/ilseon/data/task/SettingsRepository.kt

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ interface SettingsRepository {
2020
val bluetoothSstEnabled: Flow<Boolean>
2121
suspend fun setBluetoothSstEnabled(enabled: Boolean)
2222

23+
val mediaButtonTriggerEnabled: Flow<Boolean>
24+
suspend fun setMediaButtonTriggerEnabled(enabled: Boolean)
25+
2326
val sstLanguage: Flow<String>
2427
suspend fun setSstLanguage(language: String)
2528

@@ -39,6 +42,7 @@ class SettingsRepositoryImpl @Inject constructor(
3942
const val KEY_NUDGE_NOTIFICATIONS = "nudge_notifications_enabled"
4043
const val KEY_NAGGING_NOTIFICATIONS = "nagging_notifications_enabled"
4144
const val KEY_BLUETOOTH_SST_ENABLED = "bluetooth_sst_enabled"
45+
const val KEY_MEDIA_BUTTON_TRIGGER = "media_button_trigger_enabled"
4246
const val KEY_SST_LANGUAGE = "sst_language"
4347
const val KEY_API_KEY = "gemini_api_key"
4448
}
@@ -50,7 +54,6 @@ class SettingsRepositoryImpl @Inject constructor(
5054
}
5155
}
5256
prefs.registerOnSharedPreferenceChangeListener(listener)
53-
// Send initial value
5457
trySend(prefs.getBoolean(KEY_NUDGE_NOTIFICATIONS, true))
5558
awaitClose { prefs.unregisterOnSharedPreferenceChangeListener(listener) }
5659
}
@@ -95,6 +98,23 @@ class SettingsRepositoryImpl @Inject constructor(
9598
}
9699
}
97100

101+
override val mediaButtonTriggerEnabled: Flow<Boolean> = callbackFlow {
102+
val listener = SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
103+
if (key == KEY_MEDIA_BUTTON_TRIGGER) {
104+
trySend(prefs.getBoolean(KEY_MEDIA_BUTTON_TRIGGER, false))
105+
}
106+
}
107+
prefs.registerOnSharedPreferenceChangeListener(listener)
108+
trySend(prefs.getBoolean(KEY_MEDIA_BUTTON_TRIGGER, false))
109+
awaitClose { prefs.unregisterOnSharedPreferenceChangeListener(listener) }
110+
}
111+
112+
override suspend fun setMediaButtonTriggerEnabled(enabled: Boolean) {
113+
prefs.edit {
114+
putBoolean(KEY_MEDIA_BUTTON_TRIGGER, enabled)
115+
}
116+
}
117+
98118
override val sstLanguage: Flow<String> = callbackFlow {
99119
val listener = SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
100120
if (key == KEY_SST_LANGUAGE) {
@@ -119,7 +139,6 @@ class SettingsRepositoryImpl @Inject constructor(
119139
}
120140
}
121141
prefs.registerOnSharedPreferenceChangeListener(listener)
122-
// Send initial value
123142
trySend(prefs.getString(KEY_API_KEY, "") ?: "")
124143
awaitClose { prefs.unregisterOnSharedPreferenceChangeListener(listener) }
125144
}

0 commit comments

Comments
 (0)