diff --git a/app/build.gradle b/app/build.gradle index e09b972e..3105c31d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,7 +6,7 @@ plugins { android { namespace 'com.greenart7c3.nostrsigner' - compileSdk 34 + compileSdk 33 defaultConfig { applicationId "com.greenart7c3.nostrsigner" @@ -81,7 +81,7 @@ dependencies { // Observe Live data as State implementation "androidx.compose.runtime:runtime-livedata:$compose_ui_version" - implementation "androidx.compose.material3:material3:$material_3" + implementation "androidx.compose.material:material:$compose_ui_version" implementation "androidx.compose.material:material-icons-extended:$compose_ui_version" implementation 'androidx.appcompat:appcompat:1.6.1' @@ -113,7 +113,7 @@ dependencies { // Markdown (With fix for full-image bleeds) implementation('com.github.vitorpamplona.compose-richtext:richtext-ui:a0954aba63') - implementation('com.github.vitorpamplona.compose-richtext:richtext-ui-material3:a0954aba63') + implementation('com.github.vitorpamplona.compose-richtext:richtext-ui-material:a0954aba63') implementation('com.github.vitorpamplona.compose-richtext:richtext-commonmark:a0954aba63') // Biometrics diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/MainActivity.kt b/app/src/main/java/com/greenart7c3/nostrsigner/MainActivity.kt index d589df70..523f8779 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/MainActivity.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/MainActivity.kt @@ -5,8 +5,8 @@ import android.util.Log import androidx.activity.compose.setContent import androidx.appcompat.app.AppCompatActivity import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Surface +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Surface import androidx.compose.ui.Modifier import androidx.lifecycle.viewmodel.compose.viewModel import com.greenart7c3.nostrsigner.ui.AccountScreen @@ -26,7 +26,7 @@ class MainActivity : AppCompatActivity() { NostrSignerTheme { Surface( modifier = Modifier.fillMaxSize(), - color = MaterialTheme.colorScheme.background + color = MaterialTheme.colors.background ) { val accountStateViewModel: AccountStateViewModel = viewModel { AccountStateViewModel() diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/AccountScreen.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/AccountScreen.kt index ac0cebf2..327cbe55 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/AccountScreen.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/AccountScreen.kt @@ -20,8 +20,7 @@ fun AccountScreen( Column { Crossfade( targetState = accountState, - animationSpec = tween(durationMillis = 100), - label = "" + animationSpec = tween(durationMillis = 100) ) { state -> when (state) { is AccountState.LoggedOff -> { diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/LoginScreen.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/LoginScreen.kt index 37df994b..ac272be4 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/LoginScreen.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/LoginScreen.kt @@ -12,19 +12,21 @@ import androidx.compose.foundation.layout.height 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.text.ClickableText import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll +import androidx.compose.material.Button +import androidx.compose.material.ButtonDefaults +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.material.MaterialTheme +import androidx.compose.material.OutlinedTextField +import androidx.compose.material.Text import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Visibility import androidx.compose.material.icons.outlined.VisibilityOff -import androidx.compose.material3.Button -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.OutlinedTextField -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -53,6 +55,8 @@ import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.unit.dp import com.greenart7c3.nostrsigner.R import com.greenart7c3.nostrsigner.ui.theme.Font14SP +import com.greenart7c3.nostrsigner.ui.theme.Size35dp +import com.greenart7c3.nostrsigner.ui.theme.placeholderText @OptIn(ExperimentalComposeUiApi::class) @Composable @@ -118,7 +122,8 @@ fun LoginPage( ), placeholder = { Text( - text = "nsec.." + text = "nsec..", + color = MaterialTheme.colors.placeholderText ) }, trailingIcon = { @@ -149,7 +154,7 @@ fun LoginPage( painter = painterResource(R.drawable.ic_qrcode), null, modifier = Modifier.size(24.dp), - tint = MaterialTheme.colorScheme.primary + tint = MaterialTheme.colors.primary ) } }, @@ -167,8 +172,8 @@ fun LoginPage( if (errorMessage.isNotBlank()) { Text( text = errorMessage, - color = MaterialTheme.colorScheme.error, - style = MaterialTheme.typography.bodySmall + color = MaterialTheme.colors.error, + style = MaterialTheme.typography.caption ) } @@ -190,9 +195,14 @@ fun LoginPage( } } }, + shape = RoundedCornerShape(Size35dp), modifier = Modifier .fillMaxWidth() - .height(50.dp) + .height(50.dp), + colors = ButtonDefaults + .buttonColors( + backgroundColor = MaterialTheme.colors.primary + ) ) { Text(text = "Login") } @@ -211,7 +221,7 @@ fun LoginPage( style = TextStyle( fontSize = Font14SP, textDecoration = TextDecoration.Underline, - color = MaterialTheme.colorScheme.primary, + color = MaterialTheme.colors.primary, textAlign = TextAlign.Center ) ) diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/MainScreen.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/MainScreen.kt index df1e54da..887ea26f 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/MainScreen.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/MainScreen.kt @@ -17,22 +17,21 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll +import androidx.compose.material.Button +import androidx.compose.material.Card +import androidx.compose.material.Divider +import androidx.compose.material.DrawerValue +import androidx.compose.material.Icon +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Scaffold +import androidx.compose.material.Text import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.AccessTime import androidx.compose.material.icons.filled.CalendarMonth import androidx.compose.material.icons.filled.ContentPaste import androidx.compose.material.icons.filled.Person -import androidx.compose.material3.Button -import androidx.compose.material3.Card -import androidx.compose.material3.Divider -import androidx.compose.material3.DrawerValue -import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalDrawerSheet -import androidx.compose.material3.ModalNavigationDrawer -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.material3.rememberDrawerState +import androidx.compose.material.rememberDrawerState +import androidx.compose.material.rememberScaffoldState import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -64,99 +63,94 @@ import com.greenart7c3.nostrsigner.service.model.Event import com.greenart7c3.nostrsigner.service.toShortenHex import com.greenart7c3.nostrsigner.ui.components.Drawer import com.greenart7c3.nostrsigner.ui.components.MainAppBar +import com.greenart7c3.nostrsigner.ui.theme.ButtonBorder import com.greenart7c3.nostrsigner.ui.theme.NostrSignerTheme import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import org.json.JSONObject @OptIn(ExperimentalStdlibApi::class) -@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") +@SuppressLint("UnusedMaterialScaffoldPaddingParameter") @Composable fun MainScreen(account: Account, accountStateViewModel: AccountStateViewModel, json: IntentData?, packageName: String?) { - val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed) - + val scaffoldState = rememberScaffoldState(rememberDrawerState(DrawerValue.Closed)) val coroutineScope = rememberCoroutineScope() val context = LocalContext.current val clipboardManager = LocalClipboardManager.current - ModalNavigationDrawer( - drawerState = drawerState, + Scaffold( + scaffoldState = scaffoldState, drawerContent = { - ModalDrawerSheet { - Drawer( - accountStateViewModel = accountStateViewModel, - account = account, - drawerState = drawerState - ) - } + Drawer( + accountStateViewModel = accountStateViewModel, + account = account, + scaffoldState = scaffoldState + ) + }, + topBar = { + MainAppBar( + scaffoldState, + accountStateViewModel, + account + ) } ) { - Scaffold( - topBar = { - MainAppBar( - drawerState, - accountStateViewModel, - account - ) + if (json == null) { + Column( + Modifier.fillMaxSize(), + Arrangement.Center, + Alignment.CenterHorizontally + ) { + Text("No event to sign") } - ) { - if (json == null) { - Column( - Modifier.fillMaxSize(), - Arrangement.Center, - Alignment.CenterHorizontally - ) { - Text("No event to sign") - } - } else { - json.let { - val event = it.data - - EventData( - packageName ?: it.name, - event, - event.toJson(), - coroutineScope, - clipboardManager, - context, - { - if (event.pubKey != account.keyPair.pubKey.toHexKey()) { - coroutineScope.launch { - Toast.makeText( - context, - context.getString(R.string.event_pubkey_is_not_equal_to_current_logged_in_user), - Toast.LENGTH_SHORT - ).show() - } - return@EventData - } - - val id = event.id.hexToByteArray() - val sig = CryptoUtils.sign(id, account.keyPair.privKey).toHexKey() - - clipboardManager.setText(AnnotatedString(sig)) + } else { + json.let { + val event = it.data + EventData( + packageName ?: it.name, + event, + event.toJson(), + coroutineScope, + clipboardManager, + context, + { + if (event.pubKey != account.keyPair.pubKey.toHexKey()) { coroutineScope.launch { - val activity = context.getAppCompatActivity() - if (packageName != null) { - val intent = Intent() - intent.putExtra("signature", sig) - activity?.setResult(RESULT_OK, intent) - } else { - Toast.makeText( - context, - context.getString(R.string.signature_copied_to_the_clipboard), - Toast.LENGTH_SHORT - ).show() - } - activity?.finish() + Toast.makeText( + context, + context.getString(R.string.event_pubkey_is_not_equal_to_current_logged_in_user), + Toast.LENGTH_SHORT + ).show() } - }, - { - context.getAppCompatActivity()?.finish() + return@EventData } - ) - } + + val id = event.id.hexToByteArray() + val sig = CryptoUtils.sign(id, account.keyPair.privKey).toHexKey() + + clipboardManager.setText(AnnotatedString(sig)) + + coroutineScope.launch { + val activity = context.getAppCompatActivity() + if (packageName != null) { + val intent = Intent() + intent.putExtra("signature", sig) + activity?.setResult(RESULT_OK, intent) + } else { + Toast.makeText( + context, + context.getString(R.string.signature_copied_to_the_clipboard), + Toast.LENGTH_SHORT + ).show() + } + activity?.finish() + } + }, + { + context.getAppCompatActivity()?.finish() + } + ) } } } @@ -186,7 +180,6 @@ fun EventData( Modifier .fillMaxSize() .padding(8.dp) - .verticalScroll(scroll) ) { Text( modifier = Modifier.fillMaxWidth(), @@ -242,6 +235,7 @@ fun EventData( contentAlignment = Alignment.Center ) { Button( + shape = ButtonBorder, onClick = { showMore = !showMore } @@ -251,7 +245,10 @@ fun EventData( } if (showMore) { Text( - modifier = Modifier.padding(5.dp), + modifier = Modifier + .weight(1f) + .padding(5.dp) + .verticalScroll(rememberScrollState()), text = JSONObject(rawJson).toString(2) ) Row( @@ -259,6 +256,7 @@ fun EventData( horizontalArrangement = Arrangement.Center ) { Button( + shape = ButtonBorder, onClick = { clipboardManager.setText(AnnotatedString(rawJson)) @@ -274,27 +272,9 @@ fun EventData( Text("Copy raw json") } } + } else { + Spacer(modifier = Modifier.weight(1f)) } - Spacer(modifier = Modifier.weight(1f)) -// Row( -// horizontalArrangement = Arrangement.SpaceBetween, -// verticalAlignment = Alignment.CenterVertically, -// modifier = Modifier -// .clickable { -// checked = !checked -// } -// ) { -// Text( -// modifier = Modifier.weight(1f), -// text = "Remember my choice and don't ask again" -// ) -// Switch( -// checked = checked, -// onCheckedChange = { -// checked = !checked -// } -// ) -// } Row( Modifier @@ -303,12 +283,14 @@ fun EventData( Arrangement.Center ) { Button( + shape = ButtonBorder, onClick = onReject ) { Text("Reject") } Spacer(modifier = Modifier.width(8.dp)) Button( + shape = ButtonBorder, onClick = onAccept ) { Text("Accept") @@ -335,7 +317,7 @@ fun EventRow( Icon( icon, null, - tint = MaterialTheme.colorScheme.onBackground + tint = MaterialTheme.colors.onBackground ) Text( modifier = Modifier.padding(start = 8.dp), @@ -352,7 +334,7 @@ fun EventRow( } } -@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") +@SuppressLint("UnusedMaterialScaffoldPaddingParameter") @Preview(device = "id:Nexus S") @Composable fun Preview() { diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/QrCodeDrawer.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/QrCodeDrawer.kt index 60273ce8..70cd2b53 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/QrCodeDrawer.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/QrCodeDrawer.kt @@ -6,7 +6,7 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.defaultMinSize import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material3.MaterialTheme +import androidx.compose.material.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier @@ -34,13 +34,13 @@ fun QrCodeDrawer(contents: String, modifier: Modifier = Modifier) { createQrCode(contents = contents) } - val foregroundColor = MaterialTheme.colorScheme.onSurface + val foregroundColor = MaterialTheme.colors.onSurface Box( modifier = modifier .defaultMinSize(48.dp, 48.dp) .aspectRatio(1f) - .background(MaterialTheme.colorScheme.background) + .background(MaterialTheme.colors.background) ) { Canvas(modifier = Modifier.fillMaxSize()) { // Calculate the height and width of each column/row diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/ShowQRDialog.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/ShowQRDialog.kt index 0bc8ddd6..3a589750 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/ShowQRDialog.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/ShowQRDialog.kt @@ -7,8 +7,8 @@ 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.material3.MaterialTheme -import androidx.compose.material3.Surface +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Surface import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -29,7 +29,7 @@ fun ShowQRDialog(account: Account, onClose: () -> Unit) { Surface(modifier = Modifier.fillMaxSize()) { Column( modifier = Modifier - .background(MaterialTheme.colorScheme.background) + .background(MaterialTheme.colors.background) .fillMaxSize() ) { Row( diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/actions/AccountBackupDialog.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/actions/AccountBackupDialog.kt index fcf65bb3..20f3b0a4 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/actions/AccountBackupDialog.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/actions/AccountBackupDialog.kt @@ -16,15 +16,14 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width +import androidx.compose.material.Button +import androidx.compose.material.ButtonDefaults +import androidx.compose.material.Icon +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Surface +import androidx.compose.material.Text import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Key -import androidx.compose.material3.Button -import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Surface -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment @@ -43,8 +42,11 @@ import com.greenart7c3.nostrsigner.service.Biometrics import com.greenart7c3.nostrsigner.service.toNpub import com.greenart7c3.nostrsigner.service.toNsec import com.greenart7c3.nostrsigner.ui.components.CloseButton +import com.greenart7c3.nostrsigner.ui.theme.ButtonBorder import com.halilibo.richtext.markdown.Markdown -import com.halilibo.richtext.ui.material3.Material3RichText +import com.halilibo.richtext.ui.RichTextStyle +import com.halilibo.richtext.ui.material.MaterialRichText +import com.halilibo.richtext.ui.resolveDefaults import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -57,7 +59,7 @@ fun AccountBackupDialog(account: Account, onClose: () -> Unit) { Surface(modifier = Modifier.fillMaxSize()) { Column( modifier = Modifier - .background(MaterialTheme.colorScheme.background) + .background(MaterialTheme.colors.background) .fillMaxSize() ) { Row( @@ -77,7 +79,9 @@ fun AccountBackupDialog(account: Account, onClose: () -> Unit) { horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { - Material3RichText { + MaterialRichText( + style = RichTextStyle().resolveDefaults() + ) { Markdown( content = stringResource(R.string.account_backup_tips_md) ) @@ -120,15 +124,19 @@ private fun NSecCopyButton( copyNSec(context, scope, account, clipboardManager) } }, + shape = ButtonBorder, + colors = ButtonDefaults.buttonColors( + backgroundColor = MaterialTheme.colors.primary + ), contentPadding = PaddingValues(vertical = 6.dp, horizontal = 16.dp) ) { Icon( + tint = MaterialTheme.colors.onPrimary, imageVector = Icons.Default.Key, contentDescription = stringResource(R.string.copies_the_nsec_id_your_password_to_the_clipboard_for_backup), - Modifier.size(18.dp) + modifier = Modifier.padding(end = 5.dp) ) - Spacer(modifier = Modifier.width(8.dp)) - Text(stringResource(id = R.string.copy_my_secret_key)) + Text(stringResource(id = R.string.copy_my_secret_key), color = MaterialTheme.colors.onPrimary) } } @@ -152,16 +160,21 @@ private fun NPubCopyButton( ).show() } }, + shape = ButtonBorder, + colors = ButtonDefaults.buttonColors( + backgroundColor = MaterialTheme.colors.primary + ), contentPadding = PaddingValues(vertical = 6.dp, horizontal = 16.dp) ) { Icon( + tint = MaterialTheme.colors.onPrimary, imageVector = Icons.Default.Key, contentDescription = stringResource(R.string.copies_the_npub_id_your_user_to_the_clipboard_for_backup), - Modifier.size(18.dp) + modifier = Modifier.padding(end = 5.dp) ) - Spacer(modifier = Modifier.width(8.dp)) Text( - stringResource(R.string.copy_my_public_key) + stringResource(R.string.copy_my_public_key), + color = MaterialTheme.colors.onPrimary ) } } diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/CloseButton.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/CloseButton.kt index 775b68e8..79478b85 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/CloseButton.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/CloseButton.kt @@ -1,14 +1,22 @@ package com.greenart7c3.nostrsigner.ui.components -import androidx.compose.material3.Button +import androidx.compose.material.Button +import androidx.compose.material.ButtonDefaults import androidx.compose.runtime.Composable +import androidx.compose.ui.graphics.Color +import com.greenart7c3.nostrsigner.ui.theme.ButtonBorder @Composable fun CloseButton(onCancel: () -> Unit) { Button( onClick = { onCancel() - } + }, + shape = ButtonBorder, + colors = ButtonDefaults + .buttonColors( + backgroundColor = Color.Gray + ) ) { CloseIcon() } diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/CloseIcon.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/CloseIcon.kt index ce533fd0..0f3239b3 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/CloseIcon.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/CloseIcon.kt @@ -1,8 +1,8 @@ package com.greenart7c3.nostrsigner.ui.components +import androidx.compose.material.Icon import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Cancel -import androidx.compose.material3.Icon import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color import com.greenart7c3.nostrsigner.ui.theme.Size20Modifier diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/Drawer.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/Drawer.kt index 7619c5e2..213448ed 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/Drawer.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/Drawer.kt @@ -7,18 +7,18 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.material.AlertDialog +import androidx.compose.material.Divider +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.material.MaterialTheme +import androidx.compose.material.ScaffoldState +import androidx.compose.material.Surface +import androidx.compose.material.Text +import androidx.compose.material.TextButton import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Key import androidx.compose.material.icons.filled.QrCode -import androidx.compose.material3.AlertDialog -import androidx.compose.material3.Divider -import androidx.compose.material3.DrawerState -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Surface -import androidx.compose.material3.Text -import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -42,7 +42,7 @@ import kotlinx.coroutines.launch fun Drawer( accountStateViewModel: AccountStateViewModel, account: Account, - drawerState: DrawerState + scaffoldState: ScaffoldState ) { var logoutDialog by remember { mutableStateOf(false) } var backupDialogOpen by remember { mutableStateOf(false) } @@ -83,34 +83,34 @@ fun Drawer( Surface( modifier = Modifier.fillMaxWidth(), - color = MaterialTheme.colorScheme.background + color = MaterialTheme.colors.background ) { Column { Spacer(modifier = Modifier.weight(1f)) IconRow( title = "Backup Keys", icon = Icons.Default.Key, - tint = MaterialTheme.colorScheme.onBackground, + tint = MaterialTheme.colors.onBackground, onClick = { scope.launch { - drawerState.close() + scaffoldState.drawerState.close() } backupDialogOpen = true } ) - BottomContent(account, drawerState) + BottomContent(account, scaffoldState) } } if (backupDialogOpen) { AccountBackupDialog(account, onClose = { backupDialogOpen = false }) } - BackHandler(enabled = drawerState.isOpen) { - scope.launch { drawerState.close() } + BackHandler(enabled = scaffoldState.drawerState.isOpen) { + scope.launch { scaffoldState.drawerState.close() } } } @Composable -fun BottomContent(account: Account, drawerState: DrawerState) { +fun BottomContent(account: Account, scaffoldState: ScaffoldState) { val coroutineScope = rememberCoroutineScope() // store the dialog open or close state @@ -140,14 +140,14 @@ fun BottomContent(account: Account, drawerState: DrawerState) { IconButton(onClick = { dialogOpen = true coroutineScope.launch { - drawerState.close() + scaffoldState.drawerState.close() } }) { Icon( Icons.Default.QrCode, null, modifier = Modifier.size(24.dp), - tint = MaterialTheme.colorScheme.primary + tint = MaterialTheme.colors.primary ) } } diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/IconRow.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/IconRow.kt index 14f0835b..b0fee5f0 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/IconRow.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/IconRow.kt @@ -3,13 +3,11 @@ package com.greenart7c3.nostrsigner.ui.components import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width -import androidx.compose.material3.Icon -import androidx.compose.material3.Text +import androidx.compose.material.Icon +import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -38,11 +36,11 @@ fun IconRow(title: String, icon: ImageVector, tint: Color, onClick: () -> Unit, Icon( icon, null, - modifier = Modifier.size(18.dp), + modifier = Modifier.size(22.dp), tint = tint ) - Spacer(modifier = Modifier.width(8.dp)) Text( + modifier = Modifier.padding(start = 16.dp), text = title, fontSize = 18.sp ) diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/PostButton.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/PostButton.kt index d260d0b3..011bb523 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/PostButton.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/PostButton.kt @@ -1,12 +1,15 @@ package com.greenart7c3.nostrsigner.ui.components import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.material3.Button -import androidx.compose.material3.Text +import androidx.compose.material.Button +import androidx.compose.material.ButtonDefaults +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp +import com.greenart7c3.nostrsigner.ui.theme.ButtonBorder @Composable fun PostButton(modifier: Modifier = Modifier, onPost: () -> Unit = {}, isActive: Boolean) { @@ -17,6 +20,11 @@ fun PostButton(modifier: Modifier = Modifier, onPost: () -> Unit = {}, isActive: onPost() } }, + shape = ButtonBorder, + colors = ButtonDefaults + .buttonColors( + backgroundColor = if (isActive) MaterialTheme.colors.primary else Color.Gray + ), contentPadding = PaddingValues(0.dp) ) { Text(text = "Post", color = Color.White) diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/TopAppBar.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/TopAppBar.kt index cf11b640..78dde14f 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/TopAppBar.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/components/TopAppBar.kt @@ -1,31 +1,31 @@ package com.greenart7c3.nostrsigner.ui.components +import androidx.compose.material.AlertDialog +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.material.MaterialTheme +import androidx.compose.material.ScaffoldState +import androidx.compose.material.Text +import androidx.compose.material.TextButton +import androidx.compose.material.TopAppBar import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Logout import androidx.compose.material.icons.filled.Menu -import androidx.compose.material3.AlertDialog -import androidx.compose.material3.DrawerState -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.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp import com.greenart7c3.nostrsigner.models.Account import com.greenart7c3.nostrsigner.service.toNpub import com.greenart7c3.nostrsigner.ui.AccountStateViewModel import kotlinx.coroutines.launch -@OptIn(ExperimentalMaterial3Api::class) @Composable -fun MainAppBar(drawerState: DrawerState, accountStateViewModel: AccountStateViewModel, account: Account) { +fun MainAppBar(scaffoldState: ScaffoldState, accountStateViewModel: AccountStateViewModel, account: Account) { val scope = rememberCoroutineScope() TopAppBar( title = { Text(text = "Amber") }, @@ -33,14 +33,14 @@ fun MainAppBar(drawerState: DrawerState, accountStateViewModel: AccountStateView IconButton( onClick = { scope.launch { - drawerState.open() + scaffoldState.drawerState.open() } } ) { Icon( imageVector = Icons.Default.Menu, contentDescription = null, - tint = MaterialTheme.colorScheme.onSurface + tint = MaterialTheme.colors.onSurface ) } }, @@ -49,7 +49,9 @@ fun MainAppBar(drawerState: DrawerState, accountStateViewModel: AccountStateView accountStateViewModel = accountStateViewModel, account = account ) - } + }, + backgroundColor = Color.Transparent, + elevation = 0.dp ) } @@ -96,7 +98,7 @@ fun LogoutButton(accountStateViewModel: AccountStateViewModel, account: Account) Icon( imageVector = Icons.Default.Logout, contentDescription = null, - tint = MaterialTheme.colorScheme.onSurface + tint = MaterialTheme.colors.onSurface ) } } diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/theme/Theme.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/theme/Theme.kt index 460e40c3..47cdc201 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/theme/Theme.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/theme/Theme.kt @@ -3,9 +3,12 @@ package com.greenart7c3.nostrsigner.ui.theme import android.app.Activity import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.size -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.darkColorScheme -import androidx.compose.material3.lightColorScheme +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Colors +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Shapes +import androidx.compose.material.darkColors +import androidx.compose.material.lightColors import androidx.compose.runtime.Composable import androidx.compose.runtime.SideEffect import androidx.compose.ui.Modifier @@ -15,52 +18,55 @@ import androidx.compose.ui.platform.LocalView import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +val Shapes = Shapes( + small = RoundedCornerShape(4.dp), + medium = RoundedCornerShape(4.dp), + large = RoundedCornerShape(0.dp) +) + val Font14SP = 14.sp val Size35dp = 35.dp -val Purple80 = Color(0xFFD0BCFF) -val PurpleGrey80 = Color(0xFFCCC2DC) -val Pink80 = Color(0xFFEFB8C8) - -val Purple40 = Color(0xFF6650a4) -val PurpleGrey40 = Color(0xFF625b71) -val Pink40 = Color(0xFF7D5260) +val Purple200 = Color(0xFFBB86FC) +val Purple500 = Color(0xFF6200EE) +val Purple700 = Color(0xFF3700B3) +val Teal200 = Color(0xFF03DAC5) +val ButtonBorder = RoundedCornerShape(20.dp) val Size20Modifier = Modifier.size(20.dp) -private val DarkColorScheme = darkColorScheme( - primary = Purple80, - secondary = PurpleGrey80, - tertiary = Pink80 +private val DarkColorPalette = darkColors( + primary = Purple200, + primaryVariant = Purple700, + secondary = Teal200, + secondaryVariant = Purple200 ) -private val LightColorScheme = lightColorScheme( - primary = Purple40, - secondary = PurpleGrey40, - tertiary = Pink40 - - /* Other default colors to override - background = Color(0xFFFFFBFE), - surface = Color(0xFFFFFBFE), - onPrimary = Color.White, - onSecondary = Color.White, - onTertiary = Color.White, - onBackground = Color(0xFF1C1B1F), - onSurface = Color(0xFF1C1B1F), - */ +private val LightColorPalette = lightColors( + primary = Purple500, + primaryVariant = Purple700, + secondary = Teal200, + secondaryVariant = Purple500 ) +private val DarkPlaceholderText = DarkColorPalette.onSurface.copy(alpha = 0.32f) +private val LightPlaceholderText = LightColorPalette.onSurface.copy(alpha = 0.32f) + +val Colors.placeholderText: Color + get() = if (isLight) LightPlaceholderText else DarkPlaceholderText + @Composable fun NostrSignerTheme( darkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit ) { - val colors = if (darkTheme) DarkColorScheme else LightColorScheme + val colors = if (darkTheme) DarkColorPalette else LightColorPalette MaterialTheme( - colorScheme = colors, + colors = colors, typography = Typography, + shapes = Shapes, content = content ) diff --git a/app/src/main/java/com/greenart7c3/nostrsigner/ui/theme/Type.kt b/app/src/main/java/com/greenart7c3/nostrsigner/ui/theme/Type.kt index 26eb7824..116d4aab 100644 --- a/app/src/main/java/com/greenart7c3/nostrsigner/ui/theme/Type.kt +++ b/app/src/main/java/com/greenart7c3/nostrsigner/ui/theme/Type.kt @@ -1,6 +1,6 @@ package com.greenart7c3.nostrsigner.ui.theme -import androidx.compose.material3.Typography +import androidx.compose.material.Typography import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight @@ -8,12 +8,10 @@ import androidx.compose.ui.unit.sp // Set of Material typography styles to start with val Typography = Typography( - bodyLarge = TextStyle( + body1 = TextStyle( fontFamily = FontFamily.Default, fontWeight = FontWeight.Normal, - fontSize = 16.sp, - lineHeight = 24.sp, - letterSpacing = 0.5.sp + fontSize = 16.sp ) /* Other default text styles to override titleLarge = TextStyle( diff --git a/build.gradle b/build.gradle index 26107bf5..971790eb 100644 --- a/build.gradle +++ b/build.gradle @@ -3,9 +3,8 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile buildscript { ext { lifecycle_version = '2.6.1' - compose_ui_version = '1.5.0' - nav_version = "2.7.0" - material_3 = "1.1.1" + compose_ui_version = '1.4.3' + nav_version = "2.6.0" } }