diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ac22ae4..cea2e01 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -100,7 +100,7 @@ dependencies { // Compose extras library for controlling system ui and etc. implementation("com.google.accompanist:accompanist-systemuicontroller:0.31.2-alpha") - implementation("com.github.doyaaaaaken:kotlin-csv-jvm:1.8.0") + implementation("com.github.doyaaaaaken:kotlin-csv-jvm:1.9.1") testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") @@ -110,4 +110,6 @@ dependencies { debugImplementation("androidx.compose.ui:ui-test-manifest") implementation("androidx.core:core-splashscreen:1.0.1") implementation("androidx.navigation:navigation-compose:2.6.0") + implementation("io.coil-kt:coil:2.4.0") + implementation("io.coil-kt:coil-compose:2.4.0") } diff --git a/app/src/main/java/com/illusionware/npsbrowser/Preferences.kt b/app/src/main/java/com/illusionware/npsbrowser/Preferences.kt index 1d6107e..1dc03b3 100644 --- a/app/src/main/java/com/illusionware/npsbrowser/Preferences.kt +++ b/app/src/main/java/com/illusionware/npsbrowser/Preferences.kt @@ -8,6 +8,7 @@ import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.intPreferencesKey import androidx.datastore.preferences.core.stringPreferencesKey import androidx.datastore.preferences.preferencesDataStore +import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map enum class ConsoleType { @@ -24,6 +25,11 @@ enum class DataType { THEMES, } +enum class Layout { + LIST, + GRID, +} + class Preferences(private val context: Context) { companion object { private val Context.dataStore by preferencesDataStore("settings") @@ -53,7 +59,7 @@ class Preferences(private val context: Context) { } val layout = context.dataStore.data.map{ prefs -> - prefs[DATA_LAYOUT] ?: 0 + prefs[DATA_LAYOUT] ?: Layout.LIST.ordinal } val seenOnboarding = context.dataStore.data.map{ prefs -> @@ -180,7 +186,20 @@ class Preferences(private val context: Context) { } } } + } + suspend fun getAvailableTsvs(): List> { + val list = mutableListOf>() + if (psvGames.first().isNotEmpty()) list.add(Pair(ConsoleType.PSVITA, DataType.GAMES)) + if (psvDLC.first().isNotEmpty()) list.add(Pair(ConsoleType.PSVITA, DataType.DLC)) + if (psvThemes.first().isNotEmpty()) list.add(Pair(ConsoleType.PSVITA, DataType.THEMES)) + if (ps3Games.first().isNotEmpty()) list.add(Pair(ConsoleType.PS3, DataType.GAMES)) + if (ps3DLC.first().isNotEmpty()) list.add(Pair(ConsoleType.PS3, DataType.DLC)) + if (pspGames.first().isNotEmpty()) list.add(Pair(ConsoleType.PSP, DataType.GAMES)) + if (pspDLC.first().isNotEmpty()) list.add(Pair(ConsoleType.PSP, DataType.DLC)) + if (psxGames.first().isNotEmpty()) list.add(Pair(ConsoleType.PSX, DataType.GAMES)) + if (psmGames.first().isNotEmpty()) list.add(Pair(ConsoleType.PSM, DataType.GAMES)) + return list } suspend fun setHMACKey(key: String) { @@ -224,4 +243,4 @@ class Preferences(private val context: Context) { prefs[PKG2ZIP_AUTO_DECRYPT] = autoDecrypt } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/illusionware/npsbrowser/activities/MainActivity.kt b/app/src/main/java/com/illusionware/npsbrowser/activities/MainActivity.kt index 82bcf97..e4762da 100644 --- a/app/src/main/java/com/illusionware/npsbrowser/activities/MainActivity.kt +++ b/app/src/main/java/com/illusionware/npsbrowser/activities/MainActivity.kt @@ -3,17 +3,29 @@ package com.illusionware.npsbrowser.activities import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.background +import androidx.compose.foundation.basicMarquee import androidx.compose.foundation.clickable import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material.icons.filled.Close @@ -23,6 +35,9 @@ import androidx.compose.material.icons.filled.Settings import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.NavigationBar +import androidx.compose.material3.NavigationBarItem +import androidx.compose.material3.ProvideTextStyle import androidx.compose.material3.Scaffold import androidx.compose.material3.Surface import androidx.compose.material3.Text @@ -40,18 +55,32 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.painter.ColorPainter +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.layout.Layout +import androidx.compose.ui.layout.layoutId import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.Font +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController +import coil.compose.AsyncImage +import coil.request.ImageRequest +import com.illusionware.npsbrowser.ConsoleType +import com.illusionware.npsbrowser.Layout import com.illusionware.npsbrowser.Preferences import com.illusionware.npsbrowser.R import com.illusionware.npsbrowser.ui.theme.ColorAccent @@ -60,12 +89,18 @@ import com.illusionware.npsbrowser.ui.theme.Typography import com.illusionware.npsbrowser.ui.components.* import com.illusionware.npsbrowser.ui.pages.SettingsScreen import com.illusionware.npsbrowser.ui.pages.OnBoarding +import com.illusionware.npsbrowser.ui.theme.ColorOnPrimaryLight import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking +val PlaceholderColor = Color(0x1F888888) +val redHatDisplayFamily = FontFamily( + Font(R.font.red_hat_display_bold, FontWeight.Bold), +) + class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -128,13 +163,18 @@ fun Router() { @OptIn(ExperimentalMaterial3Api::class) @Composable -@Preview() +@Preview fun HomePage(navigateToSettings: () -> Unit = {}) { + val prefs = Preferences(LocalContext.current) var isSearchOpen by rememberSaveable { mutableStateOf(false)} var searchQuery by rememberSaveable { mutableStateOf("")} val searchBar = remember { FocusRequester() } var layoutDialogOpen by remember { mutableStateOf(false) } + val tsvs by remember { runBlocking { mutableStateOf(prefs.getAvailableTsvs()) }} + var selectedBarItem by remember { mutableStateOf(ConsoleType.PSVITA) } +// val noTsvs by remember { mutableStateOf(false) } + Scaffold( topBar = { TopAppBar( @@ -213,12 +253,27 @@ fun HomePage(navigateToSettings: () -> Unit = {}) { } } ) + }, + bottomBar = { + if (tsvs.isNotEmpty()) { + NavBar( + selectedTab = selectedBarItem, + onTabSelected = { selectedBarItem = it }, + ) + } } ) { padding -> Column(Modifier.padding(padding)) { - NoTsvs(navigateToSettings = navigateToSettings) + if (tsvs.isEmpty()) { + NoTsvs(navigateToSettings = navigateToSettings) + } else { +// when (selectedBarItem) { +// ConsoleType.PSVITA -> VitaPage(searchQuery = searchQuery) +// ConsoleType.PS3 -> PS3Page(searchQuery = searchQuery) +// } + PackageList(selectedBarItem) + } } - // TODO: only show NoTsvs when there are no Tsvs loaded if (layoutDialogOpen) { LayoutDialog(onDismiss = { layoutDialogOpen = false }) @@ -226,6 +281,52 @@ fun HomePage(navigateToSettings: () -> Unit = {}) { } } +@Composable +fun NavBar(selectedTab: ConsoleType, onTabSelected: (ConsoleType) -> Unit) { + NavigationBar { + NavigationBarItem( + selected = selectedTab == ConsoleType.PSVITA, + icon = { Icon(painterResource(id = R.drawable.vita_icon), contentDescription = "PS Vita") }, + label = { Text(text = "PS Vita") }, + onClick = { + onTabSelected(ConsoleType.PSVITA) + } + ) + NavigationBarItem( + selected = selectedTab == ConsoleType.PS3, + icon = { Icon(painterResource(id = R.drawable.ps3_icon), contentDescription = "PS3") }, + label = { Text(text = "PS3") }, + onClick = { + onTabSelected(ConsoleType.PS3) + } + ) + NavigationBarItem( + selected = selectedTab == ConsoleType.PSP, + icon = { Icon(painterResource(id = R.drawable.psp_icon), contentDescription = "PSP") }, + label = { Text(text = "PSP") }, + onClick = { + onTabSelected(ConsoleType.PSP) + } + ) + NavigationBarItem( + selected = selectedTab == ConsoleType.PSX, + icon = { Icon(painterResource(id = R.drawable.psx_icon), contentDescription = "PSX") }, + label = { Text(text = "PSX") }, + onClick = { + onTabSelected(ConsoleType.PSX) + } + ) + NavigationBarItem( + selected = selectedTab == ConsoleType.PSM, + icon = { Icon(painterResource(id = R.drawable.psm_icon), contentDescription = "PSM") }, + label = { Text(text = "PSM") }, + onClick = { + onTabSelected(ConsoleType.PSM) + } + ) + } +} + @Composable @Preview fun NoTsvs(padding: PaddingValues = PaddingValues(0.dp), navigateToSettings: () -> Unit = {}) { @@ -267,9 +368,229 @@ fun NoTsvs(padding: PaddingValues = PaddingValues(0.dp), navigateToSettings: () } @Composable -fun LayoutDialog(onDismiss: () -> Unit = {}) { +@Preview +fun PackageList(type: ConsoleType = ConsoleType.PSVITA) { val prefs = Preferences(LocalContext.current) - val layout = prefs.layout.collectAsState(initial = "") + val layout = prefs.layout.collectAsState(initial = Layout.LIST.ordinal).value +// val thing = when (type) { +// ConsoleType.PSVITA -> { +// var list = ArrayList() +// list.add(Package("test")) +// val gs = prefs.psvGames.collectAsState(initial = emptyList()) +// list.add(gs.value) +// } +// ConsoleType.PS3 -> { +// prefs.ps3Games.collectAsState(initial = emptyList()) +// } +// ConsoleType.PSP -> { +// prefs.pspGames.collectAsState(initial = emptyList()) +// } +// ConsoleType.PSX -> { +// prefs.psxGames.collectAsState(initial = emptyList()) +// } +// ConsoleType.PSM -> { +// prefs.psmGames.collectAsState(initial = emptyList()) +// } +// } + + Column(Modifier.fillMaxSize()) { + if (layout == Layout.LIST.ordinal) { + LazyColumn { + items(15) { + PackageListItem() + } + } + } else { + LazyVerticalGrid( + columns = GridCells.Adaptive(140.dp), + contentPadding = PaddingValues(8.dp), + ) { + items(15) { + PackageGridItem() + } + } + } + } +} + +@OptIn(ExperimentalFoundationApi::class) +@Composable +fun PackageListItem() { + Box( + Modifier + .fillMaxWidth() + .clickable { /* TODO: */ }) { + Row( + modifier = Modifier + .padding(horizontal = 16.dp, vertical = 8.dp) + .fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(16.dp) + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(16.dp), + modifier = Modifier.weight(1.0f) + ) { + AsyncImage( + model = ImageRequest.Builder(LocalContext.current) + .data("https://picsum.photos/200") + .crossfade(true) + .error(R.drawable.default_game_icon) + .build(), + placeholder = ColorPainter(PlaceholderColor), + contentDescription = "Package Icon", + modifier = Modifier.size(48.dp), + contentScale = ContentScale.Crop, + ) + Column( + verticalArrangement = Arrangement.spacedBy(2.dp), + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + Text( + text = "10 Second Ninja X", + color = MaterialTheme.colorScheme.onBackground, + style = Typography.bodyLarge, + overflow = TextOverflow.Ellipsis, + maxLines = 2, + modifier = Modifier + .width(IntrinsicSize.Min) + .weight(1.0f) + ) + } + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(12.dp), + ) { + ProvideTextStyle(value = Typography.bodySmall.copy(color = MaterialTheme.colorScheme.outline)) { + Text(text = "US") + Text(text = "3.69") + Text(text = "223.8MB") + Tag(title = "GAME", small = true) + } + } + } + } + Column { + Icon( + painter = painterResource(id = R.drawable.no_url_icon), + contentDescription = "No PKG URL", + tint = Color(0xFFCB5A5A) + ) + Icon( + painter = painterResource(id = R.drawable.no_key_icon), + contentDescription = "No Zrif Key", + tint = Color(0xFFCB5A5A) + ) + } + } + } +} + +@Composable +fun Tag(title: String, small: Boolean = false) { + Box( + Modifier + .clip(RoundedCornerShape(4.dp)) + .background(Color(0xFFEAF654)) + .layoutId("tag") + .padding(horizontal = if (small) 6.dp else 8.dp, vertical = if (small) 2.dp else 4.dp) + ) { + Text( + text = title.uppercase(), + color = ColorOnPrimaryLight, + style = Typography.bodySmall.copy( + fontWeight = FontWeight.Bold, + fontFamily = redHatDisplayFamily, + fontSize = if (small) 8.sp else 12.sp + ) + ) + } +} + +@Composable +@Preview +fun PackageGridItem() { + Box( + Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(8.dp)) + .clickable { /* TODO: */ } + ) { + Column( + verticalArrangement = Arrangement.spacedBy(8.dp), + horizontalAlignment = Alignment.Start, + modifier = Modifier.padding(8.dp) + ) { + Layout( + content = { + AsyncImage( + model = ImageRequest.Builder(LocalContext.current) + .data("https://picsum.photos/200") + .crossfade(true) + .error(R.drawable.default_game_icon) + .build(), + placeholder = ColorPainter(PlaceholderColor), + contentDescription = "Package Icon", + modifier = Modifier + .aspectRatio(1f / 1f) + .fillMaxWidth(), + contentScale = ContentScale.Crop, + ) + Tag(title = "GAME") + } + ) { measurables, constraints -> + val imagePlaceable = measurables[0].measure(constraints) + val tagPlaceable = measurables.first { it.layoutId == "tag" }.measure(constraints) + + layout(imagePlaceable.width, imagePlaceable.height) { + imagePlaceable.placeRelative(0, 0) + tagPlaceable.placeRelative( + x = imagePlaceable.width - tagPlaceable.width - 16, + y = 16, + ) + } + } + Text( + text = "10 Second Ninja X", + color = MaterialTheme.colorScheme.onBackground, + style = Typography.bodyLarge, + overflow = TextOverflow.Ellipsis, + maxLines = 2, + ) + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + ProvideTextStyle(value = Typography.bodySmall.copy(color = MaterialTheme.colorScheme.outline)) { + Text(text = "US") + Text(text = "3.69") + Text(text = "223.8MB") + } + } + Row { + Icon( + painter = painterResource(id = R.drawable.no_url_icon), + contentDescription = "No PKG URL", + tint = Color(0xFFCB5A5A) + ) + Icon( + painter = painterResource(id = R.drawable.no_key_icon), + contentDescription = "No Zrif Key", + tint = Color(0xFFCB5A5A) + ) + } + } + } +} + +@Composable +fun LayoutDialog(onDismiss: () -> Unit) { + val prefs = Preferences(LocalContext.current) + val layout = prefs.layout.collectAsState(initial = Layout.LIST.ordinal).value NPSAlertDialog( onDismiss = onDismiss, @@ -283,13 +604,13 @@ fun LayoutDialog(onDismiss: () -> Unit = {}) { Column { NPSRadioButton( text = "List", - selected = layout.value == 0, - onClick = { CoroutineScope(Dispatchers.IO).launch { prefs.changeLayout(0) } }, + selected = layout == Layout.LIST.ordinal, + onClick = { CoroutineScope(Dispatchers.IO).launch { prefs.changeLayout(Layout.LIST.ordinal) } }, ) NPSRadioButton( text = "Grid", - selected = layout.value == 1, - onClick = { CoroutineScope(Dispatchers.IO).launch { prefs.changeLayout(1) } }, + selected = layout == Layout.GRID.ordinal, + onClick = { CoroutineScope(Dispatchers.IO).launch { prefs.changeLayout(Layout.GRID.ordinal) } }, ) } } diff --git a/app/src/main/java/com/illusionware/npsbrowser/ui/pages/Onboarding.kt b/app/src/main/java/com/illusionware/npsbrowser/ui/pages/Onboarding.kt index 60db7e5..3097b80 100644 --- a/app/src/main/java/com/illusionware/npsbrowser/ui/pages/Onboarding.kt +++ b/app/src/main/java/com/illusionware/npsbrowser/ui/pages/Onboarding.kt @@ -93,7 +93,10 @@ const val PAGE_COUNT = 3 @Composable fun OnBoarding(navigateToHome: () -> Unit = {}, darkTheme: Boolean = false) { val systemUiController = rememberSystemUiController() - val pagerState = rememberPagerState() + val pagerState = rememberPagerState( + initialPage = 0, + initialPageOffsetFraction = 0f + ) val scope = rememberCoroutineScope() val context = LocalContext.current diff --git a/app/src/main/java/com/illusionware/npsbrowser/viewmodels/PackageListData.kt b/app/src/main/java/com/illusionware/npsbrowser/viewmodels/PackageListData.kt new file mode 100644 index 0000000..09885dc --- /dev/null +++ b/app/src/main/java/com/illusionware/npsbrowser/viewmodels/PackageListData.kt @@ -0,0 +1,45 @@ +package com.illusionware.npsbrowser.viewmodels + +import androidx.lifecycle.ViewModel +import com.github.doyaaaaaken.kotlincsv.dsl.context.ExcessFieldsRowBehaviour +import com.github.doyaaaaaken.kotlincsv.dsl.context.InsufficientFieldsRowBehaviour +import com.github.doyaaaaaken.kotlincsv.dsl.csvReader +import com.illusionware.npsbrowser.ConsoleType +import com.illusionware.npsbrowser.DataType +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +data class Package( + val id: String, + val title: String, + val region: String, + val minFW: String, + val pkgUrl: String, + val pkgSize: Int, + val consoleType: ConsoleType, + val dataType: DataType, +) + +data class PackageListUiState( + val packages: List = emptyList(), + val error: String = "", +) + +class PackageListViewModel(): ViewModel() { + // TODO: actually properly think about and implement this + private val _uiState = MutableStateFlow(PackageListUiState()) + val uiState: StateFlow = _uiState.asStateFlow() + private val tsvReader = csvReader { + charset = "ISO_8859_1" + quoteChar = '"' + delimiter = '\t' + excessFieldsRowBehaviour = ExcessFieldsRowBehaviour.TRIM + insufficientFieldsRowBehaviour = InsufficientFieldsRowBehaviour.EMPTY_STRING + } + + fun loadPackagesFromTsv() { + val file = "psv_games.tsv" + val rows = tsvReader.readAll(file) + } +} diff --git a/app/src/main/res/drawable-v24/rect_light_blue.xml b/app/src/main/res/drawable-v24/rect_light_blue.xml deleted file mode 100644 index 0da9c7a..0000000 --- a/app/src/main/res/drawable-v24/rect_light_blue.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/rect_red.xml b/app/src/main/res/drawable-v24/rect_red.xml deleted file mode 100644 index 48eeebb..0000000 --- a/app/src/main/res/drawable-v24/rect_red.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/splash.xml b/app/src/main/res/drawable-v24/splash.xml deleted file mode 100644 index dfc6f06..0000000 --- a/app/src/main/res/drawable-v24/splash.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/default_game_icon.png b/app/src/main/res/drawable/default_game_icon.png new file mode 100644 index 0000000..7a3eedd Binary files /dev/null and b/app/src/main/res/drawable/default_game_icon.png differ diff --git a/app/src/main/res/drawable/ic_add_24dp.xml b/app/src/main/res/drawable/ic_add_24dp.xml deleted file mode 100644 index addf0af..0000000 --- a/app/src/main/res/drawable/ic_add_24dp.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_search_24dp.xml b/app/src/main/res/drawable/ic_search_24dp.xml deleted file mode 100644 index da931c2..0000000 --- a/app/src/main/res/drawable/ic_search_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml deleted file mode 100644 index 24a5623..0000000 --- a/app/src/main/res/drawable/ic_settings.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/no_key_icon.xml b/app/src/main/res/drawable/no_key_icon.xml new file mode 100644 index 0000000..af9a1d0 --- /dev/null +++ b/app/src/main/res/drawable/no_key_icon.xml @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/no_url_icon.xml b/app/src/main/res/drawable/no_url_icon.xml new file mode 100644 index 0000000..04d5a1d --- /dev/null +++ b/app/src/main/res/drawable/no_url_icon.xml @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/splash_gradient.xml b/app/src/main/res/drawable/splash_gradient.xml deleted file mode 100644 index fe46205..0000000 --- a/app/src/main/res/drawable/splash_gradient.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/font/red_hat_display_bold.ttf b/app/src/main/res/font/red_hat_display_bold.ttf new file mode 100644 index 0000000..59ee9d1 Binary files /dev/null and b/app/src/main/res/font/red_hat_display_bold.ttf differ diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index b4a2717..0000000 --- a/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml deleted file mode 100644 index 8cbc6fc..0000000 --- a/app/src/main/res/layout/activity_splash.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/appbar.xml b/app/src/main/res/layout/appbar.xml deleted file mode 100644 index 9b90a44..0000000 --- a/app/src/main/res/layout/appbar.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/main_fragment.xml b/app/src/main/res/layout/main_fragment.xml deleted file mode 100644 index 7e4205a..0000000 --- a/app/src/main/res/layout/main_fragment.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/layout/recycler_item_grid.xml b/app/src/main/res/layout/recycler_item_grid.xml deleted file mode 100644 index 2a197d1..0000000 --- a/app/src/main/res/layout/recycler_item_grid.xml +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/recycler_item_list.xml b/app/src/main/res/layout/recycler_item_list.xml deleted file mode 100644 index f5f07a7..0000000 --- a/app/src/main/res/layout/recycler_item_list.xml +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/settings_fragment.xml b/app/src/main/res/layout/settings_fragment.xml deleted file mode 100644 index 9ef6864..0000000 --- a/app/src/main/res/layout/settings_fragment.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/main.xml b/app/src/main/res/menu/main.xml deleted file mode 100644 index e8e9167..0000000 --- a/app/src/main/res/menu/main.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - \ No newline at end of file