From e0e0e973b572292592fa609c577569e8cf059451 Mon Sep 17 00:00:00 2001 From: AlbYoda Date: Thu, 13 Mar 2025 16:35:09 +0100 Subject: [PATCH] Navigation is now there. Some logos are missing and also file clicking does nothing. --- .../java/com/bbc/denadrive/MainActivity.kt | 86 +++++---- .../main/java/com/bbc/denadrive/MyNavGraph.kt | 48 ++--- .../apihandlers/DriveResponseBody.kt | 4 +- .../denadrive/apihandlers/ResponsesHandler.kt | 12 -- .../com/bbc/denadrive/home/DebugScreens.kt | 174 +++++------------- .../bbc/denadrive/home/NeverLoggedInLogic.kt | 1 + app/src/main/res/drawable/docslogo_ok.xml | 81 ++++++++ app/src/main/res/drawable/folderlogo_ok.xml | 72 ++++++++ app/src/main/res/drawable/nuovaicona_.xml | 18 ++ app/src/main/res/drawable/slideslogo_ok.xml | 126 +++++++++++++ 10 files changed, 421 insertions(+), 201 deletions(-) create mode 100644 app/src/main/res/drawable/docslogo_ok.xml create mode 100644 app/src/main/res/drawable/folderlogo_ok.xml create mode 100644 app/src/main/res/drawable/nuovaicona_.xml create mode 100644 app/src/main/res/drawable/slideslogo_ok.xml diff --git a/app/src/main/java/com/bbc/denadrive/MainActivity.kt b/app/src/main/java/com/bbc/denadrive/MainActivity.kt index 3ba794a..30a7068 100644 --- a/app/src/main/java/com/bbc/denadrive/MainActivity.kt +++ b/app/src/main/java/com/bbc/denadrive/MainActivity.kt @@ -6,15 +6,13 @@ import android.os.Bundle import android.util.Log import android.widget.Toast import androidx.activity.ComponentActivity +import androidx.activity.addCallback import androidx.activity.compose.setContent import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.core.net.toUri -import androidx.lifecycle.LiveData -import androidx.navigation.compose.rememberNavController -import com.bbc.denadrive.apihandlers.DriveResponseBody import com.bbc.denadrive.apihandlers.ResponsesHandler import com.bbc.denadrive.apihandlers.makeDriveApiCall import com.bbc.denadrive.home.ScaffoldWithSidebar @@ -30,17 +28,60 @@ import net.openid.appauth.ResponseTypeValues class MainActivity : ComponentActivity() { private lateinit var responsesHandler: ResponsesHandler + private var currentPath: String = "root" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - val authPersistence = AuthStatePersistence - val authState = authPersistence.retrieveAuthState(this) responsesHandler = ResponsesHandler() + onBackPressedDispatcher.addCallback(this) { + if (currentPath != "root") makeNewRequest("", false) + else finish() + } + + makeNewRequest(parentFolder = "root", forward = true, isFirstRequest = true) + + setContent { + ScaffoldWithSidebar( + responsesHandler, + { name -> + Toast.makeText( + this, + "You pressed the file $name", + Toast.LENGTH_SHORT + ).show() + }, + { parent -> makeNewRequest(parent, true) }) { + } + } + } + + private fun makeNewRequest( + parentFolder: String, forward: Boolean, isFirstRequest: Boolean = false + ) { + responsesHandler.lastResponseBody.value = null + val authPersistence = AuthStatePersistence + val authState = authPersistence.retrieveAuthState(this) + val actualFolder: String + if (!isFirstRequest) { + if (forward) { + currentPath += "/$parentFolder" + actualFolder = parentFolder + } else { + currentPath = currentPath.substringBeforeLast("/") + actualFolder = + if (currentPath != "root") currentPath.substringAfterLast("/") + else "root" + } + } else actualFolder = parentFolder +// val path = if (parentFolder != "root") "root/$parentFolder" else parentFolder + Log.e("WAAAT", "makeNewRequest: $actualFolder") + Log.e("WAAAT", "makeNewRequest: $currentPath") + val myUrl = "https://www.googleapis.com/drive/v3/files?trashed=false&orderBy=folder" - makeDriveApiCall(this, authState, myUrl, "root") { - response, exception -> + makeDriveApiCall(this, authState, myUrl, actualFolder) { + response, exception -> if (exception != null) { Log.e("ECCOLO", "${exception.cause}") Log.e("ECCOLO", "${exception.message}") @@ -51,37 +92,6 @@ class MainActivity : ComponentActivity() { } } authPersistence.putAuthState(this, authState) - - setContent { - val navController = rememberNavController() - ScaffoldWithSidebar(navController, responsesHandler) { - Log.e("LETTINGYOUKNOW", "authstate: ${authState.jsonSerializeString()}") - } - } - } - - - private fun handleAuthStuff() { - val serviceConfig = retrieveAuthServConf() -// val authState = AuthState(serviceConfig) - val authRequestBuilder = AuthorizationRequest.Builder( - serviceConfig, - "722393551256-pum20gbvb1es723kt3ek9lmtrdimr0os.apps.googleusercontent.com", - ResponseTypeValues.CODE, - "com.bbc.denadrive:/oauth2redirect".toUri() - ) - val authRequest = authRequestBuilder - .setScope("https://www.googleapis.com/auth/drive") - .build() - - val authService = AuthorizationService(this) - authService.performAuthorizationRequest( - authRequest, - PendingIntent.getActivity(this, 0, Intent(this, - TestActivity::class.java), PendingIntent.FLAG_MUTABLE), - PendingIntent.getActivity(this, 0, Intent(this, - TestBah::class.java), PendingIntent.FLAG_MUTABLE) - ) } override fun onNewIntent(intent: Intent) { diff --git a/app/src/main/java/com/bbc/denadrive/MyNavGraph.kt b/app/src/main/java/com/bbc/denadrive/MyNavGraph.kt index 8de470b..4658e3d 100644 --- a/app/src/main/java/com/bbc/denadrive/MyNavGraph.kt +++ b/app/src/main/java/com/bbc/denadrive/MyNavGraph.kt @@ -1,32 +1,34 @@ package com.bbc.denadrive import androidx.compose.runtime.Composable -import androidx.lifecycle.LiveData -import androidx.lifecycle.ViewModel import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable -import com.bbc.denadrive.apihandlers.DriveResponseBody import com.bbc.denadrive.apihandlers.ResponsesHandler -import com.bbc.denadrive.home.DetailsScreen -import com.bbc.denadrive.home.HomeScreen import com.bbc.denadrive.home.MyListVisualizer -@Composable -fun NavigationGraph(navController: NavHostController, responsesHandler: ResponsesHandler) { - // Create a NavHost that defines the navigation graph - NavHost(navController = navController, startDestination = "prova") { - // Define the home screen destination - composable("home") { HomeScreen(navController) } - - // Define the details screen destination with an argument - composable("details/{itemId}") { backStackEntry -> - // Retrieve the argument from the back stack entry - val itemId = backStackEntry.arguments?.getString("itemId") - // Pass the argument to the DetailsScreen - DetailsScreen(itemId, navController) - } - - composable("prova") { MyListVisualizer(responsesHandler) } - } -} +//@Composable +//fun NavigationGraph(navController: NavHostController, +// responsesHandler: ResponsesHandler, +// onFileClick: (String) -> Unit, +// onFolderClick: (String) -> Unit) { +// // Create a NavHost that defines the navigation graph +// NavHost(navController = navController, startDestination = "path/root") { +// // Define the home screen destination +// composable("home") { HomeScreen(navController) } +// +// // Define the details screen destination with an argument +// composable("details/{itemId}") { backStackEntry -> +// // Retrieve the argument from the back stack entry +// val itemId = backStackEntry.arguments?.getString("itemId") +// // Pass the argument to the DetailsScreen +// DetailsScreen(itemId, navController) +// } +// +// composable("path/{parentFolder}") { backStackEntry -> +// val parentFolder = backStackEntry.arguments!!.getString("parentFolder") +// onFolderClick(parentFolder!!) +// MyListVisualizer(responsesHandler, onFileClick, onFolderClick) +// } +// } +//} diff --git a/app/src/main/java/com/bbc/denadrive/apihandlers/DriveResponseBody.kt b/app/src/main/java/com/bbc/denadrive/apihandlers/DriveResponseBody.kt index fa36641..6c4f670 100644 --- a/app/src/main/java/com/bbc/denadrive/apihandlers/DriveResponseBody.kt +++ b/app/src/main/java/com/bbc/denadrive/apihandlers/DriveResponseBody.kt @@ -9,7 +9,7 @@ data class DriveResponseBody( val incompleteSearch: Boolean, val files: List ) { - fun toList(): List { - return files.map { it.name } + fun toList(): List { + return files } } diff --git a/app/src/main/java/com/bbc/denadrive/apihandlers/ResponsesHandler.kt b/app/src/main/java/com/bbc/denadrive/apihandlers/ResponsesHandler.kt index a259b99..cc82430 100644 --- a/app/src/main/java/com/bbc/denadrive/apihandlers/ResponsesHandler.kt +++ b/app/src/main/java/com/bbc/denadrive/apihandlers/ResponsesHandler.kt @@ -1,18 +1,13 @@ package com.bbc.denadrive.apihandlers -import android.util.Log import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf -//import androidx.lifecycle.LiveData -//import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import kotlinx.serialization.SerializationException import kotlinx.serialization.json.Json class ResponsesHandler: ViewModel() { -// private val _lastResponseBody = MutableLiveData(null) -// val lastResponseBody: LiveData get() = _lastResponseBody val lastResponseBody: MutableState = mutableStateOf(null) private var lastResponse: String = "" @@ -23,23 +18,17 @@ class ResponsesHandler: ViewModel() { if (isComplete && response != null) { respBuilder = StringBuilder(response) updateCompleteness() - Log.e("OLE", "newResponseArrived: $response") } else if (response != null) { respBuilder.append(response) - Log.e("OLE2", "newResponseArrived: $response") updateCompleteness() } } private fun checkForCompleteness(): Pair { return try { - Log.e("ASSURDO", "newResponseArrived: $respBuilder") Pair(true, Json.decodeFromString(respBuilder.toString())) } catch (e: SerializationException) { - Log.e("EDECCOCE", "newResponseArrived: $respBuilder") - Log.e("EDECCOCE", "errore: ${e.cause}") - Log.e("EDECCOCE", "errore: ${e.message}") Pair(false, null) } } @@ -49,7 +38,6 @@ class ResponsesHandler: ViewModel() { isComplete = pair.first if (isComplete) { lastResponse = respBuilder.toString() - Log.e("NONSOCHESUCCEDA", "${pair.second}", ) lastResponseBody.value = pair.second } } diff --git a/app/src/main/java/com/bbc/denadrive/home/DebugScreens.kt b/app/src/main/java/com/bbc/denadrive/home/DebugScreens.kt index 435f071..9cf0b28 100644 --- a/app/src/main/java/com/bbc/denadrive/home/DebugScreens.kt +++ b/app/src/main/java/com/bbc/denadrive/home/DebugScreens.kt @@ -1,7 +1,5 @@ package com.bbc.denadrive.home -import android.media.tv.TvContract.Channels.Logo -import android.util.Log import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.background import androidx.compose.material3.Button @@ -28,31 +26,19 @@ import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.ui.graphics.painter.Painter import androidx.compose.foundation.Image +import androidx.compose.foundation.clickable import androidx.compose.ui.res.painterResource -import com.bbc.denadrive.NavigationGraph import com.bbc.denadrive.R +import com.bbc.denadrive.apihandlers.MyFile import com.bbc.denadrive.apihandlers.ResponsesHandler -@Composable -fun HomeScreen(navController: NavHostController) { - Button(onClick = { navController.navigate("details/1") }) { - Text("Go to Details") - } -} - -@Composable -fun DetailsScreen(itemId: String?, navController: NavHostController) { - Text(text = "Details for item: $itemId") -} - - @OptIn(ExperimentalMaterial3Api::class) @Composable fun ScaffoldWithSidebar( - navController: NavHostController, responsesHandler: ResponsesHandler, + onFileClick: (String) -> Unit, + onFolderClick: (String) -> Unit, doIt: () -> Unit, -// toBeDisplayed: @Composable () -> Unit ) { // State to control the drawer val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed) @@ -81,7 +67,7 @@ fun ScaffoldWithSidebar( Scaffold( topBar = { TopAppBar( - title = { Text("My App") }, + title = { Text("DeNa Drive") }, navigationIcon = { IconButton(onClick = { scope.launch { @@ -106,11 +92,13 @@ fun ScaffoldWithSidebar( .fillMaxSize() .padding(innerPadding) .padding(16.dp), - contentAlignment = Alignment.TopCenter, + contentAlignment = Alignment.Center, ) { - NavigationGraph(navController, responsesHandler) -// toBeDisplayed() -// Text("Main Content", fontSize = 24.sp) + MyListVisualizer( + responsesHandler = responsesHandler, + onFileClick = onFileClick, + onFolderClick = onFolderClick + ) } } ) @@ -153,56 +141,70 @@ fun RectangularButton( } @Composable -fun MyListVisualizer(responsesHandler: ResponsesHandler) { - Log.e("CHECKING", "MyListVisualizer: REDRAWN", ) - val fileList = mutableListOf() +fun MyListVisualizer(responsesHandler: ResponsesHandler, + onFileClick: (String) -> Unit, + onFolderClick: (String) -> Unit) { + val fileList = mutableListOf() if (responsesHandler.lastResponseBody.value == null) { fileList.clear() - fileList.addAll( - listOf("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", - "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z") - ) + Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { + Text(text = "Loading...", style = MaterialTheme.typography.titleLarge) + } } else { fileList.clear() fileList.addAll( responsesHandler.lastResponseBody.value!!.toList() ) - } -// val fileList = driveResponseBody.value?.toList() -// ?: listOf("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", -// "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z") -// LazyColumn { -// items(fileList) { name -> Text(text=name, fontSize = 30.sp) } -// } - LazyColumn { - items(fileList) { name -> - val logo = painterResource(id = R.drawable.vecchiaicona_) - LogoTextBox(logo, name) + Box (modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.TopCenter) { + LazyColumn { + items(fileList) { file -> + val logo = painterResource(id = getId(file.mimeType)) + val isFolder = file.mimeType.endsWith("folder") + val onClick = if (isFolder) onFolderClick + else onFileClick + LogoTextBox(logo, file.name) { onClick( + if (isFolder) file.id else file.name) } + } + } } } } +fun getId(mimeType: String): Int { + val extracted = mimeType.drop("application/vnd.google-apps.".length) + return when (extracted) { + "document" -> R.drawable.docslogo_ok + "presentation" -> R.drawable.slideslogo_ok + "folder" -> R.drawable.folderlogo_ok + else -> R.drawable.nuovaicona_ + } +} + @Composable -fun LogoTextBox(logoPainter: Painter, text: String) { +fun LogoTextBox( + logoPainter: Painter, + text: String, + onClick: () -> Unit) { Card( modifier = Modifier .fillMaxWidth() - .padding(16.dp), + .padding(16.dp) + .clickable(onClick = onClick), shape = RoundedCornerShape(8.dp), elevation = CardDefaults.cardElevation(defaultElevation = 4.dp) ) { Row( modifier = Modifier - .padding(16.dp) + .padding(horizontal = 16.dp) .fillMaxWidth(), verticalAlignment = Alignment.CenterVertically ) { // Logo on the left Image( painter = logoPainter, - contentDescription = "Logo", + contentDescription = "Item Logo", modifier = Modifier - .size(40.dp) // Adjust size as needed + .size(60.dp) // Adjust size as needed .padding(end = 16.dp) // Space between logo and text ) @@ -215,83 +217,3 @@ fun LogoTextBox(logoPainter: Painter, text: String) { } } } - -//@Composable -//fun MyApp() { -// ScaffoldWithSidebar() -//} - -//@Composable -//fun MainActivityContent() { -// MyApp() -//} - - -//@OptIn(ExperimentalMaterial3Api::class) -//@Composable -//fun ScaffoldWithSidebar() { -// // State to control the drawer -// var isDrawerOpen by remember { mutableStateOf(false) } -// -// // Main Scaffold -// Scaffold( -// topBar = { -// TopAppBar( -// title = { Text("My App") }, -// navigationIcon = { -// IconButton(onClick = { isDrawerOpen = true }) { -// // Icon for the menu (three horizontal lines) -// Icon(Icons.Filled.Menu, contentDescription = "Menu") -// } -// }, -// actions = { -// IconButton(onClick = { /* Handle settings click */ }) { -// // Icon for the settings (three vertical dots) -// Icon(Icons.Filled.MoreVert, contentDescription = "Settings") -// } -// } -// ) -// }, -// drawerContent = { -// // Drawer content -// Column( -// modifier = Modifier -// .fillMaxSize() -// .padding(16.dp) -// ) { -// Text("Item 1", modifier = Modifier.clickable { /* Handle click */ }) -// Spacer(modifier = Modifier.height(8.dp)) -// Text("Item 2", modifier = Modifier.clickable { /* Handle click */ }) -// Spacer(modifier = Modifier.height(8.dp)) -// Text("Item 3", modifier = Modifier.clickable { /* Handle click */ }) -// } -// }, -// drawerGesturesEnabled = true, -// drawerShape = MaterialTheme.shapes.large, -// drawerContentColor = MaterialTheme.colorScheme.background, -// drawerContainerColor = MaterialTheme.colorScheme.surface, -// content = { padding -> -// // Main content of the screen -// Box( -// modifier = Modifier -// .fillMaxSize() -// .padding(padding) -// .background(Color.White), -// contentAlignment = Alignment.Center -// ) { -// Text("Main Content", fontSize = 24.sp) -// } -// } -// ) -// -// // Handle drawer state -// if (isDrawerOpen) { -// // Close the drawer when clicking outside -// Box( -// modifier = Modifier -// .fillMaxSize() -// .background(Color.Black.copy(alpha = 0.5f)) -// .clickable { isDrawerOpen = false } -// ) -// } -//} diff --git a/app/src/main/java/com/bbc/denadrive/home/NeverLoggedInLogic.kt b/app/src/main/java/com/bbc/denadrive/home/NeverLoggedInLogic.kt index 829e0e5..38a1660 100644 --- a/app/src/main/java/com/bbc/denadrive/home/NeverLoggedInLogic.kt +++ b/app/src/main/java/com/bbc/denadrive/home/NeverLoggedInLogic.kt @@ -57,6 +57,7 @@ class NeverLoggedInLogic : ComponentActivity() { } } } + finish() } } diff --git a/app/src/main/res/drawable/docslogo_ok.xml b/app/src/main/res/drawable/docslogo_ok.xml new file mode 100644 index 0000000..259ec7a --- /dev/null +++ b/app/src/main/res/drawable/docslogo_ok.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/folderlogo_ok.xml b/app/src/main/res/drawable/folderlogo_ok.xml new file mode 100644 index 0000000..bdde1e3 --- /dev/null +++ b/app/src/main/res/drawable/folderlogo_ok.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/nuovaicona_.xml b/app/src/main/res/drawable/nuovaicona_.xml new file mode 100644 index 0000000..5edca95 --- /dev/null +++ b/app/src/main/res/drawable/nuovaicona_.xml @@ -0,0 +1,18 @@ + + + + + diff --git a/app/src/main/res/drawable/slideslogo_ok.xml b/app/src/main/res/drawable/slideslogo_ok.xml new file mode 100644 index 0000000..f4f2418 --- /dev/null +++ b/app/src/main/res/drawable/slideslogo_ok.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + +