diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index a55641d..6d72dc6 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -1,18 +1,6 @@ - - - - - - - - - - - - diff --git a/app/src/main/java/eu/toldi/balazs/caster/ChromecastManagerActivity.kt b/app/src/main/java/eu/toldi/balazs/caster/ChromecastManagerActivity.kt index 578e1c7..dcb9b74 100644 --- a/app/src/main/java/eu/toldi/balazs/caster/ChromecastManagerActivity.kt +++ b/app/src/main/java/eu/toldi/balazs/caster/ChromecastManagerActivity.kt @@ -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 diff --git a/app/src/main/java/eu/toldi/balazs/caster/FolderViewActivity.kt b/app/src/main/java/eu/toldi/balazs/caster/FolderViewActivity.kt index 846064d..1913b65 100644 --- a/app/src/main/java/eu/toldi/balazs/caster/FolderViewActivity.kt +++ b/app/src/main/java/eu/toldi/balazs/caster/FolderViewActivity.kt @@ -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() + ) + } + } + } + } + } + } + } +} + diff --git a/app/src/main/java/eu/toldi/balazs/caster/MainActivity.kt b/app/src/main/java/eu/toldi/balazs/caster/MainActivity.kt index 84e0d2e..1ca9089 100644 --- a/app/src/main/java/eu/toldi/balazs/caster/MainActivity.kt +++ b/app/src/main/java/eu/toldi/balazs/caster/MainActivity.kt @@ -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