From 178f4d374910ea3af020ee06a4dbf27165d99ab3 Mon Sep 17 00:00:00 2001 From: yhs0602 Date: Mon, 2 Oct 2023 22:49:40 +0900 Subject: [PATCH] :bug: Make it compilable --- .../disassembler/ui/FileDrawer.kt | 6 +- .../kyhsgeekcode/disassembler/ui/MainPage.kt | 90 +++++++++------ .../kyhsgeekcode/disassembler/ui/MainTab.kt | 15 ++- .../com/kyhsgeekcode/disassembler/ui/Menus.kt | 108 +++++++++++------- .../disassembler/ui/OpenTabManager.kt | 13 ++- .../components/AutoCompleteTextFieldDialog.kt | 8 +- .../ui/components/DropDownList.kt | 13 ++- .../ui/components/HexTextField.kt | 4 +- .../disassembler/ui/components/HexView.kt | 11 +- .../ui/components/NumberTextField.kt | 4 +- .../disassembler/ui/components/TableView.kt | 17 ++- .../disassembler/ui/components/TreeView.kt | 2 +- .../disassembler/ui/tabs/BinaryTab.kt | 12 +- .../disassembler/ui/tabs/TextTab.kt | 2 +- 14 files changed, 191 insertions(+), 114 deletions(-) diff --git a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/FileDrawer.kt b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/FileDrawer.kt index 6c6b12e2..95fa36ca 100644 --- a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/FileDrawer.kt +++ b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/FileDrawer.kt @@ -8,11 +8,11 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.width import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material.Icon -import androidx.compose.material.IconButton -import androidx.compose.material.Text import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Refresh +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.ui.Modifier diff --git a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/MainPage.kt b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/MainPage.kt index be66953b..4cbf9575 100644 --- a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/MainPage.kt +++ b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/MainPage.kt @@ -5,6 +5,14 @@ import androidx.compose.foundation.clickable import androidx.compose.material.* import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Menu +import androidx.compose.material3.DrawerValue +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.ModalNavigationDrawer +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.rememberDrawerState import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.rememberCoroutineScope @@ -15,58 +23,64 @@ import com.kyhsgeekcode.disassembler.viewmodel.ShowSearchForStringsDialog import kotlinx.coroutines.launch +@OptIn(ExperimentalMaterial3Api::class) @ExperimentalFoundationApi @Composable fun MainScreen(viewModel: MainViewModel) { // val navController = rememberNavController() - val state = rememberScaffoldState() val scope = rememberCoroutineScope() - Scaffold( - scaffoldState = state, + val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed) + ModalNavigationDrawer( drawerContent = { FileDrawer(viewModel) }, - topBar = { - TopAppBar( - title = { Text(text = "Disassembler") }, - navigationIcon = { - Icon( - Icons.Default.Menu, - "", - modifier = Modifier.clickable(onClick = { - with(state.drawerState) { - scope.launch { - if (isOpen) { - close() - } else { - open() + ) { + Scaffold( + topBar = { + TopAppBar( + title = { Text(text = "Disassembler") }, + navigationIcon = { + Icon( + Icons.Default.Menu, + "", + modifier = Modifier.clickable(onClick = { + with(drawerState) { + scope.launch { + if (isOpen) { + close() + } else { + open() + } } } - } - }) - ) - }, - actions = { - ActivatedMenus(viewModel) + }) + ) + }, + actions = { + ActivatedMenus(viewModel) + } + ) + }, + content = { paddingValues -> + + val drawerState = rememberDrawerState(DrawerValue.Closed) + val scope = rememberCoroutineScope() + val openDrawer = { + scope.launch { + drawerState.open() + } } - ) - }, - content = { - val drawerState = rememberDrawerState(DrawerValue.Closed) - val scope = rememberCoroutineScope() - val openDrawer = { - scope.launch { - drawerState.open() + OpenedTabs(viewModel) + + val showSearchForStringsDialog = + viewModel.showSearchForStringsDialog.collectAsState() + if (showSearchForStringsDialog.value == ShowSearchForStringsDialog.Shown) { + SearchForStringsDialog(viewModel) } } - OpenedTabs(viewModel) + ) + } - val showSearchForStringsDialog = viewModel.showSearchForStringsDialog.collectAsState() - if (showSearchForStringsDialog.value == ShowSearchForStringsDialog.Shown) { - SearchForStringsDialog(viewModel) - } - } - ) } diff --git a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/MainTab.kt b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/MainTab.kt index d956b06e..75b47964 100644 --- a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/MainTab.kt +++ b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/MainTab.kt @@ -4,10 +4,15 @@ import android.app.Activity import android.content.Intent import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts -import androidx.compose.foundation.layout.* -import androidx.compose.material.AlertDialog -import androidx.compose.material.Button -import androidx.compose.material.Text +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.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.ui.Modifier @@ -62,7 +67,7 @@ fun ProjectOverview(viewModel: MainViewModel) { text = { Text("Copy?") }, - buttons = { + confirmButton = { Row( modifier = Modifier.padding(all = 8.dp), horizontalArrangement = Arrangement.Center diff --git a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/Menus.kt b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/Menus.kt index fbb80233..5888ff1f 100644 --- a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/Menus.kt +++ b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/Menus.kt @@ -1,13 +1,26 @@ package com.kyhsgeekcode.disassembler.ui import android.content.Intent -import android.widget.Toast -import androidx.compose.material.* import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.* -import androidx.compose.runtime.* +import androidx.compose.material.icons.filled.AddCircle +import androidx.compose.material.icons.filled.Build +import androidx.compose.material.icons.filled.CheckCircle +import androidx.compose.material.icons.filled.Close +import androidx.compose.material.icons.filled.Edit +import androidx.compose.material.icons.filled.Info +import androidx.compose.material.icons.filled.MoreVert +import androidx.compose.material.icons.filled.Settings +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.platform.LocalContext -import com.kyhsgeekcode.disassembler.Calc.Calculator import com.kyhsgeekcode.disassembler.preference.SettingsActivity import com.kyhsgeekcode.disassembler.ui.tabs.BinaryTabData import com.kyhsgeekcode.disassembler.viewmodel.MainViewModel @@ -29,31 +42,35 @@ fun ActivatedMenus(viewModel: MainViewModel) { DropdownMenuItem(onClick = { viewModel.openAsHex() showMenu = false - }) { + }, leadingIcon = { Icon(imageVector = Icons.Filled.Edit, contentDescription = "Open with hex viewer") + }, text = { Text("Open with hex viewer") - } + }) DropdownMenuItem(onClick = { viewModel.searchForStrings() showMenu = false - }) { + }, leadingIcon = { Icon(imageVector = Icons.Filled.Build, contentDescription = "Search for strings") - Text("Search for strings") - } - DropdownMenuItem(onClick = { - viewModel.analyze() - showMenu = false - }) { - Icon(imageVector = Icons.Filled.Info, contentDescription = "Analyze") - Text("Analyze") - } + }, text = { Text("Search for strings") } + ) + DropdownMenuItem( + onClick = { + viewModel.analyze() + showMenu = false + }, + leadingIcon = { Icon(imageVector = Icons.Filled.Info, contentDescription = "Analyze") }, + text = { Text("Analyze") } + ) DropdownMenuItem(onClick = { viewModel.closeCurrentFile() showMenu = false - }) { - Icon(imageVector = Icons.Filled.Close, contentDescription = "Close File") - Text("Close File") - } + }, + leadingIcon = { + Icon(imageVector = Icons.Filled.Close, contentDescription = "Close File") + }, + text = { Text("Close File") } + ) if (viewModel.isBinaryTab()) { BinaryMenuItems(viewModel.getCurrentTabData() as BinaryTabData) { showMenu = false @@ -66,10 +83,12 @@ fun ActivatedMenus(viewModel: MainViewModel) { DropdownMenuItem(onClick = { showMenu = false context.startActivity(Intent(context, SettingsActivity::class.java)) - }) { - Icon(imageVector = Icons.Filled.Settings, contentDescription = "Settings / Help") - Text("Settings / Help") - } + }, + leadingIcon = { + Icon(imageVector = Icons.Filled.Settings, contentDescription = "Settings / Help") + }, + text = { Text("Settings / Help") } + ) } } @@ -81,21 +100,32 @@ fun BinaryMenuItems(binaryTabData: BinaryTabData, dismiss: () -> Unit) { // Icon(imageVector = Icons.Filled.Delete, contentDescription = "Close Tab") // Text("Close Tab") // } - DropdownMenuItem(onClick = { - dismiss() - binaryTabData.jumpto() - }) { - Icon(imageVector = Icons.Filled.Navigation, contentDescription = "Jump to") - Text("Jump to") - } - if (binaryTabData.isDisasmTab()) { - DropdownMenuItem(onClick = { + DropdownMenuItem( + onClick = { dismiss() - binaryTabData.chooseColumns() - }) { - Icon(imageVector = Icons.Filled.CheckBox, contentDescription = "Choose columns") - Text("Choose columns") - } + binaryTabData.jumpto() + }, + leadingIcon = { + Icon( + imageVector = Icons.Filled.AddCircle, + contentDescription = "Jump to" + ) + }, text = { Text("Jump to") }) + if (binaryTabData.isDisasmTab()) { + DropdownMenuItem( + onClick = { + dismiss() + binaryTabData.chooseColumns() + }, + leadingIcon = { + Icon( + imageVector = Icons.Filled.CheckCircle, + contentDescription = "Choose columns" + ) + }, + text = { + Text("Choose columns") + }) } } diff --git a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/OpenTabManager.kt b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/OpenTabManager.kt index d44a6770..56885c80 100644 --- a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/OpenTabManager.kt +++ b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/OpenTabManager.kt @@ -3,13 +3,18 @@ package com.kyhsgeekcode.disassembler.ui import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material.ScrollableTabRow -import androidx.compose.material.Tab -import androidx.compose.material.Text +import androidx.compose.material3.ScrollableTabRow +import androidx.compose.material3.Tab +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.ui.Modifier -import com.kyhsgeekcode.disassembler.ui.tabs.* +import com.kyhsgeekcode.disassembler.ui.tabs.AnalysisTab +import com.kyhsgeekcode.disassembler.ui.tabs.BinaryTab +import com.kyhsgeekcode.disassembler.ui.tabs.HexTab +import com.kyhsgeekcode.disassembler.ui.tabs.ImageTab +import com.kyhsgeekcode.disassembler.ui.tabs.StringTab +import com.kyhsgeekcode.disassembler.ui.tabs.TextTab import com.kyhsgeekcode.disassembler.viewmodel.MainViewModel diff --git a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/AutoCompleteTextFieldDialog.kt b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/AutoCompleteTextFieldDialog.kt index f2adfe4e..5ee65df3 100644 --- a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/AutoCompleteTextFieldDialog.kt +++ b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/AutoCompleteTextFieldDialog.kt @@ -4,9 +4,9 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.padding -import androidx.compose.material.AlertDialog -import androidx.compose.material.Button -import androidx.compose.material.Text +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp @@ -51,7 +51,7 @@ fun AutoCompleteTextFieldDialog( } }, - buttons = { + confirmButton = { Row( modifier = Modifier.padding(all = 8.dp), horizontalArrangement = Arrangement.Center diff --git a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/DropDownList.kt b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/DropDownList.kt index 1ca5b0bc..804be5e1 100644 --- a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/DropDownList.kt +++ b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/DropDownList.kt @@ -3,9 +3,9 @@ package com.kyhsgeekcode.disassembler.ui.components import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.wrapContentWidth -import androidx.compose.material.DropdownMenu -import androidx.compose.material.DropdownMenuItem -import androidx.compose.material.Text +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.Text import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview @@ -52,10 +52,11 @@ fun DropDownList( onClick = { request(false) selectedString(it) + }, + text = { + Text(it, modifier = Modifier.wrapContentWidth()) } - ) { - Text(it, modifier = Modifier.wrapContentWidth()) - } + ) } } } diff --git a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/HexTextField.kt b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/HexTextField.kt index 95e614d6..e374b84a 100644 --- a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/HexTextField.kt +++ b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/HexTextField.kt @@ -1,8 +1,10 @@ package com.kyhsgeekcode.disassembler.ui.components -import androidx.compose.material.TextField +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.TextField import androidx.compose.runtime.Composable +@OptIn(ExperimentalMaterial3Api::class) @Composable fun HexTextField( value: String, diff --git a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/HexView.kt b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/HexView.kt index e42a5f2b..ec0f529a 100644 --- a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/HexView.kt +++ b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/HexView.kt @@ -7,9 +7,11 @@ import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.rememberScrollState -import androidx.compose.material.Text +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontWeight @@ -20,13 +22,16 @@ import androidx.compose.ui.unit.dp @ExperimentalFoundationApi @Composable fun HexView(bytes: ByteArray) { - val splitted = derivedStateOf { (bytes.toList().chunked(8)) } + val splitted by remember { + derivedStateOf { (bytes.toList().chunked(8)) } + } + LazyColumn(Modifier.horizontalScroll(rememberScrollState())) { stickyHeader { HexViewHeader() } - items(splitted.value) { item -> + items(splitted) { item -> HexViewRow(item) } } diff --git a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/NumberTextField.kt b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/NumberTextField.kt index feb48490..e7cc443d 100644 --- a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/NumberTextField.kt +++ b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/NumberTextField.kt @@ -1,11 +1,13 @@ package com.kyhsgeekcode.disassembler.ui.components import androidx.compose.foundation.text.KeyboardOptions -import androidx.compose.material.TextField +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.TextField import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.text.input.KeyboardType +@OptIn(ExperimentalMaterial3Api::class) @Composable fun NumberTextField( value: String, diff --git a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/TableView.kt b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/TableView.kt index 0f3314c3..56ecf177 100644 --- a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/TableView.kt +++ b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/TableView.kt @@ -1,10 +1,21 @@ package com.kyhsgeekcode.disassembler.ui.components -import androidx.compose.foundation.* -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.combinedClickable +import androidx.compose.foundation.horizontalScroll +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.IntrinsicSize +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items -import androidx.compose.material.Text +import androidx.compose.foundation.rememberScrollState +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color diff --git a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/TreeView.kt b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/TreeView.kt index bb5a70f6..fd58d82d 100644 --- a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/TreeView.kt +++ b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/components/TreeView.kt @@ -5,7 +5,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.size -import androidx.compose.material.Text +import androidx.compose.material3.Text import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview diff --git a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/tabs/BinaryTab.kt b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/tabs/BinaryTab.kt index c503a8ca..177cb3c4 100644 --- a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/tabs/BinaryTab.kt +++ b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/tabs/BinaryTab.kt @@ -3,19 +3,21 @@ package com.kyhsgeekcode.disassembler.ui.tabs import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material.ScrollableTabRow -import androidx.compose.material.Tab -import androidx.compose.material.Text import androidx.compose.material3.ScrollableTabRow import androidx.compose.material3.Tab import androidx.compose.material3.Text -import androidx.compose.runtime.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import com.kyhsgeekcode.disassembler.files.AbstractFile import com.kyhsgeekcode.disassembler.MainActivity import com.kyhsgeekcode.disassembler.R import com.kyhsgeekcode.disassembler.UserCanceledException +import com.kyhsgeekcode.disassembler.files.AbstractFile import com.kyhsgeekcode.disassembler.models.Architecture import com.kyhsgeekcode.disassembler.project.ProjectDataStorage import com.kyhsgeekcode.disassembler.ui.TabData diff --git a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/tabs/TextTab.kt b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/tabs/TextTab.kt index 5836cdb4..f632e570 100644 --- a/app/src/main/java/com/kyhsgeekcode/disassembler/ui/tabs/TextTab.kt +++ b/app/src/main/java/com/kyhsgeekcode/disassembler/ui/tabs/TextTab.kt @@ -3,7 +3,7 @@ package com.kyhsgeekcode.disassembler.ui.tabs import androidx.compose.foundation.background import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material.Text +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.ui.Modifier