From a142b4a9425db4830564c27335e5bf51d45efee5 Mon Sep 17 00:00:00 2001
From: FazriA <202310715082@mhs.ubharajaya.ac.id>
Date: Wed, 12 Nov 2025 17:19:09 +0700
Subject: [PATCH] Apis apus pitur
---
.idea/deploymentTargetSelector.xml | 3 -
.../java/com/example/notebook/MainActivity.kt | 289 ++++++------------
2 files changed, 87 insertions(+), 205 deletions(-)
diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml
index 85ee642..b268ef3 100644
--- a/.idea/deploymentTargetSelector.xml
+++ b/.idea/deploymentTargetSelector.xml
@@ -5,9 +5,6 @@
-
-
-
\ No newline at end of file
diff --git a/app/src/main/java/com/example/notebook/MainActivity.kt b/app/src/main/java/com/example/notebook/MainActivity.kt
index 6298171..526a264 100644
--- a/app/src/main/java/com/example/notebook/MainActivity.kt
+++ b/app/src/main/java/com/example/notebook/MainActivity.kt
@@ -51,11 +51,12 @@ class MainActivity : ComponentActivity() {
}
}
+
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun NotebookApp() {
var selectedTabIndex by remember { mutableStateOf(0) }
- val tabs = listOf("Sources", "Chat", "Studio")
+ val tabs = listOf("Studio", "Chat", "Sources")
var showGoogleAppsMenu by remember { mutableStateOf(false) }
var showSettingsMenu by remember { mutableStateOf(false) }
var showAccountScreen by remember { mutableStateOf(false) }
@@ -67,11 +68,9 @@ fun NotebookApp() {
Scaffold(
topBar = {
TopAppBar(
- title = { Text("Apis Notepad") },
+ title = { Text("NoteBook") },
actions = {
- IconButton(onClick = { /* do something */ }) {
- Icon(Icons.Filled.Share, contentDescription = "Share")
- }
+ // [DIHAPUS] Tombol Share
Box {
IconButton(onClick = { showSettingsMenu = true }) {
Icon(Icons.Filled.Settings, contentDescription = "Settings")
@@ -108,9 +107,9 @@ fun NotebookApp() {
}
}
when (selectedTabIndex) {
- 0 -> SourcesScreen()
+ 0 -> StudioScreen()
1 -> ChatScreen()
- 2 -> StudioScreen()
+ 2 -> SourcesScreen()
}
}
}
@@ -318,14 +317,10 @@ fun GoogleAppsMenu(expanded: Boolean, onDismiss: () -> Unit) {
@Composable
fun SourcesScreen() {
var showAddSourcesSheet by remember { mutableStateOf(false) }
- var showDiscoverDialog by remember { mutableStateOf(false) }
if (showAddSourcesSheet) {
AddSourcesSheet(onDismiss = { showAddSourcesSheet = false })
}
- if (showDiscoverDialog) {
- DiscoverSourcesDialog(onDismiss = { showDiscoverDialog = false })
- }
Column(
modifier = Modifier
@@ -335,18 +330,13 @@ fun SourcesScreen() {
) {
Row(
modifier = Modifier.fillMaxWidth(),
- horizontalArrangement = Arrangement.spacedBy(8.dp)
+ horizontalArrangement = Arrangement.Center
) {
- Button(onClick = { showAddSourcesSheet = true }, modifier = Modifier.weight(1f)) {
+ Button(onClick = { showAddSourcesSheet = true }) {
Icon(Icons.Filled.Add, contentDescription = "Add")
Spacer(modifier = Modifier.width(4.dp))
Text("Add")
}
- Button(onClick = { showDiscoverDialog = true }, modifier = Modifier.weight(1f)) {
- Icon(Icons.Filled.Search, contentDescription = "Discover")
- Spacer(modifier = Modifier.width(4.dp))
- Text("Discover")
- }
}
Column(
modifier = Modifier.fillMaxSize(),
@@ -367,98 +357,6 @@ fun SourcesScreen() {
}
}
-@OptIn(ExperimentalMaterial3Api::class)
-@Composable
-fun DiscoverSourcesDialog(onDismiss: () -> Unit) {
- var description by remember { mutableStateOf("") }
- val findFromOptions = listOf("Web", "Google Drive")
- var selectedOption by remember { mutableStateOf(findFromOptions[0]) }
-
- Dialog(onDismissRequest = onDismiss, properties = DialogProperties(usePlatformDefaultWidth = false)) {
- Scaffold(
- topBar = {
- TopAppBar(
- title = { Text("Discover sources") },
- actions = {
- IconButton(onClick = onDismiss) {
- Icon(Icons.Default.Close, contentDescription = "Close")
- }
- }
- )
- },
- bottomBar = {
- Row(
- modifier = Modifier.fillMaxWidth().padding(16.dp),
- horizontalArrangement = Arrangement.spacedBy(8.dp)
- ) {
- Button(
- onClick = { /* TODO */ },
- modifier = Modifier.weight(1f)
- ) {
- Icon(Icons.Default.Celebration, contentDescription = null)
- Spacer(modifier = Modifier.width(4.dp))
- Text("I'm feeling curious")
- }
- Button(
- onClick = { /* TODO */ },
- modifier = Modifier.weight(1f),
- enabled = description.isNotBlank()
- ) {
- Text("Submit")
- }
- }
- }
- ) { paddingValues ->
- Column(
- modifier = Modifier
- .fillMaxSize()
- .padding(paddingValues)
- .padding(16.dp),
- horizontalAlignment = Alignment.CenterHorizontally,
- verticalArrangement = Arrangement.spacedBy(16.dp)
- ) {
- Icon(
- imageVector = Icons.Default.TravelExplore,
- contentDescription = null,
- modifier = Modifier.size(48.dp)
- )
- Text("What are you interested in?", style = MaterialTheme.typography.titleLarge)
- OutlinedTextField(
- value = description,
- onValueChange = { description = it },
- placeholder = { Text("Describe something you'd like to learn about or click \"I'm feeling curious\" to explore a new topic.") },
- modifier = Modifier.fillMaxWidth().height(150.dp)
- )
- Column(modifier = Modifier.fillMaxWidth()) {
- Text("Find sources from:", style = MaterialTheme.typography.titleMedium)
- findFromOptions.forEach { text ->
- Row(
- Modifier
- .fillMaxWidth()
- .selectable(
- selected = (text == selectedOption),
- onClick = { selectedOption = text }
- )
- .padding(vertical = 8.dp),
- verticalAlignment = Alignment.CenterVertically
- ) {
- RadioButton(
- selected = (text == selectedOption),
- onClick = { selectedOption = text }
- )
- Text(
- text = text,
- style = MaterialTheme.typography.bodyLarge,
- modifier = Modifier.padding(start = 8.dp)
- )
- }
- }
- }
- }
- }
- }
-}
-
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun AddSourcesSheet(onDismiss: () -> Unit) {
@@ -497,11 +395,6 @@ fun AddSourcesSheet(onDismiss: () -> Unit) {
Row(verticalAlignment = Alignment.CenterVertically) {
Text("Add sources", style = MaterialTheme.typography.titleLarge)
Spacer(modifier = Modifier.weight(1f))
- Button(onClick = { /*TODO*/ }) {
- Icon(Icons.Default.Search, contentDescription = null)
- Spacer(modifier = Modifier.width(4.dp))
- Text("Discover sources")
- }
}
Text("Get started by selecting sources", style = MaterialTheme.typography.bodyMedium, color = Color.Gray)
@@ -547,15 +440,15 @@ fun AddSourcesSheet(onDismiss: () -> Unit) {
)
DropdownMenuItem(
text = { Text("Pilih File") },
- onClick = {
+ onClick = {
filePickerLauncher.launch("*/*")
- showUploadMenu = false
+ showUploadMenu = false
},
leadingIcon = { Icon(Icons.Default.Folder, contentDescription = null) }
)
DropdownMenuItem(
text = { Text("Google Drive") },
- onClick = {
+ onClick = {
filePickerLauncher.launch("*/*")
showUploadMenu = false
},
@@ -568,40 +461,17 @@ fun AddSourcesSheet(onDismiss: () -> Unit) {
Card(modifier = Modifier.fillMaxWidth()) {
Column(modifier = Modifier.padding(16.dp), verticalArrangement = Arrangement.spacedBy(8.dp)) {
Row(verticalAlignment = Alignment.CenterVertically) {
- Icon(Icons.Default.CorporateFare, contentDescription = null)
+ Icon(Icons.Default.CorporateFare, contentDescription = null)
Spacer(modifier = Modifier.width(8.dp))
Text("Google Workspace", fontWeight = FontWeight.Bold)
}
Button(onClick = { /*TODO*/ }) {
- Icon(Icons.Default.Cloud, contentDescription = null)
+ Icon(Icons.Default.Cloud, contentDescription = null)
Spacer(modifier = Modifier.width(4.dp))
Text("Google Drive")
}
}
}
-
- // Link card
- Card(modifier = Modifier.fillMaxWidth()) {
- Column(modifier = Modifier.padding(16.dp), verticalArrangement = Arrangement.spacedBy(8.dp)) {
- Row(verticalAlignment = Alignment.CenterVertically) {
- Icon(Icons.Default.Link, contentDescription = null)
- Spacer(modifier = Modifier.width(8.dp))
- Text("Link", fontWeight = FontWeight.Bold)
- }
- Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
- Button(onClick = { /*TODO*/ }) {
- Icon(Icons.Default.Language, contentDescription = null)
- Spacer(modifier = Modifier.width(4.dp))
- Text("Website")
- }
- Button(onClick = { /*TODO*/ }) {
- Icon(Icons.Default.PlayCircle, contentDescription = null)
- Spacer(modifier = Modifier.width(4.dp))
- Text("YouTube")
- }
- }
- }
- }
}
}
}
@@ -658,78 +528,93 @@ fun ChatScreen() {
}
}
+@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun StudioScreen() {
- val studioActions = listOf(
- "Audio Overview" to Icons.Default.GraphicEq,
- "Video Overview" to Icons.Default.OndemandVideo,
- "Mind Map" to Icons.Default.AccountTree,
- "Reports" to Icons.Default.Assessment,
- "Flashcards" to Icons.Default.Style,
- "Quiz" to Icons.Default.Quiz
+ // State untuk dropdown menu
+ var showUploadMenu by remember { mutableStateOf(false) }
+
+ // Launcher untuk mengambil media
+ val photoPickerLauncher = rememberLauncherForActivityResult(
+ contract = ActivityResultContracts.PickVisualMedia(),
+ onResult = { uri -> /* Handle URI */ }
+ )
+ val filePickerLauncher = rememberLauncherForActivityResult(
+ contract = ActivityResultContracts.GetContent(),
+ onResult = { uri -> /* Handle URI */ }
)
- Column(
- modifier = Modifier
- .fillMaxSize()
- .padding(16.dp),
- horizontalAlignment = Alignment.CenterHorizontally
- ) {
- LazyVerticalGrid(
- columns = GridCells.Fixed(2),
- verticalArrangement = Arrangement.spacedBy(8.dp),
- horizontalArrangement = Arrangement.spacedBy(8.dp)
- ) {
- items(studioActions) { (title, icon) ->
- StudioActionCard(title = title, icon = icon)
- }
- }
+ Column(modifier = Modifier.fillMaxSize().background(Color.White).padding(16.dp)) {
+ Text("Notebook terbaru", style = MaterialTheme.typography.titleLarge, fontWeight = FontWeight.Bold, color = Color.Black)
+ Spacer(modifier = Modifier.height(16.dp))
- Column(
- modifier = Modifier.fillMaxSize(),
- verticalArrangement = Arrangement.Center,
- horizontalAlignment = Alignment.CenterHorizontally
- ) {
- Icon(Icons.Default.AutoAwesome, contentDescription = null, tint = Color.Gray)
- Spacer(modifier = Modifier.height(8.dp))
- Text("Studio output will be saved here.", style = MaterialTheme.typography.titleMedium)
- Spacer(modifier = Modifier.height(8.dp))
- Text(
- text = "After adding sources, click to add Audio Overview, Study Guide, Mind Map, and more!",
- style = MaterialTheme.typography.bodyMedium,
- textAlign = TextAlign.Center,
- color = Color.Gray
- )
- Spacer(modifier = Modifier.height(16.dp))
- Button(onClick = { /*TODO*/ }) {
- Icon(Icons.Default.NoteAdd, contentDescription = null)
- Spacer(modifier = Modifier.width(4.dp))
- Text("Add note")
+ // Box untuk menjadi anchor bagi DropdownMenu
+ Box {
+ NewNotebookCard(onClick = { showUploadMenu = true })
+
+ DropdownMenu(
+ expanded = showUploadMenu,
+ onDismissRequest = { showUploadMenu = false }
+ ) {
+ DropdownMenuItem(
+ text = { Text("Perpustakaan Foto") },
+ onClick = {
+ photoPickerLauncher.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageAndVideo))
+ showUploadMenu = false
+ },
+ leadingIcon = { Icon(Icons.Default.PhotoLibrary, contentDescription = null) }
+ )
+ DropdownMenuItem(
+ text = { Text("Ambil Video") },
+ onClick = { /* TODO: Implement Camera Launcher */ showUploadMenu = false },
+ leadingIcon = { Icon(Icons.Default.PhotoCamera, contentDescription = null) }
+ )
+ DropdownMenuItem(
+ text = { Text("Pilih File") },
+ onClick = {
+ filePickerLauncher.launch("*/*")
+ showUploadMenu = false
+ },
+ leadingIcon = { Icon(Icons.Default.Folder, contentDescription = null) }
+ )
+ DropdownMenuItem(
+ text = { Text("Google Drive") },
+ onClick = {
+ filePickerLauncher.launch("*/*")
+ showUploadMenu = false
+ },
+ leadingIcon = { Icon(Icons.Default.Cloud, contentDescription = null) }
+ )
}
}
}
}
@Composable
-fun StudioActionCard(title: String, icon: ImageVector) {
+fun NewNotebookCard(onClick: () -> Unit) {
Card(
- modifier = Modifier.fillMaxWidth(),
- shape = MaterialTheme.shapes.medium
+ modifier = Modifier
+ .size(width = 180.dp, height = 150.dp)
+ .clickable(onClick = onClick),
+ shape = RoundedCornerShape(16.dp),
+ colors = CardDefaults.cardColors(containerColor = Color(0xFFF0F4F7))
) {
- Box(modifier = Modifier.padding(12.dp)) {
- Column(horizontalAlignment = Alignment.Start) {
- Icon(icon, contentDescription = null, modifier = Modifier.size(24.dp))
- Spacer(modifier = Modifier.height(8.dp))
- Text(title, style = MaterialTheme.typography.bodyLarge)
- }
- Icon(
- Icons.Default.Edit,
- contentDescription = "Edit",
+ Column(
+ modifier = Modifier.fillMaxSize(),
+ verticalArrangement = Arrangement.Center,
+ horizontalAlignment = Alignment.CenterHorizontally
+ ) {
+ Box(
modifier = Modifier
- .align(Alignment.TopEnd)
- .size(18.dp),
- tint = Color.Gray
- )
+ .size(40.dp)
+ .clip(CircleShape)
+ .background(Color(0xFFE1E3E6)),
+ contentAlignment = Alignment.Center
+ ) {
+ Icon(Icons.Default.Add, contentDescription = "Buat notebook baru", tint = Color.Black)
+ }
+ Spacer(modifier = Modifier.height(8.dp))
+ Text("Buat notebook baru", color = Color.Black)
}
}
}
@@ -738,6 +623,6 @@ fun StudioActionCard(title: String, icon: ImageVector) {
@Composable
fun DefaultPreview() {
NotebookTheme {
- NotebookApp()
+ StudioScreen()
}
}