From 2b8531bde27feae5c7dc667916cce1b37b8cf7b7 Mon Sep 17 00:00:00 2001 From: Ushie Date: Wed, 25 Oct 2023 16:33:11 +0300 Subject: [PATCH 1/7] feat: major notification card improvements --- .../manager/ui/component/NotificationCard.kt | 154 +++++++++++++++--- .../component/bundle/BundlePatchesDialog.kt | 13 +- .../manager/ui/screen/InstalledAppsScreen.kt | 22 +-- .../manager/ui/screen/SettingsScreen.kt | 64 +++----- app/src/main/res/values/strings.xml | 4 +- 5 files changed, 164 insertions(+), 93 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/component/NotificationCard.kt b/app/src/main/java/app/revanced/manager/ui/component/NotificationCard.kt index a4e2129716..1b292baa9e 100644 --- a/app/src/main/java/app/revanced/manager/ui/component/NotificationCard.kt +++ b/app/src/main/java/app/revanced/manager/ui/component/NotificationCard.kt @@ -1,59 +1,161 @@ package app.revanced.manager.ui.component -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Close import androidx.compose.material3.Card -import androidx.compose.material3.CardColors import androidx.compose.material3.CardDefaults import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text +import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import app.revanced.manager.R @Composable fun NotificationCard( - color: Color, - icon: ImageVector, + isWarning: Boolean = false, + title: String? = null, text: String, - content: (@Composable () -> Unit)? = null, + icon: ImageVector, + onDismiss: (() -> Unit)? = null, + tertiaryAction: (@Composable () -> Unit)? = null, + actions: (@Composable () -> Unit)? = null ) { Card( - colors = CardDefaults.cardColors(containerColor = color), + colors = CardDefaults.cardColors(containerColor = (if (isWarning) MaterialTheme.colorScheme.error else MaterialTheme.colorScheme.secondaryContainer)), modifier = Modifier .fillMaxWidth() - .clip(RoundedCornerShape(28.dp)) + .padding(16.dp) + .clip(RoundedCornerShape(24.dp)) ) { - Row( + Column( modifier = Modifier .fillMaxWidth() - .padding(16.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy( - 16.dp, - Alignment.Start - ) + .padding(if (actions != null) 20.dp else 16.dp), + verticalArrangement = Arrangement.spacedBy(8.dp) ) { - Icon( - imageVector = icon, - contentDescription = null, - ) - Text( - modifier = if (content != null) Modifier.width(220.dp) else Modifier, - text = text, - style = MaterialTheme.typography.bodyMedium - ) - content?.invoke() + if (actions == null) { + Row( + modifier = Modifier + .fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(16.dp) + ) { + Icon( + modifier = Modifier.size(24.dp), + imageVector = icon, + contentDescription = null, + tint = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary + ) + if (title == null) { + Text( + modifier = Modifier.weight(1f), + text = text, + style = MaterialTheme.typography.bodyMedium + ) + } else { + Column( + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(6.dp) + ) { + Text( + text = title, + style = MaterialTheme.typography.titleLarge, + color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary + ) + Text( + text = text, + style = MaterialTheme.typography.bodyMedium, + color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary + ) + } + } + Row { + tertiaryAction?.invoke() + if (onDismiss != null) { + IconButton(onClick = onDismiss) { + Icon( + imageVector = Icons.Outlined.Close, + contentDescription = stringResource(R.string.close), + tint = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary + ) + } + } + } + } + } else { + if (title == null) { + Row( + modifier = Modifier + .fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(16.dp) + ) { + Icon( + modifier = Modifier.size(24.dp), + imageVector = icon, + contentDescription = null + ) + Text( + text = text, + style = MaterialTheme.typography.bodyMedium + ) + } + } else { + Icon( + modifier = Modifier.size(36.dp), + imageVector = icon, + contentDescription = null + ) + Column( + verticalArrangement = Arrangement.spacedBy(6.dp) + ) { + Text( + text = title, + style = MaterialTheme.typography.titleLarge, + color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary + ) + Text( + text = text, + style = MaterialTheme.typography.bodyMedium, + color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary + ) + } + } + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Row { + tertiaryAction?.invoke() + } + Row(horizontalArrangement = Arrangement.spacedBy(4.dp)) { + if (onDismiss != null) { + TextButton(onClick = onDismiss) { + Text( + text = stringResource(id = R.string.dismiss), + color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary + ) + } + } + actions.invoke() + } + } + } } } } \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/component/bundle/BundlePatchesDialog.kt b/app/src/main/java/app/revanced/manager/ui/component/bundle/BundlePatchesDialog.kt index 2ff2a555ab..a78cbb5931 100644 --- a/app/src/main/java/app/revanced/manager/ui/component/bundle/BundlePatchesDialog.kt +++ b/app/src/main/java/app/revanced/manager/ui/component/bundle/BundlePatchesDialog.kt @@ -70,17 +70,10 @@ fun BundlePatchesDialog( item { AnimatedVisibility(visible = informationCardVisible) { NotificationCard( - color = MaterialTheme.colorScheme.secondaryContainer, icon = Icons.Outlined.Lightbulb, - text = stringResource(R.string.tap_on_patches) - ) { - IconButton(onClick = { informationCardVisible = false }) { - Icon( - imageVector = Icons.Outlined.Close, - contentDescription = stringResource(R.string.close), - ) - } - } + text = stringResource(R.string.tap_on_patches), + onDismiss = { informationCardVisible = false } + ) } } diff --git a/app/src/main/java/app/revanced/manager/ui/screen/InstalledAppsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screen/InstalledAppsScreen.kt index 2a2a2b8951..c7535a6a58 100644 --- a/app/src/main/java/app/revanced/manager/ui/screen/InstalledAppsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screen/InstalledAppsScreen.kt @@ -2,10 +2,8 @@ package app.revanced.manager.ui.screen import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items @@ -18,7 +16,6 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -40,16 +37,15 @@ fun InstalledAppsScreen( val installedApps by viewModel.apps.collectAsStateWithLifecycle(initialValue = null) Column { - if (!Aapt.supportsDevice()) - Box(modifier = Modifier.padding(16.dp)) { - NotificationCard( - color = MaterialTheme.colorScheme.errorContainer, - icon = Icons.Outlined.WarningAmber, - text = stringResource( - R.string.unsupported_architecture_warning - ), - ) - } + if (!Aapt.supportsDevice()) { + NotificationCard( + isWarning = true, + icon = Icons.Outlined.WarningAmber, + text = stringResource( + R.string.unsupported_architecture_warning + ), + ) + } LazyColumn( modifier = Modifier.fillMaxSize(), diff --git a/app/src/main/java/app/revanced/manager/ui/screen/SettingsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screen/SettingsScreen.kt index 3aaa7d4465..db3a20be8a 100644 --- a/app/src/main/java/app/revanced/manager/ui/screen/SettingsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screen/SettingsScreen.kt @@ -7,18 +7,12 @@ import android.net.Uri import android.os.PowerManager import android.provider.Settings import androidx.compose.animation.AnimatedVisibility -import androidx.compose.animation.ExperimentalAnimationApi -import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.BatteryAlert @@ -29,14 +23,13 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import app.revanced.manager.R import app.revanced.manager.ui.component.AppTopBar +import app.revanced.manager.ui.component.NotificationCard import app.revanced.manager.ui.destination.SettingsDestination import app.revanced.manager.ui.screen.settings.* import app.revanced.manager.ui.screen.settings.update.ManagerUpdateChangelog @@ -47,7 +40,7 @@ import dev.olshevski.navigation.reimagined.* import org.koin.androidx.compose.getViewModel @SuppressLint("BatteryLife") -@OptIn(ExperimentalMaterial3Api::class, ExperimentalAnimationApi::class) +@OptIn(ExperimentalMaterial3Api::class) @Composable fun SettingsScreen( onBackClick: () -> Unit, @@ -161,40 +154,25 @@ fun SettingsScreen( verticalArrangement = Arrangement.spacedBy(12.dp) ) { AnimatedVisibility(visible = showBatteryButton) { - Card( - onClick = { - context.startActivity(Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).apply { - data = Uri.parse("package:${context.packageName}") - }) - showBatteryButton = - !pm.isIgnoringBatteryOptimizations(context.packageName) - }, - modifier = Modifier - .fillMaxWidth() - .padding(16.dp) - .clip(RoundedCornerShape(24.dp)) - .background(MaterialTheme.colorScheme.tertiaryContainer), - ) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(16.dp) - ) { - Icon( - imageVector = Icons.Default.BatteryAlert, - contentDescription = null, - tint = MaterialTheme.colorScheme.onTertiaryContainer, - modifier = Modifier.size(24.dp) - ) - Text( - text = stringResource(R.string.battery_optimization_notification), - style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.onTertiaryContainer - ) + NotificationCard( + isWarning = true, + icon = Icons.Default.BatteryAlert, + text = stringResource(R.string.battery_optimization_notification), + actions = { + TextButton(onClick = { + context.startActivity(Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).apply { + data = Uri.parse("package:${context.packageName}") + }) + showBatteryButton = + !pm.isIgnoringBatteryOptimizations(context.packageName) + }) { + Text( + text = stringResource(id = R.string.disable_battery_optimization), + color = MaterialTheme.colorScheme.onError + ) + } } - } + ) } settingsSections.forEach { (titleDescIcon, destination) -> ListItem( @@ -220,4 +198,4 @@ fun SettingsScreen( } } } -} +} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4c0947736c..51d864f73d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -246,6 +246,7 @@ More Continue + Dismiss Do not show this again Donate Website @@ -273,7 +274,7 @@ Loading changelog Failed to download changelog: %s Check out the latest changes in this update - Battery optimization must be turned off in order for ReVanced Manager to work correctly in the background. Tap here to turn off. + Battery optimization must be turned off in order for ReVanced Manager to work correctly. Installing update… Downloading update… Failed to download update: %s @@ -281,4 +282,5 @@ Save Update Tap on Update when prompted. \n ReVanced Manager will close when updating. + Disable battery optimization \ No newline at end of file From 4395b867c20e3360e439dbcb5df865af83d239e8 Mon Sep 17 00:00:00 2001 From: Ushie Date: Wed, 25 Oct 2023 16:33:28 +0300 Subject: [PATCH 2/7] refactor: notification card overloads --- .../manager/ui/component/NotificationCard.kt | 230 +++++++++--------- .../manager/ui/screen/SettingsScreen.kt | 21 +- 2 files changed, 127 insertions(+), 124 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/component/NotificationCard.kt b/app/src/main/java/app/revanced/manager/ui/component/NotificationCard.kt index 1b292baa9e..0069936972 100644 --- a/app/src/main/java/app/revanced/manager/ui/component/NotificationCard.kt +++ b/app/src/main/java/app/revanced/manager/ui/component/NotificationCard.kt @@ -11,11 +11,11 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Close import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text -import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -31,131 +31,139 @@ fun NotificationCard( title: String? = null, text: String, icon: ImageVector, - onDismiss: (() -> Unit)? = null, - tertiaryAction: (@Composable () -> Unit)? = null, - actions: (@Composable () -> Unit)? = null + actions: (@Composable () -> Unit)? ) { - Card( - colors = CardDefaults.cardColors(containerColor = (if (isWarning) MaterialTheme.colorScheme.error else MaterialTheme.colorScheme.secondaryContainer)), - modifier = Modifier - .fillMaxWidth() - .padding(16.dp) - .clip(RoundedCornerShape(24.dp)) - ) { + NotificationCardInstance(isWarning = isWarning) { Column( - modifier = Modifier - .fillMaxWidth() - .padding(if (actions != null) 20.dp else 16.dp), - verticalArrangement = Arrangement.spacedBy(8.dp) + modifier = Modifier.padding(if (title != null) 20.dp else 16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) ) { - if (actions == null) { - Row( - modifier = Modifier - .fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(16.dp) + if (title != null) { + Icon( + modifier = Modifier.size(36.dp), + imageVector = icon, + contentDescription = null + ) + Column( + verticalArrangement = Arrangement.spacedBy(6.dp) ) { - Icon( - modifier = Modifier.size(24.dp), - imageVector = icon, - contentDescription = null, - tint = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary + Text( + text = title, + style = MaterialTheme.typography.titleLarge, + color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary + ) + Text( + text = text, + style = MaterialTheme.typography.bodyMedium, + color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary ) - if (title == null) { - Text( - modifier = Modifier.weight(1f), - text = text, - style = MaterialTheme.typography.bodyMedium - ) - } else { - Column( - modifier = Modifier.weight(1f), - verticalArrangement = Arrangement.spacedBy(6.dp) - ) { - Text( - text = title, - style = MaterialTheme.typography.titleLarge, - color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary - ) - Text( - text = text, - style = MaterialTheme.typography.bodyMedium, - color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary - ) - } - } - Row { - tertiaryAction?.invoke() - if (onDismiss != null) { - IconButton(onClick = onDismiss) { - Icon( - imageVector = Icons.Outlined.Close, - contentDescription = stringResource(R.string.close), - tint = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary - ) - } - } - } } } else { - if (title == null) { - Row( - modifier = Modifier - .fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(16.dp) - ) { - Icon( - modifier = Modifier.size(24.dp), - imageVector = icon, - contentDescription = null - ) - Text( - text = text, - style = MaterialTheme.typography.bodyMedium - ) - } - } else { + Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) { Icon( - modifier = Modifier.size(36.dp), + modifier = Modifier.size(24.dp), imageVector = icon, contentDescription = null ) - Column( - verticalArrangement = Arrangement.spacedBy(6.dp) - ) { - Text( - text = title, - style = MaterialTheme.typography.titleLarge, - color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary - ) - Text( - text = text, - style = MaterialTheme.typography.bodyMedium, - color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary - ) - } + Text( + text = text, + style = MaterialTheme.typography.bodyMedium, + color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary + ) } - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceBetween + } + + actions?.invoke() + } + } +} + +@Composable +fun NotificationCard( + isWarning: Boolean = false, + title: String? = null, + text: String, + icon: ImageVector, + onDismiss: (() -> Unit)? = null, + primaryAction: (() -> Unit)? = null +) { + NotificationCardInstance(isWarning = isWarning, onClick = primaryAction) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(16.dp), + ) { + Icon( + modifier = Modifier.size(if (title != null) 36.dp else 24.dp), + imageVector = icon, + contentDescription = null + ) + if (title != null) { + Column( + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(6.dp) ) { - Row { - tertiaryAction?.invoke() - } - Row(horizontalArrangement = Arrangement.spacedBy(4.dp)) { - if (onDismiss != null) { - TextButton(onClick = onDismiss) { - Text( - text = stringResource(id = R.string.dismiss), - color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary - ) - } - } - actions.invoke() - } + Text( + text = title, + style = MaterialTheme.typography.titleLarge, + color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary + ) + Text( + text = text, + style = MaterialTheme.typography.bodyMedium, + color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary + ) + } + } else { + Text( + modifier = Modifier.weight(1f), + text = text, + style = MaterialTheme.typography.bodyMedium, + color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary + ) + } + if (onDismiss != null) { + IconButton(onClick = onDismiss) { + Icon( + imageVector = Icons.Outlined.Close, + contentDescription = stringResource(R.string.close), + tint = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary + ) } } } } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun NotificationCardInstance( + isWarning: Boolean = false, + onClick: (() -> Unit)? = null, + content: (@Composable () -> Unit), +) { + if (onClick != null) { + Card( + onClick = { onClick }, + colors = CardDefaults.cardColors(containerColor = (if (isWarning) MaterialTheme.colorScheme.error else MaterialTheme.colorScheme.secondaryContainer)), + modifier = Modifier + .fillMaxWidth() + .padding(16.dp) + .clip(RoundedCornerShape(24.dp)) + ) { + content.invoke() + } + } else { + Card( + colors = CardDefaults.cardColors(containerColor = (if (isWarning) MaterialTheme.colorScheme.error else MaterialTheme.colorScheme.secondaryContainer)), + modifier = Modifier + .fillMaxWidth() + .padding(16.dp) + .clip(RoundedCornerShape(24.dp)) + ) { + content.invoke() + } + } } \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screen/SettingsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screen/SettingsScreen.kt index db3a20be8a..df2fd419c4 100644 --- a/app/src/main/java/app/revanced/manager/ui/screen/SettingsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screen/SettingsScreen.kt @@ -10,7 +10,9 @@ import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll @@ -158,19 +160,12 @@ fun SettingsScreen( isWarning = true, icon = Icons.Default.BatteryAlert, text = stringResource(R.string.battery_optimization_notification), - actions = { - TextButton(onClick = { - context.startActivity(Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).apply { - data = Uri.parse("package:${context.packageName}") - }) - showBatteryButton = - !pm.isIgnoringBatteryOptimizations(context.packageName) - }) { - Text( - text = stringResource(id = R.string.disable_battery_optimization), - color = MaterialTheme.colorScheme.onError - ) - } + primaryAction = { + context.startActivity(Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).apply { + data = Uri.parse("package:${context.packageName}") + }) + showBatteryButton = + !pm.isIgnoringBatteryOptimizations(context.packageName) } ) } From 04b34438eab115f82d777ef8d2dbc70c41ce6d12 Mon Sep 17 00:00:00 2001 From: Ushie Date: Tue, 24 Oct 2023 17:34:16 +0300 Subject: [PATCH 3/7] refactor: use notification card for update notification --- .../settings/update/UpdatesSettingsScreen.kt | 43 +++---------------- 1 file changed, 5 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screen/settings/update/UpdatesSettingsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screen/settings/update/UpdatesSettingsScreen.kt index 18b9fc9750..35bb1b34c8 100644 --- a/app/src/main/java/app/revanced/manager/ui/screen/settings/update/UpdatesSettingsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screen/settings/update/UpdatesSettingsScreen.kt @@ -1,33 +1,26 @@ package app.revanced.manager.ui.screen.settings.update -import androidx.compose.foundation.background import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Update import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon import androidx.compose.material3.ListItem import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import app.revanced.manager.R import app.revanced.manager.ui.component.AppTopBar +import app.revanced.manager.ui.component.NotificationCard @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -69,8 +62,10 @@ fun UpdatesSettingsScreen( .padding(paddingValues) .verticalScroll(rememberScrollState()) ) { - UpdateNotification( - onClick = onUpdateClick + NotificationCard( + text = stringResource(R.string.update_notification), + icon = Icons.Default.Update, + primaryAction = onUpdateClick ) listItems.forEach { (title, description, onClick) -> @@ -96,32 +91,4 @@ fun UpdatesSettingsScreen( } } } -} - -@Composable -fun UpdateNotification( - onClick: () -> Unit -) { - Box( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp) - .clip(RoundedCornerShape(24.dp)) - .background(MaterialTheme.colorScheme.secondaryContainer) - .clickable { onClick() }, - ) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(16.dp) - ) { - Icon(imageVector = Icons.Default.Update, contentDescription = null) - Text( - text = stringResource(R.string.update_notification), - style = MaterialTheme.typography.bodyMedium - ) - } - } } \ No newline at end of file From 5944acfc2728ec4616136b30608834ce7fbe32b7 Mon Sep 17 00:00:00 2001 From: Ushie Date: Tue, 24 Oct 2023 18:01:43 +0300 Subject: [PATCH 4/7] feat: improve notification card colors --- .../manager/ui/component/NotificationCard.kt | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/component/NotificationCard.kt b/app/src/main/java/app/revanced/manager/ui/component/NotificationCard.kt index 0069936972..7806eeb648 100644 --- a/app/src/main/java/app/revanced/manager/ui/component/NotificationCard.kt +++ b/app/src/main/java/app/revanced/manager/ui/component/NotificationCard.kt @@ -42,7 +42,8 @@ fun NotificationCard( Icon( modifier = Modifier.size(36.dp), imageVector = icon, - contentDescription = null + contentDescription = null, + tint = if (isWarning) MaterialTheme.colorScheme.onErrorContainer else MaterialTheme.colorScheme.onPrimaryContainer ) Column( verticalArrangement = Arrangement.spacedBy(6.dp) @@ -50,12 +51,12 @@ fun NotificationCard( Text( text = title, style = MaterialTheme.typography.titleLarge, - color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary + color = if (isWarning) MaterialTheme.colorScheme.onErrorContainer else MaterialTheme.colorScheme.onPrimaryContainer ) Text( text = text, style = MaterialTheme.typography.bodyMedium, - color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary + color = if (isWarning) MaterialTheme.colorScheme.onErrorContainer else MaterialTheme.colorScheme.onPrimaryContainer ) } } else { @@ -63,16 +64,16 @@ fun NotificationCard( Icon( modifier = Modifier.size(24.dp), imageVector = icon, - contentDescription = null + contentDescription = null, + tint = if (isWarning) MaterialTheme.colorScheme.onErrorContainer else MaterialTheme.colorScheme.onPrimaryContainer ) Text( text = text, style = MaterialTheme.typography.bodyMedium, - color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary + color = if (isWarning) MaterialTheme.colorScheme.onErrorContainer else MaterialTheme.colorScheme.onPrimaryContainer ) } } - actions?.invoke() } } @@ -98,7 +99,8 @@ fun NotificationCard( Icon( modifier = Modifier.size(if (title != null) 36.dp else 24.dp), imageVector = icon, - contentDescription = null + contentDescription = null, + tint = if (isWarning) MaterialTheme.colorScheme.onErrorContainer else MaterialTheme.colorScheme.onPrimaryContainer ) if (title != null) { Column( @@ -108,12 +110,12 @@ fun NotificationCard( Text( text = title, style = MaterialTheme.typography.titleLarge, - color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary + color = if (isWarning) MaterialTheme.colorScheme.onErrorContainer else MaterialTheme.colorScheme.onPrimaryContainer ) Text( text = text, style = MaterialTheme.typography.bodyMedium, - color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary + color = if (isWarning) MaterialTheme.colorScheme.onErrorContainer else MaterialTheme.colorScheme.onPrimaryContainer ) } } else { @@ -121,7 +123,7 @@ fun NotificationCard( modifier = Modifier.weight(1f), text = text, style = MaterialTheme.typography.bodyMedium, - color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary + color = if (isWarning) MaterialTheme.colorScheme.onErrorContainer else MaterialTheme.colorScheme.onPrimaryContainer ) } if (onDismiss != null) { @@ -129,7 +131,7 @@ fun NotificationCard( Icon( imageVector = Icons.Outlined.Close, contentDescription = stringResource(R.string.close), - tint = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.primary + tint = if (isWarning) MaterialTheme.colorScheme.onErrorContainer else MaterialTheme.colorScheme.onPrimaryContainer ) } } @@ -147,7 +149,7 @@ private fun NotificationCardInstance( if (onClick != null) { Card( onClick = { onClick }, - colors = CardDefaults.cardColors(containerColor = (if (isWarning) MaterialTheme.colorScheme.error else MaterialTheme.colorScheme.secondaryContainer)), + colors = CardDefaults.cardColors(containerColor = (if (isWarning) MaterialTheme.colorScheme.errorContainer else MaterialTheme.colorScheme.primaryContainer)), modifier = Modifier .fillMaxWidth() .padding(16.dp) @@ -157,7 +159,7 @@ private fun NotificationCardInstance( } } else { Card( - colors = CardDefaults.cardColors(containerColor = (if (isWarning) MaterialTheme.colorScheme.error else MaterialTheme.colorScheme.secondaryContainer)), + colors = CardDefaults.cardColors(containerColor = (if (isWarning) MaterialTheme.colorScheme.errorContainer else MaterialTheme.colorScheme.primaryContainer)), modifier = Modifier .fillMaxWidth() .padding(16.dp) From 8b8ac99bbfd9fdfb0b78cb550550dde5c17cdd4c Mon Sep 17 00:00:00 2001 From: Ushie Date: Tue, 24 Oct 2023 20:00:30 +0300 Subject: [PATCH 5/7] fix(NotificationCard): primaryAction does nothing --- .../java/app/revanced/manager/ui/component/NotificationCard.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/app/revanced/manager/ui/component/NotificationCard.kt b/app/src/main/java/app/revanced/manager/ui/component/NotificationCard.kt index 7806eeb648..645343e234 100644 --- a/app/src/main/java/app/revanced/manager/ui/component/NotificationCard.kt +++ b/app/src/main/java/app/revanced/manager/ui/component/NotificationCard.kt @@ -148,7 +148,7 @@ private fun NotificationCardInstance( ) { if (onClick != null) { Card( - onClick = { onClick }, + onClick = onClick, colors = CardDefaults.cardColors(containerColor = (if (isWarning) MaterialTheme.colorScheme.errorContainer else MaterialTheme.colorScheme.primaryContainer)), modifier = Modifier .fillMaxWidth() From 9a7258fe04d32197413363c4c9378c8b0ed29fa8 Mon Sep 17 00:00:00 2001 From: Ushie Date: Tue, 24 Oct 2023 20:03:22 +0300 Subject: [PATCH 6/7] fix: cut off battery optimization string --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 51d864f73d..e224b94f6b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -274,7 +274,7 @@ Loading changelog Failed to download changelog: %s Check out the latest changes in this update - Battery optimization must be turned off in order for ReVanced Manager to work correctly. + Battery optimization must be turned off in order for ReVanced Manager to work correctly in the background. Click here to turn off. Installing update… Downloading update… Failed to download update: %s From fdb6d6c4a1e9fb83e22791e5b8e4544aff2dc367 Mon Sep 17 00:00:00 2001 From: Ushie Date: Wed, 1 Nov 2023 20:52:45 +0300 Subject: [PATCH 7/7] change colors back to error and onError --- .../manager/ui/component/NotificationCard.kt | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/component/NotificationCard.kt b/app/src/main/java/app/revanced/manager/ui/component/NotificationCard.kt index 645343e234..e5d5074bbf 100644 --- a/app/src/main/java/app/revanced/manager/ui/component/NotificationCard.kt +++ b/app/src/main/java/app/revanced/manager/ui/component/NotificationCard.kt @@ -43,7 +43,7 @@ fun NotificationCard( modifier = Modifier.size(36.dp), imageVector = icon, contentDescription = null, - tint = if (isWarning) MaterialTheme.colorScheme.onErrorContainer else MaterialTheme.colorScheme.onPrimaryContainer + tint = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.onPrimaryContainer ) Column( verticalArrangement = Arrangement.spacedBy(6.dp) @@ -51,12 +51,12 @@ fun NotificationCard( Text( text = title, style = MaterialTheme.typography.titleLarge, - color = if (isWarning) MaterialTheme.colorScheme.onErrorContainer else MaterialTheme.colorScheme.onPrimaryContainer + color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.onPrimaryContainer ) Text( text = text, style = MaterialTheme.typography.bodyMedium, - color = if (isWarning) MaterialTheme.colorScheme.onErrorContainer else MaterialTheme.colorScheme.onPrimaryContainer + color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.onPrimaryContainer ) } } else { @@ -65,12 +65,12 @@ fun NotificationCard( modifier = Modifier.size(24.dp), imageVector = icon, contentDescription = null, - tint = if (isWarning) MaterialTheme.colorScheme.onErrorContainer else MaterialTheme.colorScheme.onPrimaryContainer + tint = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.onPrimaryContainer ) Text( text = text, style = MaterialTheme.typography.bodyMedium, - color = if (isWarning) MaterialTheme.colorScheme.onErrorContainer else MaterialTheme.colorScheme.onPrimaryContainer + color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.onPrimaryContainer ) } } @@ -100,7 +100,7 @@ fun NotificationCard( modifier = Modifier.size(if (title != null) 36.dp else 24.dp), imageVector = icon, contentDescription = null, - tint = if (isWarning) MaterialTheme.colorScheme.onErrorContainer else MaterialTheme.colorScheme.onPrimaryContainer + tint = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.onPrimaryContainer ) if (title != null) { Column( @@ -110,12 +110,12 @@ fun NotificationCard( Text( text = title, style = MaterialTheme.typography.titleLarge, - color = if (isWarning) MaterialTheme.colorScheme.onErrorContainer else MaterialTheme.colorScheme.onPrimaryContainer + color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.onPrimaryContainer ) Text( text = text, style = MaterialTheme.typography.bodyMedium, - color = if (isWarning) MaterialTheme.colorScheme.onErrorContainer else MaterialTheme.colorScheme.onPrimaryContainer + color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.onPrimaryContainer ) } } else { @@ -123,7 +123,7 @@ fun NotificationCard( modifier = Modifier.weight(1f), text = text, style = MaterialTheme.typography.bodyMedium, - color = if (isWarning) MaterialTheme.colorScheme.onErrorContainer else MaterialTheme.colorScheme.onPrimaryContainer + color = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.onPrimaryContainer ) } if (onDismiss != null) { @@ -131,7 +131,7 @@ fun NotificationCard( Icon( imageVector = Icons.Outlined.Close, contentDescription = stringResource(R.string.close), - tint = if (isWarning) MaterialTheme.colorScheme.onErrorContainer else MaterialTheme.colorScheme.onPrimaryContainer + tint = if (isWarning) MaterialTheme.colorScheme.onError else MaterialTheme.colorScheme.onPrimaryContainer ) } } @@ -149,7 +149,7 @@ private fun NotificationCardInstance( if (onClick != null) { Card( onClick = onClick, - colors = CardDefaults.cardColors(containerColor = (if (isWarning) MaterialTheme.colorScheme.errorContainer else MaterialTheme.colorScheme.primaryContainer)), + colors = CardDefaults.cardColors(containerColor = (if (isWarning) MaterialTheme.colorScheme.error else MaterialTheme.colorScheme.primaryContainer)), modifier = Modifier .fillMaxWidth() .padding(16.dp) @@ -159,7 +159,7 @@ private fun NotificationCardInstance( } } else { Card( - colors = CardDefaults.cardColors(containerColor = (if (isWarning) MaterialTheme.colorScheme.errorContainer else MaterialTheme.colorScheme.primaryContainer)), + colors = CardDefaults.cardColors(containerColor = (if (isWarning) MaterialTheme.colorScheme.error else MaterialTheme.colorScheme.primaryContainer)), modifier = Modifier .fillMaxWidth() .padding(16.dp)