Better Material You integration

This commit is contained in:
Balazs Toldi 2022-09-21 08:13:48 +02:00
parent cee98fd0f4
commit fc04223798
Signed by: Bazsalanszky
GPG key ID: 6C7D440036F99D58
4 changed files with 158 additions and 42 deletions

View file

@ -1,18 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetDropDown">
<runningDeviceTargetSelectedWithDropDown>
<Target>
<type value="RUNNING_DEVICE_TARGET" />
<deviceKey>
<Key>
<type value="SERIAL_NUMBER" />
<value value="adb-a3950b57-giqMub._adb-tls-connect._tcp" />
</Key>
</deviceKey>
</Target>
</runningDeviceTargetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2022-09-06T09:57:52.303689Z" />
<targetsSelectedWithDialog>
<Target>
<type value="QUICK_BOOT_TARGET" />

View file

@ -32,13 +32,17 @@ import androidx.compose.ui.unit.dp
import androidx.core.content.ContextCompat
import androidx.documentfile.provider.DocumentFile
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.NavController
import androidx.navigation.NavHostController
import androidx.navigation.NavType
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import androidx.navigation.navArgument
import coil.compose.AsyncImage
import coil.compose.rememberImagePainter
import com.google.accompanist.systemuicontroller.rememberSystemUiController
import com.yausername.ffmpeg.FFmpeg
import com.yausername.youtubedl_android.YoutubeDL
import com.yausername.youtubedl_android.YoutubeDLException
@ -51,8 +55,11 @@ import su.litvak.chromecast.api.v2.ChromeCast
import su.litvak.chromecast.api.v2.Media
import su.litvak.chromecast.api.v2.MediaStatus
import java.io.File
import java.util.*
import java.util.regex.Matcher
import java.util.regex.Pattern
import kotlin.collections.ArrayList
import kotlin.collections.LinkedHashMap
data class BottomNavItem(
@ -142,7 +149,7 @@ class ChromecastManagerActivity : ComponentActivity() {
private lateinit var chromeCast: ChromeCast
private lateinit var viewModel: ChromecastManageViewmodel
private lateinit var navController: NavHostController
@RequiresApi(Build.VERSION_CODES.O)
override fun onCreate(savedInstanceState: Bundle?) {
@ -170,9 +177,15 @@ class ChromecastManagerActivity : ComponentActivity() {
setContent {
CasterTheme {
colorScheme = getColorScheme()
val systemUiController = rememberSystemUiController()
systemUiController.setStatusBarColor(
color = colorScheme.primary,
darkIcons = true
)
// remember navController so it does not
// get recreated on recomposition
val navController = rememberNavController()
navController = rememberNavController()
Surface(color = colorScheme.background, contentColor = colorScheme.onBackground) {
@ -231,7 +244,18 @@ class ChromecastManagerActivity : ComponentActivity() {
// route : profile
composable("settings") {
SettingsScreen()
Column {
MenuBar()
SettingsScreen()
}
}
composable("folderView/{folder}", listOf(navArgument("folder") { type = NavType.StringType}))
{ backStackEntry ->
Column {
MenuBar()
imageGrid(context = application, folderArg = backStackEntry.arguments?.getString("folder")!! )
}
}
})
@ -568,7 +592,11 @@ class ChromecastManagerActivity : ComponentActivity() {
.fillMaxSize(),
// parameters set to place the items in center
) {
Row() {
Row(
Modifier.padding(all = 10.dp),
horizontalArrangement = Arrangement.Start,
verticalAlignment = Alignment.CenterVertically
) {
Text("Enable SponsorBlock")
var switched by remember {
mutableStateOf(
@ -601,10 +629,12 @@ class ChromecastManagerActivity : ComponentActivity() {
Card(modifier = Modifier
.fillMaxWidth()
.clickable {
val intent = Intent(applicationContext, FolderViewActivity::class.java)
/* val intent = Intent(applicationContext, FolderViewActivity::class.java)
FolderViewActivity.chromecastRecv = chromeCast
FolderViewActivity.folderRecv = folders[index]
startActivity(intent)
startActivity(intent)*/
navController.navigate("folderView/${Base64.getEncoder().encodeToString(folders[index].uri.toString().toByteArray())}")
}) {
Row(
modifier = Modifier

View file

@ -1,11 +1,14 @@
package eu.toldi.balazs.caster
import android.annotation.SuppressLint
import android.content.Context
import android.net.Uri
import android.os.Bundle
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material3.MaterialTheme
import androidx.compose.material.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
@ -16,6 +19,7 @@ import androidx.compose.foundation.layout.*
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.Role.Companion.Image
import androidx.compose.ui.text.input.KeyboardType.Companion.Uri
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.documentfile.provider.DocumentFile
@ -36,6 +40,7 @@ import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import su.litvak.chromecast.api.v2.ChromeCast
import java.io.File
import java.util.*
class FolderViewActivity : ComponentActivity() {
@ -55,7 +60,7 @@ class FolderViewActivity : ComponentActivity() {
setContent {
CasterTheme {
// A surface container using the 'background' color from the theme
Surface(color = MaterialTheme.colors.background) {
Surface(color = MaterialTheme.colorScheme.background) {
Column(modifier = Modifier.fillMaxSize()) {
MenuBar(title = folder.name!!)
val images = folder.listFiles()
@ -173,6 +178,7 @@ class FolderViewActivity : ComponentActivity() {
}
}
@Composable
fun MenuBar(title: String) {
TopAppBar(
@ -199,3 +205,52 @@ class FolderViewActivity : ComponentActivity() {
}
}
@Composable
fun imageGrid(context : Context, folderArg: String) {
Log.e("Base64",folderArg)
val folder = DocumentFile.fromSingleUri(context, android.net.Uri.parse(Base64.getDecoder().decode(folderArg).toString()))!!
val images = folder.listFiles()
.filter { it.name?.endsWith(".png") ?: false || it.name?.endsWith(".jpg") ?: false }
val cacheHelper = FileCacheHelper(context)
val row_count = images.size / 3 + 1
LazyColumn(modifier = Modifier.fillMaxWidth()) {
items(row_count) { index ->
Row(modifier = Modifier.fillMaxWidth()) {
for (i in 0 until 3) {
if (index + i >= images.size) break
val imageFile = if (images[index + i].exists()) {
cacheHelper.cacheThis(listOf(images[index + i].uri))
File(context.cacheDir, cacheHelper.tryFileName(images[index + i].uri))
} else {
File(context.cacheDir, cacheHelper.tryFileName(images[index + i].uri))
}
Card(
modifier = Modifier
.padding(all = 5.dp)
.weight(1f)
) {
Column {
Column(
modifier = Modifier
.height(100.dp)
.width(100.dp)
.padding(10.dp)
) {
Image(
painter = rememberImagePainter(
data = imageFile
),
contentDescription = null,
modifier = Modifier.fillMaxWidth()
)
}
}
}
}
}
}
}
}

View file

@ -2,6 +2,7 @@ package eu.toldi.balazs.caster
import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Color
import android.graphics.ColorSpace.adapt
import android.net.wifi.WifiManager
import android.net.wifi.WifiManager.MulticastLock
@ -26,6 +27,7 @@ import androidx.compose.material.Icon
import androidx.compose.material.MaterialTheme
import androidx.compose.material.OutlinedTextField
import androidx.compose.material.Text
import androidx.compose.material.TextFieldDefaults
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Refresh
@ -34,6 +36,7 @@ import androidx.compose.runtime.*
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color.Companion.Transparent
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
@ -42,14 +45,13 @@ import androidx.compose.ui.unit.dp
import androidx.lifecycle.ViewModelProvider
import com.google.accompanist.swiperefresh.SwipeRefresh
import com.google.accompanist.swiperefresh.rememberSwipeRefreshState
import com.google.accompanist.systemuicontroller.rememberSystemUiController
import eu.toldi.balazs.caster.model.ChromeCastViewModel
import eu.toldi.balazs.caster.ui.theme.CasterTheme
import eu.toldi.balazs.caster.ui.theme.getColorScheme
import su.litvak.chromecast.api.v2.ChromeCast
open class MainActivity : ComponentActivity() {
protected lateinit var viewModel: ChromeCastViewModel
@ -84,17 +86,27 @@ open class MainActivity : ComponentActivity() {
super.onCreate(savedInstanceState)
setContent {
CasterTheme {
colorScheme = getColorScheme()
viewModel = ViewModelProvider(this).get(ChromeCastViewModel::class.java)
val systemUiController = rememberSystemUiController()
systemUiController.setStatusBarColor(
color = colorScheme.primary,
darkIcons = true
)
val chromeCastState = viewModel.chromeCasts.observeAsState(initial = emptyList())
val chromeCasts = chromeCastState.value
Log.e(null, chromeCasts.toString())
// A surface container using the 'background' color from the theme
Surface(color = colorScheme.background, contentColor = colorScheme.onBackground) {
Column(modifier = Modifier
.fillMaxWidth()
.fillMaxHeight()) {
Column(
modifier = Modifier
.fillMaxWidth()
.fillMaxHeight()
) {
var isAddChromecastDialogOpen by remember {
mutableStateOf(false)
}
@ -141,13 +153,19 @@ open class MainActivity : ComponentActivity() {
) {
item {
if (chromeCasts.isNotEmpty())
Text(text = stringResource(id = R.string.available_chromecasts),color =colorScheme.onBackground)
Text(
text = stringResource(id = R.string.available_chromecasts),
color = colorScheme.onBackground
)
else {
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(text = stringResource(id = R.string.looking_for_devices),color= colorScheme.onBackground)
Text(
text = stringResource(id = R.string.looking_for_devices),
color = colorScheme.onBackground
)
CircularProgressIndicator(color = colorScheme.secondary)
}
}
@ -170,7 +188,10 @@ open class MainActivity : ComponentActivity() {
}
AlertDialog(onDismissRequest = dismiss,
title = {
Text(text = stringResource(id = R.string.add_chromecast),color= colorScheme.onBackground)
Text(
text = stringResource(id = R.string.add_chromecast),
color = colorScheme.onBackground
)
},
text = {
OutlinedTextField(
@ -178,8 +199,19 @@ open class MainActivity : ComponentActivity() {
onValueChange = {
ipaddress = it
},
label = { Text(stringResource(id = R.string.ip_address),color= colorScheme.onBackground) },
modifier = Modifier.padding(vertical = 4.dp)
label = {
Text(
stringResource(id = R.string.ip_address),
color = colorScheme.onBackground
)
},
modifier = Modifier.padding(vertical = 4.dp),
colors = TextFieldDefaults.outlinedTextFieldColors(
cursorColor = colorScheme.primary,
focusedBorderColor =
colorScheme.primary.copy(alpha = ContentAlpha.high),
focusedLabelColor = colorScheme.primary
)
)
}, buttons = {
Row(
@ -191,16 +223,23 @@ open class MainActivity : ComponentActivity() {
add(ipaddress)
dismiss()
},
colors = ButtonDefaults.buttonColors(backgroundColor = colorScheme.primary, contentColor = colorScheme.onPrimary),
colors = ButtonDefaults.buttonColors(
backgroundColor = colorScheme.primary,
contentColor = colorScheme.onPrimary
),
modifier = Modifier.padding(all = 8.dp),
) {
) {
Text(text = stringResource(id = R.string.add_chromecast))
}
Button(
onClick = dismiss,
colors = ButtonDefaults.buttonColors(backgroundColor = colorScheme.primary, contentColor = colorScheme.onPrimary),
modifier = Modifier.padding(all = 8.dp)) {
colors = ButtonDefaults.buttonColors(
backgroundColor = colorScheme.primary,
contentColor = colorScheme.onPrimary
),
modifier = Modifier.padding(all = 8.dp)
) {
Text(stringResource(id = R.string.cancel))
}
}
@ -209,11 +248,13 @@ open class MainActivity : ComponentActivity() {
@Composable
fun showChromeCastButton(chromeCast: ChromeCast,buttonCallBack: () -> Unit = {
ChromecastManagerActivity.chromeCast_ = chromeCast
val intent = Intent(applicationContext, ChromecastManagerActivity::class.java)
startActivity(intent)
}) {
fun showChromeCastButton(
chromeCast: ChromeCast, buttonCallBack: () -> Unit = {
ChromecastManagerActivity.chromeCast_ = chromeCast
val intent = Intent(applicationContext, ChromecastManagerActivity::class.java)
startActivity(intent)
}
) {
Column(
Modifier
.fillMaxWidth()
@ -244,10 +285,12 @@ open class MainActivity : ComponentActivity() {
)
}
Column(modifier = Modifier
.fillMaxWidth()
.height(80.dp),
verticalArrangement = Arrangement.Center) {
Column(
modifier = Modifier
.fillMaxWidth()
.height(80.dp),
verticalArrangement = Arrangement.Center
) {
Text(
text = "Name: " + when {
chromeCast.title != null -> chromeCast.title