Skip to content

Commit 95beca5

Browse files
committed
refactor: standardize UI card components with updated iconography, styling, and improved layout consistency
1 parent 26a901c commit 95beca5

27 files changed

Lines changed: 945 additions & 1169 deletions

app/src/main/java/com/sameerasw/airsync/presentation/ui/components/RoundedCardContainer.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package com.sameerasw.airsync.presentation.ui.components
22

3+
import androidx.compose.foundation.background
34
import androidx.compose.foundation.layout.Arrangement
45
import androidx.compose.foundation.layout.Column
56
import androidx.compose.foundation.layout.ColumnScope
67
import androidx.compose.foundation.shape.RoundedCornerShape
8+
import androidx.compose.material3.MaterialTheme
79
import androidx.compose.runtime.Composable
810
import androidx.compose.ui.Modifier
911
import androidx.compose.ui.draw.clip
12+
import androidx.compose.ui.graphics.Color
1013
import androidx.compose.ui.unit.Dp
1114
import androidx.compose.ui.unit.dp
1215

@@ -17,20 +20,24 @@ import androidx.compose.ui.unit.dp
1720
* @param modifier Modifier to apply to the container
1821
* @param spacing Vertical spacing between child cards (default: 2.dp)
1922
* @param cornerRadius Corner radius for the entire container (default: 24.dp)
23+
* @param containerColor Background color for the container
2024
* @param content The content to be placed inside the container
2125
*/
2226
@Composable
2327
fun RoundedCardContainer(
2428
modifier: Modifier = Modifier,
2529
spacing: Dp = 2.dp,
2630
cornerRadius: Dp = 24.dp,
31+
containerColor: Color = Color.Transparent,
2732
content: @Composable ColumnScope.() -> Unit
2833
) {
2934
Column(
3035
modifier = modifier
31-
.clip(RoundedCornerShape(cornerRadius)),
36+
.clip(RoundedCornerShape(cornerRadius))
37+
.background(containerColor),
3238
verticalArrangement = Arrangement.spacedBy(spacing),
3339
content = content
3440
)
3541
}
3642

43+

app/src/main/java/com/sameerasw/airsync/presentation/ui/components/SettingsView.kt

