Navigation is now there. Some logos are missing and also file clicking does nothing.

This commit is contained in:
AlbYoda 2025-03-13 16:35:09 +01:00
parent 0a2de2cd06
commit e0e0e973b5
Signed by untrusted user who does not match committer: AlbYoda
GPG key ID: A539D876452F16FF
10 changed files with 421 additions and 201 deletions

View file

@ -6,15 +6,13 @@ import android.os.Bundle
import android.util.Log import android.util.Log
import android.widget.Toast import android.widget.Toast
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.addCallback
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.core.net.toUri 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.ResponsesHandler
import com.bbc.denadrive.apihandlers.makeDriveApiCall import com.bbc.denadrive.apihandlers.makeDriveApiCall
import com.bbc.denadrive.home.ScaffoldWithSidebar import com.bbc.denadrive.home.ScaffoldWithSidebar
@ -30,17 +28,60 @@ import net.openid.appauth.ResponseTypeValues
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
private lateinit var responsesHandler: ResponsesHandler private lateinit var responsesHandler: ResponsesHandler
private var currentPath: String = "root"
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
val authPersistence = AuthStatePersistence
val authState = authPersistence.retrieveAuthState(this)
responsesHandler = ResponsesHandler() 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" val myUrl = "https://www.googleapis.com/drive/v3/files?trashed=false&orderBy=folder"
makeDriveApiCall(this, authState, myUrl, "root") { makeDriveApiCall(this, authState, myUrl, actualFolder) {
response, exception -> response, exception ->
if (exception != null) { if (exception != null) {
Log.e("ECCOLO", "${exception.cause}") Log.e("ECCOLO", "${exception.cause}")
Log.e("ECCOLO", "${exception.message}") Log.e("ECCOLO", "${exception.message}")
@ -51,37 +92,6 @@ class MainActivity : ComponentActivity() {
} }
} }
authPersistence.putAuthState(this, authState) 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) { override fun onNewIntent(intent: Intent) {

View file

@ -1,32 +1,34 @@
package com.bbc.denadrive package com.bbc.denadrive
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import com.bbc.denadrive.apihandlers.DriveResponseBody
import com.bbc.denadrive.apihandlers.ResponsesHandler import com.bbc.denadrive.apihandlers.ResponsesHandler
import com.bbc.denadrive.home.DetailsScreen
import com.bbc.denadrive.home.HomeScreen
import com.bbc.denadrive.home.MyListVisualizer import com.bbc.denadrive.home.MyListVisualizer
@Composable //@Composable
fun NavigationGraph(navController: NavHostController, responsesHandler: ResponsesHandler) { //fun NavigationGraph(navController: NavHostController,
// Create a NavHost that defines the navigation graph // responsesHandler: ResponsesHandler,
NavHost(navController = navController, startDestination = "prova") { // onFileClick: (String) -> Unit,
// Define the home screen destination // onFolderClick: (String) -> Unit) {
composable("home") { HomeScreen(navController) } // // Create a NavHost that defines the navigation graph
// NavHost(navController = navController, startDestination = "path/root") {
// Define the details screen destination with an argument // // Define the home screen destination
composable("details/{itemId}") { backStackEntry -> // composable("home") { HomeScreen(navController) }
// Retrieve the argument from the back stack entry //
val itemId = backStackEntry.arguments?.getString("itemId") // // Define the details screen destination with an argument
// Pass the argument to the DetailsScreen // composable("details/{itemId}") { backStackEntry ->
DetailsScreen(itemId, navController) // // Retrieve the argument from the back stack entry
} // val itemId = backStackEntry.arguments?.getString("itemId")
// // Pass the argument to the DetailsScreen
composable("prova") { MyListVisualizer(responsesHandler) } // DetailsScreen(itemId, navController)
} // }
} //
// composable("path/{parentFolder}") { backStackEntry ->
// val parentFolder = backStackEntry.arguments!!.getString("parentFolder")
// onFolderClick(parentFolder!!)
// MyListVisualizer(responsesHandler, onFileClick, onFolderClick)
// }
// }
//}

View file

@ -9,7 +9,7 @@ data class DriveResponseBody(
val incompleteSearch: Boolean, val incompleteSearch: Boolean,
val files: List<MyFile> val files: List<MyFile>
) { ) {
fun toList(): List<String> { fun toList(): List<MyFile> {
return files.map { it.name } return files
} }
} }

View file

@ -1,18 +1,13 @@
package com.bbc.denadrive.apihandlers package com.bbc.denadrive.apihandlers
import android.util.Log
import androidx.compose.runtime.MutableState import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
//import androidx.lifecycle.LiveData
//import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import kotlinx.serialization.SerializationException import kotlinx.serialization.SerializationException
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
class ResponsesHandler: ViewModel() { class ResponsesHandler: ViewModel() {
// private val _lastResponseBody = MutableLiveData<DriveResponseBody?>(null)
// val lastResponseBody: LiveData<DriveResponseBody?> get() = _lastResponseBody
val lastResponseBody: MutableState<DriveResponseBody?> = mutableStateOf(null) val lastResponseBody: MutableState<DriveResponseBody?> = mutableStateOf(null)
private var lastResponse: String = "" private var lastResponse: String = ""
@ -23,23 +18,17 @@ class ResponsesHandler: ViewModel() {
if (isComplete && response != null) { if (isComplete && response != null) {
respBuilder = StringBuilder(response) respBuilder = StringBuilder(response)
updateCompleteness() updateCompleteness()
Log.e("OLE", "newResponseArrived: $response")
} }
else if (response != null) { else if (response != null) {
respBuilder.append(response) respBuilder.append(response)
Log.e("OLE2", "newResponseArrived: $response")
updateCompleteness() updateCompleteness()
} }
} }
private fun checkForCompleteness(): Pair<Boolean, DriveResponseBody?> { private fun checkForCompleteness(): Pair<Boolean, DriveResponseBody?> {
return try { return try {
Log.e("ASSURDO", "newResponseArrived: $respBuilder")
Pair(true, Json.decodeFromString<DriveResponseBody>(respBuilder.toString())) Pair(true, Json.decodeFromString<DriveResponseBody>(respBuilder.toString()))
} catch (e: SerializationException) { } catch (e: SerializationException) {
Log.e("EDECCOCE", "newResponseArrived: $respBuilder")
Log.e("EDECCOCE", "errore: ${e.cause}")
Log.e("EDECCOCE", "errore: ${e.message}")
Pair(false, null) Pair(false, null)
} }
} }
@ -49,7 +38,6 @@ class ResponsesHandler: ViewModel() {
isComplete = pair.first isComplete = pair.first
if (isComplete) { if (isComplete) {
lastResponse = respBuilder.toString() lastResponse = respBuilder.toString()
Log.e("NONSOCHESUCCEDA", "${pair.second}", )
lastResponseBody.value = pair.second lastResponseBody.value = pair.second
} }
} }

View file

@ -1,7 +1,5 @@
package com.bbc.denadrive.home 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.animation.core.animateFloatAsState
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.material3.Button import androidx.compose.material3.Button
@ -28,31 +26,19 @@ import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.clickable
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import com.bbc.denadrive.NavigationGraph
import com.bbc.denadrive.R import com.bbc.denadrive.R
import com.bbc.denadrive.apihandlers.MyFile
import com.bbc.denadrive.apihandlers.ResponsesHandler 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) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun ScaffoldWithSidebar( fun ScaffoldWithSidebar(
navController: NavHostController,
responsesHandler: ResponsesHandler, responsesHandler: ResponsesHandler,
onFileClick: (String) -> Unit,
onFolderClick: (String) -> Unit,
doIt: () -> Unit, doIt: () -> Unit,
// toBeDisplayed: @Composable () -> Unit
) { ) {
// State to control the drawer // State to control the drawer
val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed) val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed)
@ -81,7 +67,7 @@ fun ScaffoldWithSidebar(
Scaffold( Scaffold(
topBar = { topBar = {
TopAppBar( TopAppBar(
title = { Text("My App") }, title = { Text("DeNa Drive") },
navigationIcon = { navigationIcon = {
IconButton(onClick = { IconButton(onClick = {
scope.launch { scope.launch {
@ -106,11 +92,13 @@ fun ScaffoldWithSidebar(
.fillMaxSize() .fillMaxSize()
.padding(innerPadding) .padding(innerPadding)
.padding(16.dp), .padding(16.dp),
contentAlignment = Alignment.TopCenter, contentAlignment = Alignment.Center,
) { ) {
NavigationGraph(navController, responsesHandler) MyListVisualizer(
// toBeDisplayed() responsesHandler = responsesHandler,
// Text("Main Content", fontSize = 24.sp) onFileClick = onFileClick,
onFolderClick = onFolderClick
)
} }
} }
) )
@ -153,56 +141,70 @@ fun RectangularButton(
} }
@Composable @Composable
fun MyListVisualizer(responsesHandler: ResponsesHandler) { fun MyListVisualizer(responsesHandler: ResponsesHandler,
Log.e("CHECKING", "MyListVisualizer: REDRAWN", ) onFileClick: (String) -> Unit,
val fileList = mutableListOf<String>() onFolderClick: (String) -> Unit) {
val fileList = mutableListOf<MyFile>()
if (responsesHandler.lastResponseBody.value == null) { if (responsesHandler.lastResponseBody.value == null) {
fileList.clear() fileList.clear()
fileList.addAll( Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
listOf("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", Text(text = "Loading...", style = MaterialTheme.typography.titleLarge)
"o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z") }
)
} else { } else {
fileList.clear() fileList.clear()
fileList.addAll( fileList.addAll(
responsesHandler.lastResponseBody.value!!.toList() responsesHandler.lastResponseBody.value!!.toList()
) )
} Box (modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.TopCenter) {
// val fileList = driveResponseBody.value?.toList() LazyColumn {
// ?: listOf("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", items(fileList) { file ->
// "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z") val logo = painterResource(id = getId(file.mimeType))
// LazyColumn { val isFolder = file.mimeType.endsWith("folder")
// items(fileList) { name -> Text(text=name, fontSize = 30.sp) } val onClick = if (isFolder) onFolderClick
// } else onFileClick
LazyColumn { LogoTextBox(logo, file.name) { onClick(
items(fileList) { name -> if (isFolder) file.id else file.name) }
val logo = painterResource(id = R.drawable.vecchiaicona_) }
LogoTextBox(logo, 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 @Composable
fun LogoTextBox(logoPainter: Painter, text: String) { fun LogoTextBox(
logoPainter: Painter,
text: String,
onClick: () -> Unit) {
Card( Card(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(16.dp), .padding(16.dp)
.clickable(onClick = onClick),
shape = RoundedCornerShape(8.dp), shape = RoundedCornerShape(8.dp),
elevation = CardDefaults.cardElevation(defaultElevation = 4.dp) elevation = CardDefaults.cardElevation(defaultElevation = 4.dp)
) { ) {
Row( Row(
modifier = Modifier modifier = Modifier
.padding(16.dp) .padding(horizontal = 16.dp)
.fillMaxWidth(), .fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) { ) {
// Logo on the left // Logo on the left
Image( Image(
painter = logoPainter, painter = logoPainter,
contentDescription = "Logo", contentDescription = "Item Logo",
modifier = Modifier 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 .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 }
// )
// }
//}

View file

@ -57,6 +57,7 @@ class NeverLoggedInLogic : ComponentActivity() {
} }
} }
} }
finish()
} }
} }

View file

@ -0,0 +1,81 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="85.381"
android:viewportHeight="85.381">
<path
android:pathData="m47.68,20.95h-18.312c-1.362,0 -2.459,1.281 -2.459,2.873v37.736c0,1.591 1.097,2.873 2.459,2.873h26.644c1.362,0 2.459,-1.281 2.459,-2.873v-29.842"
android:fillColor="#2684fc"/>
<path
android:pathData="m47.68,20.95v10.766h10.791z"
android:fillColor="#0066da"/>
<path
android:pathData="m32.889,45.403h1.883v2.669q-0.442,0.145 -0.892,0.213 -0.45,0.069 -1.022,0.069 -0.846,0 -1.426,-0.335 -0.579,-0.343 -0.884,-0.968 -0.297,-0.633 -0.297,-1.494 0,-0.854 0.335,-1.479 0.335,-0.625 0.961,-0.968 0.633,-0.351 1.525,-0.351 0.457,0 0.862,0.084 0.412,0.084 0.762,0.236l-0.259,0.595q-0.29,-0.13 -0.656,-0.221 -0.358,-0.091 -0.747,-0.091 -0.976,0 -1.525,0.587 -0.541,0.587 -0.541,1.609 0,0.648 0.206,1.151 0.213,0.496 0.663,0.778 0.45,0.274 1.182,0.274 0.358,0 0.61,-0.038t0.457,-0.091v-1.616h-1.197z"
android:strokeLineJoin="round"
android:strokeWidth=".28854"
android:fillColor="#fff"
android:strokeLineCap="round"/>
<path
android:pathData="m39.538,46.227q0,1.014 -0.518,1.571 -0.511,0.557 -1.388,0.557 -0.541,0 -0.968,-0.244 -0.419,-0.252 -0.663,-0.724 -0.244,-0.48 -0.244,-1.159 0,-1.014 0.511,-1.563t1.388,-0.549q0.557,0 0.976,0.252 0.427,0.244 0.663,0.717 0.244,0.465 0.244,1.144zM36.45,46.227q0,0.724 0.282,1.151 0.29,0.419 0.915,0.419 0.618,0 0.907,-0.419 0.29,-0.427 0.29,-1.151t-0.29,-1.136q-0.29,-0.412 -0.915,-0.412t-0.907,0.412q-0.282,0.412 -0.282,1.136z"
android:strokeLineJoin="round"
android:strokeWidth=".28854"
android:fillColor="#fff"
android:strokeLineCap="round"/>
<path
android:pathData="m44.15,46.227q0,1.014 -0.518,1.571 -0.511,0.557 -1.388,0.557 -0.541,0 -0.968,-0.244 -0.419,-0.252 -0.663,-0.724 -0.244,-0.48 -0.244,-1.159 0,-1.014 0.511,-1.563t1.388,-0.549q0.557,0 0.976,0.252 0.427,0.244 0.663,0.717 0.244,0.465 0.244,1.144zM41.062,46.227q0,0.724 0.282,1.151 0.29,0.419 0.915,0.419 0.618,0 0.907,-0.419 0.29,-0.427 0.29,-1.151t-0.29,-1.136q-0.29,-0.412 -0.915,-0.412t-0.907,0.412q-0.282,0.412 -0.282,1.136z"
android:strokeLineJoin="round"
android:strokeWidth=".28854"
android:fillColor="#fff"
android:strokeLineCap="round"/>
<path
android:pathData="m46.659,44.115q0.404,0 0.724,0.152 0.328,0.152 0.557,0.465h0.038l0.091,-0.541h0.534v4.155q0,0.877 -0.45,1.319 -0.442,0.442 -1.38,0.442 -0.9,0 -1.472,-0.259v-0.618q0.602,0.32 1.51,0.32 0.526,0 0.823,-0.313 0.305,-0.305 0.305,-0.839v-0.16q0,-0.091 0.008,-0.259 0.008,-0.175 0.015,-0.244h-0.031q-0.412,0.618 -1.266,0.618 -0.793,0 -1.243,-0.557 -0.442,-0.557 -0.442,-1.555 0,-0.976 0.442,-1.548 0.45,-0.579 1.235,-0.579zM46.751,44.679q-0.511,0 -0.793,0.412 -0.282,0.404 -0.282,1.159 0,0.755 0.274,1.159 0.282,0.396 0.816,0.396 0.618,0 0.9,-0.328 0.282,-0.335 0.282,-1.075v-0.16q0,-0.839 -0.29,-1.197 -0.29,-0.366 -0.907,-0.366z"
android:strokeLineJoin="round"
android:strokeWidth=".28854"
android:fillColor="#fff"
android:strokeLineCap="round"/>
<path
android:pathData="m50.57,48.278h-0.671v-5.795h0.671z"
android:strokeLineJoin="round"
android:strokeWidth=".28854"
android:fillColor="#fff"
android:strokeLineCap="round"/>
<path
android:pathData="m53.445,44.115q0.526,0 0.9,0.229 0.381,0.229 0.579,0.648 0.206,0.412 0.206,0.968v0.404h-2.798q0.015,0.694 0.351,1.06 0.343,0.358 0.953,0.358 0.389,0 0.686,-0.069 0.305,-0.076 0.625,-0.213v0.587q-0.313,0.137 -0.618,0.198 -0.305,0.069 -0.724,0.069 -0.579,0 -1.029,-0.236 -0.442,-0.236 -0.694,-0.701 -0.244,-0.473 -0.244,-1.151 0,-0.671 0.221,-1.151 0.229,-0.48 0.633,-0.74 0.412,-0.259 0.953,-0.259zM53.438,44.664q-0.48,0 -0.762,0.313 -0.274,0.305 -0.328,0.854h2.082q-0.008,-0.518 -0.244,-0.839 -0.236,-0.328 -0.747,-0.328z"
android:strokeLineJoin="round"
android:strokeWidth=".28854"
android:fillColor="#fff"
android:strokeLineCap="round"/>
<path
android:pathData="m34.887,55.033q0,1.38 -0.755,2.082 -0.747,0.694 -2.089,0.694h-1.517v-5.444h1.677q0.823,0 1.426,0.305 0.602,0.305 0.93,0.9 0.328,0.587 0.328,1.464zM34.163,55.056q0,-1.09 -0.541,-1.594 -0.534,-0.511 -1.517,-0.511h-0.892v4.27h0.74q2.211,0 2.211,-2.165z"
android:strokeLineJoin="round"
android:strokeWidth=".28854"
android:fillColor="#fff"
android:strokeLineCap="round"/>
<path
android:pathData="m39.553,55.758q0,1.014 -0.518,1.571 -0.511,0.557 -1.388,0.557 -0.541,0 -0.968,-0.244 -0.419,-0.252 -0.663,-0.724 -0.244,-0.48 -0.244,-1.159 0,-1.014 0.511,-1.563t1.388,-0.549q0.557,0 0.976,0.252 0.427,0.244 0.663,0.717 0.244,0.465 0.244,1.144zM36.465,55.758q0,0.724 0.282,1.151 0.29,0.419 0.915,0.419 0.618,0 0.907,-0.419 0.29,-0.427 0.29,-1.151t-0.29,-1.136q-0.29,-0.412 -0.915,-0.412t-0.907,0.412q-0.282,0.412 -0.282,1.136z"
android:strokeLineJoin="round"
android:strokeWidth=".28854"
android:fillColor="#fff"
android:strokeLineCap="round"/>
<path
android:pathData="m42.252,57.885q-0.541,0 -0.968,-0.221 -0.419,-0.221 -0.663,-0.686 -0.236,-0.465 -0.236,-1.189 0,-0.755 0.252,-1.228t0.679,-0.694q0.435,-0.221 0.984,-0.221 0.313,0 0.602,0.069 0.29,0.061 0.473,0.152l-0.206,0.557q-0.183,-0.069 -0.427,-0.13 -0.244,-0.061 -0.457,-0.061 -1.205,0 -1.205,1.548 0,0.74 0.29,1.136 0.297,0.389 0.877,0.389 0.335,0 0.587,-0.069 0.259,-0.069 0.473,-0.168v0.595q-0.206,0.107 -0.457,0.16 -0.244,0.061 -0.595,0.061z"
android:strokeLineJoin="round"
android:strokeWidth=".28854"
android:fillColor="#fff"
android:strokeLineCap="round"/>
<path
android:pathData="m46.933,56.68q0,0.595 -0.442,0.9t-1.189,0.305q-0.427,0 -0.74,-0.069 -0.305,-0.069 -0.541,-0.191v-0.61q0.244,0.122 0.587,0.229 0.351,0.099 0.709,0.099 0.511,0 0.74,-0.16 0.229,-0.168 0.229,-0.442 0,-0.152 -0.084,-0.274 -0.084,-0.122 -0.305,-0.244 -0.213,-0.122 -0.618,-0.274 -0.396,-0.152 -0.679,-0.305 -0.282,-0.152 -0.435,-0.366t-0.152,-0.549q0,-0.518 0.419,-0.801 0.427,-0.282 1.113,-0.282 0.374,0 0.694,0.076 0.328,0.069 0.61,0.198l-0.229,0.534q-0.259,-0.107 -0.541,-0.183 -0.282,-0.076 -0.579,-0.076 -0.412,0 -0.633,0.137 -0.213,0.13 -0.213,0.358 0,0.168 0.099,0.29 0.099,0.114 0.328,0.229 0.236,0.107 0.625,0.259 0.389,0.145 0.663,0.297 0.274,0.152 0.419,0.374 0.145,0.213 0.145,0.541z"
android:strokeLineJoin="round"
android:strokeWidth=".28854"
android:fillColor="#fff"
android:strokeLineCap="round"/>
<path
android:pathData="M30.719,27.366h14.816v1.858h-14.816z"
android:fillColor="#fff"/>
<path
android:pathData="M30.718,32.386h14.816v1.858h-14.816z"
android:fillColor="#fff"/>
<path
android:pathData="M30.718,37.406h10.665v1.858h-10.665z"
android:fillColor="#fff"/>
</vector>

View file

@ -0,0 +1,72 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="85.381"
android:viewportHeight="85.381">
<path
android:strokeWidth="1"
android:pathData="m21.558,20.95c-3.247,0 -5.861,2.614 -5.861,5.861l0,5.12c0,0.043 0.002,0.086 0.003,0.129 -0.001,0.043 -0.003,0.085 -0.003,0.128l0,26.381c0,3.247 2.614,5.861 5.861,5.861l42.266,0c3.247,0 5.861,-2.614 5.861,-5.861l0,-26.381c0,-3.247 -2.614,-5.861 -5.861,-5.861l-21.521,0l-5.377,-5.377z"
android:fillColor="#649a92"
android:strokeColor="#00000000"/>
<path
android:pathData="m58.403,49.306 l-5.577,9.66l-20.272,0l10.359,-9.66z"
android:strokeLineJoin="round"
android:strokeWidth="0.21"
android:fillColor="#00000000"
android:strokeColor="#fff"/>
<path
android:pathData="m58.403,49.306 l-5.577,9.66l-20.272,0l10.359,-9.66z"
android:strokeLineJoin="round"
android:strokeWidth="0.21"
android:fillColor="#4385f6"
android:strokeColor="#00000000"/>
<path
android:pathData="m37.113,31.749l11.154,0l10.136,17.556 -13.545,-4.141z"
android:strokeLineJoin="round"
android:strokeWidth="0.21"
android:fillColor="#00000000"
android:strokeColor="#fff"/>
<path
android:pathData="m37.113,31.749l11.154,0l10.136,17.556 -13.545,-4.141z"
android:strokeLineJoin="round"
android:strokeWidth="0.21"
android:fillColor="#facb49"
android:strokeColor="#00000000"/>
<path
android:pathData="m32.554,58.966 l-5.577,-9.66 10.136,-17.556 3.186,13.801z"
android:strokeLineJoin="round"
android:strokeWidth="0.21"
android:fillColor="#00000000"
android:strokeColor="#fff"/>
<path
android:pathData="m32.554,58.966 l-5.577,-9.66 10.136,-17.556 3.186,13.801z"
android:strokeLineJoin="round"
android:strokeWidth="0.21"
android:fillColor="#15a862"
android:strokeColor="#00000000"/>
<path
android:strokeWidth="1"
android:pathData="m40.299,45.551 l2.391,-4.141 -5.577,-9.66z"
android:fillColor="#14945b"
android:strokeColor="#00000000"/>
<path
android:strokeWidth="1"
android:pathData="m42.913,49.306l-4.782,0l-5.577,9.66z"
android:fillColor="#2f6dd4"
android:strokeColor="#00000000"/>
<path
android:strokeWidth="1"
android:pathData="m44.858,45.165 l2.391,4.141l11.154,0z"
android:fillColor="#e1b741"
android:strokeColor="#00000000"/>
<path
android:pathData="m47.249,49.306 l-4.559,-7.896 -4.559,7.896z"
android:strokeWidth="0.21"
android:fillColor="#00000000"
android:strokeColor="#fff"/>
<path
android:pathData="m47.249,49.306 l-4.559,-7.896 -4.559,7.896z"
android:strokeWidth="0.21"
android:fillColor="#00000000"
android:strokeColor="#00000000"/>
</vector>

View file

@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="85.381"
android:viewportHeight="85.381">
<path
android:pathData="m18.169,23.894 l16.432,-9.487 32.695,18.682 -16.432,9.487z"
android:strokeWidth="1.3552"
android:fillColor="#ffc107"/>
<path
android:pathData="m34.201,70.974 l0.158,-18.87 32.936,-19.016 -0.084,18.828z"
android:strokeWidth="1.3552"
android:fillColor="#1976d2"/>
<path
android:pathData="m18.085,61.695 l16.116,9.279 0.315,-37.74 -16.347,-9.341z"
android:strokeWidth="1.3552"
android:fillColor="#4caf50"/>
</vector>

View file

@ -0,0 +1,126 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="85.381"
android:viewportHeight="85.381">
<path
android:pathData="m47.68,20.95l-18.312,0c-1.362,0 -2.459,1.281 -2.459,2.873l0,37.736c0,1.591 1.097,2.873 2.459,2.873l26.644,0c1.362,0 2.459,-1.281 2.459,-2.873l0,-29.841"
android:fillColor="#f5b80f"/>
<path
android:strokeWidth="1"
android:pathData="m47.68,20.95l0,10.766l10.791,0z"
android:fillColor="#fadb84"
android:strokeColor="#00000000"/>
<path
android:pathData="m32.889,45.403l1.883,0l0,2.669q-0.442,0.145 -0.892,0.213 -0.45,0.069 -1.022,0.069 -0.846,0 -1.426,-0.335 -0.579,-0.343 -0.884,-0.968 -0.297,-0.633 -0.297,-1.494 0,-0.854 0.335,-1.479 0.335,-0.625 0.961,-0.968 0.633,-0.351 1.525,-0.351 0.457,0 0.862,0.084 0.412,0.084 0.762,0.236l-0.259,0.595q-0.29,-0.13 -0.656,-0.221 -0.358,-0.091 -0.747,-0.091 -0.976,0 -1.525,0.587 -0.541,0.587 -0.541,1.609 0,0.648 0.206,1.151 0.213,0.496 0.663,0.778 0.45,0.274 1.182,0.274 0.358,0 0.61,-0.038t0.457,-0.091l0,-1.616l-1.197,0z"
android:strokeLineJoin="round"
android:strokeWidth="0.289"
android:fillColor="#fff"
android:strokeLineCap="round"/>
<path
android:pathData="m39.538,46.227q0,1.014 -0.518,1.571 -0.511,0.557 -1.388,0.557 -0.541,0 -0.968,-0.244 -0.419,-0.252 -0.663,-0.724 -0.244,-0.48 -0.244,-1.159 0,-1.014 0.511,-1.563 0.511,-0.549 1.388,-0.549 0.557,0 0.976,0.252 0.427,0.244 0.663,0.717 0.244,0.465 0.244,1.144zM36.45,46.227q0,0.724 0.282,1.151 0.29,0.419 0.915,0.419 0.618,0 0.907,-0.419 0.29,-0.427 0.29,-1.151t-0.29,-1.136q-0.29,-0.412 -0.915,-0.412t-0.907,0.412q-0.282,0.412 -0.282,1.136z"
android:strokeLineJoin="round"
android:strokeWidth="0.289"
android:fillColor="#fff"
android:strokeLineCap="round"/>
<path
android:pathData="m44.151,46.227q0,1.014 -0.518,1.571 -0.511,0.557 -1.388,0.557 -0.541,0 -0.968,-0.244 -0.419,-0.252 -0.663,-0.724 -0.244,-0.48 -0.244,-1.159 0,-1.014 0.511,-1.563 0.511,-0.549 1.388,-0.549 0.557,0 0.976,0.252 0.427,0.244 0.663,0.717 0.244,0.465 0.244,1.144zM41.063,46.227q0,0.724 0.282,1.151 0.29,0.419 0.915,0.419 0.618,0 0.907,-0.419 0.29,-0.427 0.29,-1.151t-0.29,-1.136q-0.29,-0.412 -0.915,-0.412t-0.907,0.412q-0.282,0.412 -0.282,1.136z"
android:strokeLineJoin="round"
android:strokeWidth="0.289"
android:fillColor="#fff"
android:strokeLineCap="round"/>
<path
android:pathData="m46.659,44.115q0.404,0 0.724,0.152 0.328,0.152 0.557,0.465l0.038,0l0.091,-0.541l0.534,0l0,4.155q0,0.877 -0.45,1.319 -0.442,0.442 -1.38,0.442 -0.9,0 -1.472,-0.259l0,-0.618q0.602,0.32 1.51,0.32 0.526,0 0.823,-0.313 0.305,-0.305 0.305,-0.839l0,-0.16q0,-0.091 0.008,-0.259 0.008,-0.175 0.015,-0.244l-0.03,0q-0.412,0.618 -1.266,0.618 -0.793,0 -1.243,-0.557 -0.442,-0.557 -0.442,-1.555 0,-0.976 0.442,-1.548 0.45,-0.579 1.235,-0.579zM46.75,44.679q-0.511,0 -0.793,0.412 -0.282,0.404 -0.282,1.159t0.274,1.159q0.282,0.396 0.816,0.396 0.618,0 0.9,-0.328 0.282,-0.335 0.282,-1.075l0,-0.16q0,-0.839 -0.29,-1.197 -0.29,-0.366 -0.907,-0.366z"
android:strokeLineJoin="round"
android:strokeWidth="0.289"
android:fillColor="#fff"
android:strokeLineCap="round"/>
<path
android:pathData="m50.57,48.278l-0.671,0l0,-5.795l0.671,0z"
android:strokeLineJoin="round"
android:strokeWidth="0.289"
android:fillColor="#fff"
android:strokeLineCap="round"/>
<path
android:pathData="m53.445,44.115q0.526,0 0.9,0.229 0.381,0.229 0.579,0.648 0.206,0.412 0.206,0.968l0,0.404l-2.798,0q0.015,0.694 0.351,1.06 0.343,0.358 0.953,0.358 0.389,0 0.686,-0.069 0.305,-0.076 0.625,-0.213l0,0.587q-0.313,0.137 -0.618,0.198 -0.305,0.069 -0.724,0.069 -0.579,0 -1.029,-0.236 -0.442,-0.236 -0.694,-0.701 -0.244,-0.473 -0.244,-1.151 0,-0.671 0.221,-1.151 0.229,-0.48 0.633,-0.74 0.412,-0.259 0.953,-0.259zM53.437,44.664q-0.48,0 -0.762,0.313 -0.274,0.305 -0.328,0.854l2.082,0q-0.008,-0.518 -0.244,-0.839 -0.236,-0.328 -0.747,-0.328z"
android:strokeLineJoin="round"
android:strokeWidth="0.289"
android:fillColor="#fff"
android:strokeLineCap="round"/>
<path
android:pathData="m33.613,56.352q0,0.724 -0.526,1.128t-1.418,0.404q-0.457,0 -0.846,-0.069 -0.389,-0.069 -0.648,-0.191l0,-0.656q0.274,0.122 0.679,0.221 0.412,0.099 0.846,0.099 0.61,0 0.915,-0.236 0.313,-0.236 0.313,-0.64 0,-0.267 -0.114,-0.45 -0.114,-0.183 -0.396,-0.335 -0.274,-0.16 -0.77,-0.335 -0.694,-0.252 -1.052,-0.618 -0.351,-0.366 -0.351,-0.999 0,-0.435 0.221,-0.74 0.221,-0.313 0.61,-0.48 0.396,-0.168 0.907,-0.168 0.45,0 0.823,0.084t0.679,0.221l-0.213,0.587q-0.282,-0.122 -0.618,-0.206 -0.328,-0.084 -0.686,-0.084 -0.511,0 -0.77,0.221 -0.259,0.213 -0.259,0.572 0,0.274 0.114,0.457t0.374,0.328 0.701,0.313q0.48,0.175 0.808,0.381 0.335,0.198 0.503,0.48 0.175,0.282 0.175,0.709z"
android:strokeLineJoin="round"
android:strokeWidth="0.289"
android:fillColor="#fff"
android:strokeLineCap="round"/>
<path
android:pathData="m35.291,57.808l-0.671,0l0,-5.795l0.671,0z"
android:strokeLineJoin="round"
android:strokeWidth="0.289"
android:fillColor="#fff"
android:strokeLineCap="round"/>
<path
android:pathData="m36.93,52.189q0.152,0 0.267,0.107 0.122,0.099 0.122,0.32 0,0.213 -0.122,0.32 -0.114,0.107 -0.267,0.107 -0.168,0 -0.282,-0.107t-0.114,-0.32q0,-0.221 0.114,-0.32 0.114,-0.107 0.282,-0.107zM37.258,53.722l0,4.087l-0.671,0l0,-4.087z"
android:strokeLineJoin="round"
android:strokeWidth="0.289"
android:fillColor="#fff"
android:strokeLineCap="round"/>
<path
android:pathData="m40.003,57.885q-0.762,0 -1.22,-0.526 -0.457,-0.534 -0.457,-1.586t0.457,-1.586q0.465,-0.541 1.228,-0.541 0.473,0 0.77,0.175 0.305,0.175 0.496,0.427l0.046,0q-0.008,-0.099 -0.03,-0.29 -0.015,-0.198 -0.015,-0.313l0,-1.632l0.671,0l0,5.795l-0.541,0l-0.099,-0.549l-0.03,0q-0.183,0.259 -0.488,0.442 -0.305,0.183 -0.785,0.183zM40.109,57.328q0.648,0 0.907,-0.351 0.267,-0.358 0.267,-1.075l0,-0.122q0,-0.762 -0.252,-1.167 -0.252,-0.412 -0.93,-0.412 -0.541,0 -0.816,0.435 -0.267,0.427 -0.267,1.151 0,0.732 0.267,1.136 0.274,0.404 0.823,0.404z"
android:strokeLineJoin="round"
android:strokeWidth="0.289"
android:fillColor="#fff"
android:strokeLineCap="round"/>
<path
android:pathData="m44.821,53.646q0.526,0 0.9,0.229 0.381,0.229 0.579,0.648 0.206,0.412 0.206,0.968l0,0.404l-2.798,0q0.015,0.694 0.351,1.06 0.343,0.358 0.953,0.358 0.389,0 0.686,-0.069 0.305,-0.076 0.625,-0.213l0,0.587q-0.313,0.137 -0.618,0.198 -0.305,0.069 -0.724,0.069 -0.579,0 -1.029,-0.236 -0.442,-0.236 -0.694,-0.701 -0.244,-0.473 -0.244,-1.151 0,-0.671 0.221,-1.151 0.229,-0.48 0.633,-0.74 0.412,-0.259 0.953,-0.259zM44.814,54.195q-0.48,0 -0.762,0.313 -0.274,0.305 -0.328,0.854l2.082,0q-0.008,-0.518 -0.244,-0.839 -0.236,-0.328 -0.747,-0.328z"
android:strokeLineJoin="round"
android:strokeWidth="0.289"
android:fillColor="#fff"
android:strokeLineCap="round"/>
<path
android:pathData="m50.204,56.68q0,0.595 -0.442,0.9t-1.189,0.305q-0.427,0 -0.74,-0.069 -0.305,-0.069 -0.541,-0.191l0,-0.61q0.244,0.122 0.587,0.229 0.351,0.099 0.709,0.099 0.511,0 0.74,-0.16 0.229,-0.168 0.229,-0.442 0,-0.152 -0.084,-0.274t-0.305,-0.244q-0.213,-0.122 -0.618,-0.274 -0.396,-0.152 -0.679,-0.305t-0.435,-0.366 -0.152,-0.549q0,-0.518 0.419,-0.801 0.427,-0.282 1.113,-0.282 0.374,0 0.694,0.076 0.328,0.069 0.61,0.198l-0.229,0.534q-0.259,-0.107 -0.541,-0.183t-0.579,-0.076q-0.412,0 -0.633,0.137 -0.213,0.13 -0.213,0.358 0,0.168 0.099,0.29 0.099,0.114 0.328,0.229 0.236,0.107 0.625,0.259 0.389,0.145 0.663,0.297t0.419,0.374q0.145,0.213 0.145,0.541z"
android:strokeLineJoin="round"
android:strokeWidth="0.289"
android:fillColor="#fff"
android:strokeLineCap="round"/>
<path
android:pathData="M32.41,24.801L43.282,24.801A1.088,1.088 0,0 1,44.37 25.888L44.37,27.067A1.088,1.088 0,0 1,43.282 28.155L32.41,28.155A1.088,1.088 0,0 1,31.323 27.067L31.323,25.888A1.088,1.088 0,0 1,32.41 24.801z"
android:strokeWidth="0.438"
android:fillColor="#00000000"
android:strokeColor="#fff"/>
<path
android:pathData="M32.41,24.801L43.282,24.801A1.088,1.088 0,0 1,44.37 25.888L44.37,27.067A1.088,1.088 0,0 1,43.282 28.155L32.41,28.155A1.088,1.088 0,0 1,31.323 27.067L31.323,25.888A1.088,1.088 0,0 1,32.41 24.801z"
android:strokeWidth="0.438"
android:fillColor="#fff"
android:strokeColor="#00000000"/>
<path
android:pathData="M32.41,34.469L43.282,34.469A1.088,1.088 0,0 1,44.37 35.557L44.37,36.736A1.088,1.088 0,0 1,43.282 37.823L32.41,37.823A1.088,1.088 0,0 1,31.323 36.736L31.323,35.557A1.088,1.088 0,0 1,32.41 34.469z"
android:strokeWidth="0.438"
android:fillColor="#00000000"
android:strokeColor="#fff"/>
<path
android:pathData="M32.41,34.469L43.282,34.469A1.088,1.088 0,0 1,44.37 35.557L44.37,36.736A1.088,1.088 0,0 1,43.282 37.823L32.41,37.823A1.088,1.088 0,0 1,31.323 36.736L31.323,35.557A1.088,1.088 0,0 1,32.41 34.469z"
android:strokeWidth="0.438"
android:fillColor="#fff"
android:strokeColor="#00000000"/>
<path
android:pathData="M31.952,26.481L31.952,26.481A1.087,0.722 90,0 1,32.674 27.568L32.674,35.056A1.087,0.722 90,0 1,31.952 36.142L31.952,36.142A1.087,0.722 90,0 1,31.23 35.056L31.23,27.568A1.087,0.722 90,0 1,31.952 26.481z"
android:strokeWidth="0.253"
android:fillColor="#00000000"
android:strokeColor="#fff"/>
<path
android:pathData="M31.952,26.481L31.952,26.481A1.087,0.722 90,0 1,32.674 27.568L32.674,35.056A1.087,0.722 90,0 1,31.952 36.142L31.952,36.142A1.087,0.722 90,0 1,31.23 35.056L31.23,27.568A1.087,0.722 90,0 1,31.952 26.481z"
android:strokeWidth="0.253"
android:fillColor="#fff"
android:strokeColor="#00000000"/>
<path
android:pathData="M43.718,26.481L43.718,26.481A1.087,0.722 90,0 1,44.44 27.568L44.44,35.056A1.087,0.722 90,0 1,43.718 36.142L43.718,36.142A1.087,0.722 90,0 1,42.996 35.056L42.996,27.568A1.087,0.722 90,0 1,43.718 26.481z"
android:strokeWidth="0.253"
android:fillColor="#00000000"
android:strokeColor="#fff"/>
<path
android:pathData="M43.718,26.481L43.718,26.481A1.087,0.722 90,0 1,44.44 27.568L44.44,35.056A1.087,0.722 90,0 1,43.718 36.142L43.718,36.142A1.087,0.722 90,0 1,42.996 35.056L42.996,27.568A1.087,0.722 90,0 1,43.718 26.481z"
android:strokeWidth="0.253"
android:fillColor="#fff"
android:strokeColor="#00000000"/>
</vector>