Skip to content

Commit 96c4966

Browse files
authored
Merge branch 'main' into improve-notification
2 parents bd473ee + 5dbfe69 commit 96c4966

File tree

5 files changed

+88
-79
lines changed

5 files changed

+88
-79
lines changed

android/app/src/main/java/me/kavishdevar/aln/composables/BatteryIndicator.kt

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
package me.kavishdevar.aln.composables
2020

21+
22+
import androidx.compose.animation.core.animateFloatAsState
2123
import androidx.compose.foundation.background
2224
import androidx.compose.foundation.border
2325
import androidx.compose.foundation.layout.Arrangement
@@ -33,74 +35,74 @@ import androidx.compose.foundation.shape.RoundedCornerShape
3335
import androidx.compose.material3.MaterialTheme
3436
import androidx.compose.material3.Text
3537
import androidx.compose.runtime.Composable
38+
import androidx.compose.runtime.getValue
3639
import androidx.compose.ui.Alignment
3740
import androidx.compose.ui.Modifier
41+
import androidx.compose.ui.draw.scale
3842
import androidx.compose.ui.graphics.Color
3943
import androidx.compose.ui.text.TextStyle
4044
import androidx.compose.ui.text.font.Font
4145
import androidx.compose.ui.text.font.FontFamily
4246
import androidx.compose.ui.text.font.FontWeight
47+
import androidx.compose.ui.text.style.TextAlign
4348
import androidx.compose.ui.tooling.preview.Preview
4449
import androidx.compose.ui.unit.dp
4550
import androidx.compose.ui.unit.sp
4651
import me.kavishdevar.aln.R
4752

48-
4953
@Composable
5054
fun BatteryIndicator(batteryPercentage: Int, charging: Boolean = false) {
5155
val batteryOutlineColor = Color(0xFFBFBFBF)
5256
val batteryFillColor = if (batteryPercentage > 30) Color(0xFF30D158) else Color(0xFFFC3C3C)
5357
val batteryTextColor = MaterialTheme.colorScheme.onSurface
5458

55-
// Battery indicator dimensions
5659
val batteryWidth = 40.dp
5760
val batteryHeight = 15.dp
5861
val batteryCornerRadius = 4.dp
5962
val tipWidth = 5.dp
6063
val tipHeight = batteryHeight * 0.375f
6164

65+
val animatedFillWidth by animateFloatAsState(targetValue = batteryPercentage / 100f)
66+
val animatedScale by animateFloatAsState(targetValue = if (charging) 1.2f else 1f)
67+
6268
Column(
6369
horizontalAlignment = Alignment.CenterHorizontally
6470
) {
6571
Row(
6672
verticalAlignment = Alignment.CenterVertically,
6773
horizontalArrangement = Arrangement.spacedBy(0.dp),
68-
modifier = Modifier.padding(bottom = 4.dp) // Padding between icon and percentage text
74+
modifier = Modifier.padding(bottom = 4.dp)
6975
) {
70-
// Battery Icon
7176
Box(
7277
modifier = Modifier
7378
.width(batteryWidth)
7479
.height(batteryHeight)
75-
.border(1.dp, batteryOutlineColor, RoundedCornerShape(batteryCornerRadius))
7680
) {
81+
Box (
82+
modifier = Modifier
83+
.fillMaxSize()
84+
.border(1.dp, batteryOutlineColor, RoundedCornerShape(batteryCornerRadius))
85+
)
7786
Box(
7887
modifier = Modifier
7988
.fillMaxHeight()
8089
.padding(2.dp)
81-
.width(batteryWidth * (batteryPercentage / 100f))
90+
.width(batteryWidth * animatedFillWidth)
8291
.background(batteryFillColor, RoundedCornerShape(2.dp))
8392
)
8493
if (charging) {
85-
Box(
94+
Text(
95+
text = "\uDBC0\uDEE6",
96+
fontSize = 16.sp,
97+
fontFamily = FontFamily(Font(R.font.sf_pro)),
98+
color = Color.White,
8699
modifier = Modifier
87-
.padding(0.dp)
100+
.scale(animatedScale)
88101
.fillMaxSize(),
89-
contentAlignment = Alignment.Center
90-
) {
91-
Text(
92-
text = "\uDBC0\uDEE6",
93-
fontSize = 15.sp,
94-
fontFamily = FontFamily(Font(R.font.sf_pro)),
95-
color = Color.White,
96-
modifier = Modifier
97-
.align(Alignment.Center)
98-
.padding(0.dp)
99-
)
100-
}
102+
textAlign = TextAlign.Center
103+
)
101104
}
102105
}
103-
104106
Box(
105107
modifier = Modifier
106108
.width(tipWidth)

android/app/src/main/java/me/kavishdevar/aln/composables/BatteryView.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -127,21 +127,21 @@ fun BatteryView(service: AirPodsService, preview: Boolean = false) {
127127
.fillMaxWidth(),
128128
horizontalArrangement = Arrangement.Center
129129
) {
130-
if (left?.status != BatteryStatus.DISCONNECTED) {
130+
// if (left?.status != BatteryStatus.DISCONNECTED) {
131131
BatteryIndicator(
132132
left?.level ?: 0,
133133
left?.status == BatteryStatus.CHARGING
134134
)
135-
}
136-
if (left?.status != BatteryStatus.DISCONNECTED && right?.status != BatteryStatus.DISCONNECTED) {
135+
// }
136+
// if (left?.status != BatteryStatus.DISCONNECTED && right?.status != BatteryStatus.DISCONNECTED) {
137137
Spacer(modifier = Modifier.width(16.dp))
138-
}
139-
if (right?.status != BatteryStatus.DISCONNECTED) {
138+
// }
139+
// if (right?.status != BatteryStatus.DISCONNECTED) {
140140
BatteryIndicator(
141141
right?.level ?: 0,
142142
right?.status == BatteryStatus.CHARGING
143143
)
144-
}
144+
// }
145145
}
146146
}
147147
}
@@ -160,9 +160,9 @@ fun BatteryView(service: AirPodsService, preview: Boolean = false) {
160160
.fillMaxWidth()
161161
.scale(1.25f)
162162
)
163-
if (case?.status != BatteryStatus.DISCONNECTED) {
163+
// if (case?.status != BatteryStatus.DISCONNECTED) {
164164
BatteryIndicator(case?.level ?: 0, case?.status == BatteryStatus.CHARGING)
165-
}
165+
// }
166166
}
167167
}
168168
}