Lines changed: 74 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ import androidx.compose.material3.Card
2929
import androidx.compose.material3.CardDefaults
3030
import androidx.compose.material3.CircularProgressIndicator
3131
import androidx.compose.material3.Icon
32+
import androidx.compose.material3.ListItem
33+
import androidx.compose.material3.ListItemDefaults
3234
import androidx.compose.material3.MaterialTheme
3335
import androidx.compose.material3.Text
3436
import androidx.compose.material3.TextButton
@@ -37,6 +39,7 @@ import androidx.compose.ui.Alignment
3739
import androidx.compose.ui.Modifier
3840
import androidx.compose.ui.platform.LocalHapticFeedback
3941
import androidx.compose.ui.unit.dp
42+
import com.sameerasw.airsync.R
4043
import com.sameerasw.airsync.domain.model.DeviceInfo
4144
import com.sameerasw.airsync.domain.model.UiState
4245
import com.sameerasw.airsync.presentation.ui.components.cards.ClipboardFeaturesCard
@@ -48,7 +51,7 @@ import com.sameerasw.airsync.presentation.ui.components.cards.MediaSyncCard
4851
import com.sameerasw.airsync.presentation.ui.components.cards.NotificationSyncCard
4952
import com.sameerasw.airsync.presentation.ui.components.cards.PermissionsCard
5053
import com.sameerasw.airsync.presentation.ui.components.cards.QuickSettingsTilesCard
51-
import com.sameerasw.airsync.presentation.ui.components.cards.SendNowPlayingCard
54+
import com.sameerasw.airsync.presentation.ui.components.cards.IconToggleItem
5255
import com.sameerasw.airsync.presentation.ui.components.cards.SmartspacerCard
5356
import com.sameerasw.airsync.presentation.viewmodel.AirSyncViewModel
5457
import com.sameerasw.airsync.utils.HapticUtil
@@ -116,46 +119,16 @@ fun SettingsView(
116119
PermissionsCard(missingPermissionsCount = uiState.missingPermissions.size)
117120

118121
// Help and guides card
119-
Card(
120-
modifier = Modifier
121-
.fillMaxWidth()
122-
.clickable {
123-
HapticUtil.performClick(haptics)
124-
onShowHelp()
125-
},
126-
shape = MaterialTheme.shapes.extraSmall,
127-
colors = CardDefaults.cardColors(
128-
containerColor = MaterialTheme.colorScheme.surfaceContainerHighest
129-
)
130-
) {
131-
Row(
132-
modifier = Modifier
133-
.fillMaxWidth()
134-
.padding(16.dp),
135-
horizontalArrangement = Arrangement.SpaceBetween,
136-
verticalAlignment = Alignment.CenterVertically
137-
) {
138-
Column(modifier = Modifier.weight(1f)) {
139-
Text(
140-
androidx.compose.ui.res.stringResource(com.sameerasw.airsync.R.string.label_help_guides),
141-
style = MaterialTheme.typography.titleMedium,
142-
color = MaterialTheme.colorScheme.onSurface
143-
)
144-
Text(
145-
androidx.compose.ui.res.stringResource(com.sameerasw.airsync.R.string.subtitle_help_guides),
146-
style = MaterialTheme.typography.bodySmall,
147-
color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.7f)
148-
)
149-
}
150-
151-
Icon(
152-
painter = androidx.compose.ui.res.painterResource(id = com.sameerasw.airsync.R.drawable.rounded_keyboard_arrow_right_24),
153-
contentDescription = "Open help",
154-
modifier = Modifier.size(24.dp),
155-
tint = MaterialTheme.colorScheme.onSurface
156-
)
122+
com.sameerasw.airsync.presentation.ui.components.cards.IconToggleItem(
123+
iconRes = com.sameerasw.airsync.R.drawable.rounded_info_24,
124+
title = androidx.compose.ui.res.stringResource(com.sameerasw.airsync.R.string.label_help_guides),
125+
description = androidx.compose.ui.res.stringResource(com.sameerasw.airsync.R.string.subtitle_help_guides),
126+
showToggle = false,
127+
onClick = {
128+
HapticUtil.performClick(haptics)
129+
onShowHelp()
157130
}
158-
}
131+
)
159132

160133
QuickSettingsTilesCard(
161134
isConnectionTileAdded = com.sameerasw.airsync.utils.QuickSettingsUtil.isQSTileAdded(
@@ -165,10 +138,6 @@ fun SettingsView(
165138
isClipboardTileAdded = com.sameerasw.airsync.utils.QuickSettingsUtil.isQSTileAdded(
166139
context,
167140
com.sameerasw.airsync.service.ClipboardTileService::class.java
168-
),
169-
isQuickShareTileAdded = com.sameerasw.airsync.utils.QuickSettingsUtil.isQSTileAdded(
170-
context,
171-
172141
)
173142
)
174143
}
@@ -182,13 +151,9 @@ fun SettingsView(
182151
onDefaultTabChange = { tab -> viewModel.setDefaultTab(tab) }
183152
)
184153

185-
SendNowPlayingCard(
186-
isSendNowPlayingEnabled = uiState.isBlurSettingEnabled,
187-
onToggleSendNowPlaying = { enabled: Boolean ->
188-
viewModel.setUseBlurEnabled(enabled, context)
189-
},
154+
IconToggleItem(
190155
title = androidx.compose.ui.res.stringResource(com.sameerasw.airsync.R.string.label_use_blur),
191-
subtitle = when {
156+
description = when {
192157
com.sameerasw.airsync.utils.DeviceInfoUtil.isBlurProblematicDevice() ->
193158
androidx.compose.ui.res.stringResource(com.sameerasw.airsync.R.string.subtitle_blur_disabled_samsung)
194159

@@ -197,25 +162,32 @@ fun SettingsView(
197162

198163
else -> androidx.compose.ui.res.stringResource(com.sameerasw.airsync.R.string.subtitle_use_blur)
199164
},
165+
iconRes = R.drawable.rounded_blur_on_24,
166+
isChecked = uiState.isBlurSettingEnabled,
167+
onCheckedChange = { enabled: Boolean ->
168+
viewModel.setUseBlurEnabled(enabled, context)
169+
},
200170
enabled = !com.sameerasw.airsync.utils.DeviceInfoUtil.isBlurProblematicDevice()
201171
)
202172

203-
SendNowPlayingCard(
204-
isSendNowPlayingEnabled = uiState.isPitchBlackThemeEnabled,
205-
onToggleSendNowPlaying = { enabled: Boolean ->
206-
viewModel.setPitchBlackThemeEnabled(enabled)
207-
},
173+
IconToggleItem(
208174
title = androidx.compose.ui.res.stringResource(com.sameerasw.airsync.R.string.label_pitch_black_theme),
209-
subtitle = androidx.compose.ui.res.stringResource(com.sameerasw.airsync.R.string.subtitle_pitch_black_theme)
175+
description = androidx.compose.ui.res.stringResource(com.sameerasw.airsync.R.string.subtitle_pitch_black_theme),
176+
iconRes = R.drawable.rounded_dark_mode_24,
177+
isChecked = uiState.isPitchBlackThemeEnabled,
178+
onCheckedChange = { enabled: Boolean ->
179+
viewModel.setPitchBlackThemeEnabled(enabled)
180+
}
210181
)
211182

212-
SendNowPlayingCard(
213-
isSendNowPlayingEnabled = uiState.isSentryReportingEnabled,
214-
onToggleSendNowPlaying = { enabled: Boolean ->
215-
viewModel.setSentryReportingEnabled(enabled)
216-
},
183+
IconToggleItem(
217184
title = androidx.compose.ui.res.stringResource(com.sameerasw.airsync.R.string.label_error_reporting),
218-
subtitle = androidx.compose.ui.res.stringResource(com.sameerasw.airsync.R.string.subtitle_error_reporting)
185+
description = androidx.compose.ui.res.stringResource(com.sameerasw.airsync.R.string.subtitle_error_reporting),
186+
iconRes = R.drawable.rounded_bug_report_24,
187+
isChecked = uiState.isSentryReportingEnabled,
188+
onCheckedChange = { enabled: Boolean ->
189+
viewModel.setSentryReportingEnabled(enabled)
190+
}
219191
)
220192
}
221193
}
@@ -261,13 +233,14 @@ fun SettingsView(
261233
}
262234
)
263235

264-
SendNowPlayingCard(
265-
isSendNowPlayingEnabled = uiState.isQuickShareEnabled,
266-
onToggleSendNowPlaying = { enabled: Boolean ->
267-
viewModel.setQuickShareEnabled(context, enabled)
268-
},
236+
IconToggleItem(
269237
title = "Quick Share",
270-
subtitle = "Allow receiving files from nearby devices"
238+
description = "Allow receiving files from nearby devices",
239+
iconRes = R.drawable.quick_share,
240+
isChecked = uiState.isQuickShareEnabled,
241+
onCheckedChange = { enabled: Boolean ->
242+
viewModel.setQuickShareEnabled(context, enabled)
243+
}
271244
)
272245
}
273246
}
@@ -292,51 +265,45 @@ fun SettingsView(
292265
}
293266

294267
if (isEssentialsInstalled) {
295-
SendNowPlayingCard(
296-
isSendNowPlayingEnabled = uiState.isEssentialsConnectionEnabled,
297-
onToggleSendNowPlaying = { enabled: Boolean ->
298-
viewModel.setEssentialsConnectionEnabled(enabled)
299-
},
268+
IconToggleItem(
300269
title = androidx.compose.ui.res.stringResource(com.sameerasw.airsync.R.string.connect_to_essentials),
301-
subtitle = androidx.compose.ui.res.stringResource(com.sameerasw.airsync.R.string.connect_to_essentials_summary)
270+
description = androidx.compose.ui.res.stringResource(com.sameerasw.airsync.R.string.connect_to_essentials_summary),
271+
iconRes = R.drawable.essentials_icon,
272+
isChecked = uiState.isEssentialsConnectionEnabled,
273+
onCheckedChange = { enabled: Boolean ->
274+
viewModel.setEssentialsConnectionEnabled(enabled)
275+
}
302276
)
303277
} else {
304-
Card(
305-
modifier = Modifier.fillMaxWidth(),
306-
shape = MaterialTheme.shapes.extraSmall,
307-
colors = CardDefaults.cardColors(
308-
containerColor = MaterialTheme.colorScheme.surfaceContainerHighest
309-
)
310-
) {
311-
androidx.compose.material3.ListItem(
312-
colors = androidx.compose.material3.ListItemDefaults.colors(
313-
containerColor = androidx.compose.ui.graphics.Color.Transparent
314-
),
315-
headlineContent = { Text(androidx.compose.ui.res.stringResource(com.sameerasw.airsync.R.string.download_essentials)) },
316-
supportingContent = {
317-
Text(
318-
androidx.compose.ui.res.stringResource(
319-
com.sameerasw.airsync.R.string.download_essentials_summary
320-
)
278+
ListItem(
279+
colors = ListItemDefaults.colors(
280+
containerColor = androidx.compose.ui.graphics.Color.Transparent
281+
),
282+
headlineContent = { Text(androidx.compose.ui.res.stringResource(com.sameerasw.airsync.R.string.download_essentials)) },
283+
supportingContent = {
284+
Text(
285+
androidx.compose.ui.res.stringResource(
286+
com.sameerasw.airsync.R.string.download_essentials_summary
321287
)
322-
},
323-
trailingContent = {
324-
Button(
325-
onClick = {
326-
val intent = android.content.Intent(
327-
android.content.Intent.ACTION_VIEW,
328-
android.net.Uri.parse("https://github.com/sameerasw/essentials/releases/latest")
329-
)
330-
intent.flags =
331-
android.content.Intent.FLAG_ACTIVITY_NEW_TASK
332-
context.startActivity(intent)
333-
}
334-
) {
335-
Text("Download")
288+
)
289+
},
290+
trailingContent = {
291+
Button(
292+
onClick = {
293+
HapticUtil.performClick(haptics)
294+
val intent = android.content.Intent(
295+
android.content.Intent.ACTION_VIEW,
296+
android.net.Uri.parse("https://github.com/sameerasw/essentials/releases/latest")
297+
)
298+
intent.flags =
299+
android.content.Intent.FLAG_ACTIVITY_NEW_TASK
300+
context.startActivity(intent)
336301
}
302+
) {
303+
Text("Download")
337304
}
338-
)
339-
}
305+
}
306+
)
340307
}
341308
}
342309
}

0 commit comments

Comments
 (0)