android/app/src/main/java/me/kavishdevar/aln/composables/NoiseControlSettings.kt

Lines changed: 42 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ import me.kavishdevar.aln.utils.NoiseControlMode
6060
@SuppressLint("UnspecifiedRegisterReceiverFlag")
6161
@Composable
6262
fun NoiseControlSettings(service: AirPodsService) {
63+
val context = LocalContext.current
64+
val sharedPreferences = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
65+
val offListeningMode = sharedPreferences.getBoolean("off_listening_mode", true)
66+
6367
val isDarkTheme = isSystemInDarkTheme()
6468
val backgroundColor = if (isDarkTheme) Color(0xFF1C1C1E) else Color(0xFFE3E3E8)
6569
val textColor = if (isDarkTheme) Color.White else Color.Black
@@ -68,15 +72,18 @@ fun NoiseControlSettings(service: AirPodsService) {
6872

6973
val noiseControlMode = remember { mutableStateOf(NoiseControlMode.OFF) }
7074

71-
7275
val d1a = remember { mutableFloatStateOf(0f) }
7376
val d2a = remember { mutableFloatStateOf(0f) }
7477
val d3a = remember { mutableFloatStateOf(0f) }
7578

7679
fun onModeSelected(mode: NoiseControlMode, received: Boolean = false) {
77-
noiseControlMode.value = mode
78-
if (!received) service.setANCMode(mode.ordinal+1)
79-
when (mode) {
80+
if (!received && !offListeningMode && mode == NoiseControlMode.OFF) {
81+
noiseControlMode.value = NoiseControlMode.ADAPTIVE
82+
} else {
83+
noiseControlMode.value = mode
84+
}
85+
if (!received) service.setANCMode(mode.ordinal + 1)
86+
when (noiseControlMode.value) {
8087
NoiseControlMode.NOISE_CANCELLATION -> {
8188
d1a.floatValue = 1f
8289
d2a.floatValue = 1f
@@ -106,8 +113,7 @@ fun NoiseControlSettings(service: AirPodsService) {
106113
if (intent.action == AirPodsNotifications.ANC_DATA) {
107114
noiseControlMode.value = NoiseControlMode.entries.toTypedArray()[intent.getIntExtra("data", 3) - 1]
108115
onModeSelected(noiseControlMode.value, true)
109-
}
110-
else if (intent.action == AirPodsNotifications.DISCONNECT_RECEIVERS) {
116+
} else if (intent.action == AirPodsNotifications.DISCONNECT_RECEIVERS) {
111117
try {
112118
context.unregisterReceiver(this)
113119
} catch (e: IllegalArgumentException) {
@@ -118,16 +124,13 @@ fun NoiseControlSettings(service: AirPodsService) {
118124
}
119125
}
120126

121-
val context = LocalContext.current
122-
val noiseControlIntentFilter = IntentFilter()
123-
.apply {
124-
addAction(AirPodsNotifications.ANC_DATA)
125-
addAction(AirPodsNotifications.DISCONNECT_RECEIVERS)
126-
}
127+
val noiseControlIntentFilter = IntentFilter().apply {
128+
addAction(AirPodsNotifications.ANC_DATA)
129+
addAction(AirPodsNotifications.DISCONNECT_RECEIVERS)
130+
}
127131
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
128132
context.registerReceiver(noiseControlReceiver, noiseControlIntentFilter, Context.RECEIVER_EXPORTED)
129-
}
130-
else {
133+
} else {
131134
context.registerReceiver(noiseControlReceiver, noiseControlIntentFilter)
132135
}
133136

@@ -157,20 +160,22 @@ fun NoiseControlSettings(service: AirPodsService) {
157160
.fillMaxWidth()
158161
.background(backgroundColor, RoundedCornerShape(14.dp))
159162
) {
160-
NoiseControlButton(
161-
icon = ImageBitmap.imageResource(R.drawable.noise_cancellation),
162-
onClick = { onModeSelected(NoiseControlMode.OFF) },
163-
textColor = if (noiseControlMode.value == NoiseControlMode.OFF) textColorSelected else textColor,
164-
backgroundColor = if (noiseControlMode.value == NoiseControlMode.OFF) selectedBackground else Color.Transparent,
165-
modifier = Modifier.weight(1f)
166-
)
167-
VerticalDivider(
168-
thickness = 1.dp,
169-
modifier = Modifier
170-
.padding(vertical = 10.dp)
171-
.alpha(d1a.floatValue),
172-
color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.12f),
173-
)
163+
if (offListeningMode) {
164+
NoiseControlButton(
165+
icon = ImageBitmap.imageResource(R.drawable.noise_cancellation),
166+
onClick = { onModeSelected(NoiseControlMode.OFF) },
167+
textColor = if (noiseControlMode.value == NoiseControlMode.OFF) textColorSelected else textColor,
168+
backgroundColor = if (noiseControlMode.value == NoiseControlMode.OFF) selectedBackground else Color.Transparent,
169+
modifier = Modifier.weight(1f)
170+
)
171+
VerticalDivider(
172+
thickness = 1.dp,
173+
modifier = Modifier
174+
.padding(vertical = 10.dp)
175+
.alpha(d1a.floatValue),
176+
color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.12f),
177+
)
178+
}
174179
NoiseControlButton(
175180
icon = ImageBitmap.imageResource(R.drawable.transparency),
176181
onClick = { onModeSelected(NoiseControlMode.TRANSPARENCY) },
@@ -214,13 +219,15 @@ fun NoiseControlSettings(service: AirPodsService) {
214219
.padding(horizontal = 8.dp)
215220
.padding(top = 1.dp)
216221
) {
217-
Text(
218-
text = "Off",
219-
style = TextStyle(fontSize = 12.sp, color = textColor),
220-
textAlign = TextAlign.Center,
221-
fontWeight = FontWeight.Bold,
222-
modifier = Modifier.weight(1f)
223-
)
222+
if (offListeningMode) {
223+
Text(
224+
text = "Off",
225+
style = TextStyle(fontSize = 12.sp, color = textColor),
226+
textAlign = TextAlign.Center,
227+
fontWeight = FontWeight.Bold,
228+
modifier = Modifier.weight(1f)
229+
)
230+
}
224231
Text(
225232
text = "Transparency",
226233
style = TextStyle(fontSize = 12.sp, color = textColor),

android/app/src/main/java/me/kavishdevar/aln/screens/DebugScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ import androidx.compose.foundation.shape.RoundedCornerShape
4949
import androidx.compose.material.icons.Icons
5050
import androidx.compose.material.icons.automirrored.filled.KeyboardArrowLeft
5151
import androidx.compose.material.icons.filled.Send
52+
import androidx.compose.material3.CenterAlignedTopAppBar
5253
import androidx.compose.material3.ExperimentalMaterial3Api
5354
import androidx.compose.material3.HorizontalDivider
5455
import androidx.compose.material3.Icon
@@ -58,7 +59,6 @@ import androidx.compose.material3.Text
5859
import androidx.compose.material3.TextButton
5960
import androidx.compose.material3.TextField
6061
import androidx.compose.material3.TextFieldDefaults
61-
import androidx.compose.material3.TopAppBar
6262
import androidx.compose.material3.TopAppBarDefaults
6363
import androidx.compose.runtime.Composable
6464
import androidx.compose.runtime.LaunchedEffect
@@ -98,7 +98,7 @@ fun DebugScreen(navController: NavController) {
9898

9999
Scaffold(
100100
topBar = {
101-
TopAppBar(
101+
CenterAlignedTopAppBar(
102102
title = { Text("Debug") },
103103
navigationIcon = {
104104
TextButton(

android/app/src/main/java/me/kavishdevar/aln/services/AirPodsService.kt

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -171,31 +171,31 @@ class AirPodsService: Service() {
171171
it.setTextViewText(
172172
R.id.left_battery_widget,
173173
batteryNotification.getBattery().find { it.component == BatteryComponent.LEFT }?.let {
174-
if (it.status != BatteryStatus.DISCONNECTED) {
174+
// if (it.status != BatteryStatus.DISCONNECTED) {
175175
"${if (it.status == BatteryStatus.CHARGING) "" else ""} ${it.level}%"
176-
} else {
177-
""
178-
}
176+
// } else {
177+
// ""
178+
// }
179179
} ?: ""
180180
)
181181
it.setTextViewText(
182182
R.id.right_battery_widget,
183183
batteryNotification.getBattery().find { it.component == BatteryComponent.RIGHT }?.let {
184-
if (it.status != BatteryStatus.DISCONNECTED) {
184+
// if (it.status != BatteryStatus.DISCONNECTED) {
185185
"${if (it.status == BatteryStatus.CHARGING) "" else ""} ${it.level}%"
186-
} else {
187-
""
188-
}
186+
// } else {
187+
// ""
188+
// }
189189
} ?: ""
190190
)
191191
it.setTextViewText(
192192
R.id.case_battery_widget,
193193
batteryNotification.getBattery().find { it.component == BatteryComponent.CASE }?.let {
194-
if (it.status != BatteryStatus.DISCONNECTED) {
194+
// if (it.status != BatteryStatus.DISCONNECTED) {
195195
"${if (it.status == BatteryStatus.CHARGING) "" else ""} ${it.level}%"
196-
} else {
197-
""
198-
}
196+
// } else {
197+
// ""
198+
// }
199199
} ?: ""
200200
)
201201
}
@@ -205,7 +205,7 @@ class AirPodsService: Service() {
205205

206206
fun updateNotificationContent(connected: Boolean, airpodsName: String? = null, batteryList: List<Battery>? = null) {
207207
val notificationManager = getSystemService(NotificationManager::class.java)
208-
val textColor = this.getSharedPreferences("settings", MODE_PRIVATE).getLong("textColor", 0)
208+
// val textColor = this.getSharedPreferences("settings", MODE_PRIVATE).getLong("textColor", 0)
209209
var updatedNotification: Notification? = null
210210

211211
if (connected) {

0 commit comments

Comments
 (0)