From 584e5e8b3b8a6070633c03504e472105146bd55d Mon Sep 17 00:00:00 2001 From: wingio Date: Thu, 23 Mar 2023 14:14:50 -0400 Subject: [PATCH] Feat: Add about screen --- app/build.gradle.kts | 4 +- .../manager/ui/screen/about/AboutScreen.kt | 236 ++++++++++++++++++ .../manager/ui/screen/home/HomeScreen.kt | 22 ++ .../ui/screen/settings/SettingsScreen.kt | 15 ++ .../ui/viewmodel/home/HomeViewModel.kt | 2 +- .../ui/viewmodel/main/MainViewModel.kt | 2 +- .../manager/ui/widgets/about/LinkItem.kt | 53 ++++ .../manager/ui/widgets/about/ListItem.kt | 67 +++++ .../manager/ui/widgets/about/UserEntry.kt | 73 ++++++ .../vendetta/manager/utils/Constants.kt | 16 ++ .../vendetta/manager/utils/NavUtils.kt | 1 + .../beefers/vendetta/manager/utils/Utils.kt | 26 ++ app/src/main/res/drawable/ic_discord.xml | 7 + app/src/main/res/drawable/ic_github.xml | 7 + app/src/main/res/values/strings.xml | 12 +- 15 files changed, 538 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/dev/beefers/vendetta/manager/ui/screen/about/AboutScreen.kt create mode 100644 app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/about/LinkItem.kt create mode 100644 app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/about/ListItem.kt create mode 100644 app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/about/UserEntry.kt create mode 100644 app/src/main/java/dev/beefers/vendetta/manager/utils/Constants.kt create mode 100644 app/src/main/res/drawable/ic_discord.xml create mode 100644 app/src/main/res/drawable/ic_github.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 807f8cf..7c3f2e9 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -14,8 +14,8 @@ android { applicationId = "dev.beefers.vendetta.manager" minSdk = 24 targetSdk = 33 - versionCode = 1040 - versionName = "1.0.4" + versionCode = 1050 + versionName = "1.0.5" buildConfigField("String", "GIT_BRANCH", "\"${getCurrentBranch()}\"") buildConfigField("String", "GIT_COMMIT", "\"${getLatestCommit()}\"") diff --git a/app/src/main/java/dev/beefers/vendetta/manager/ui/screen/about/AboutScreen.kt b/app/src/main/java/dev/beefers/vendetta/manager/ui/screen/about/AboutScreen.kt new file mode 100644 index 0000000..ef03eb0 --- /dev/null +++ b/app/src/main/java/dev/beefers/vendetta/manager/ui/screen/about/AboutScreen.kt @@ -0,0 +1,236 @@ +package dev.beefers.vendetta.manager.ui.screen.about + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material.ripple.rememberRipple +import androidx.compose.material3.Divider +import androidx.compose.material3.ElevatedCard +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.LocalContentColor +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.material3.TopAppBarScrollBehavior +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import cafe.adriel.voyager.core.screen.Screen +import cafe.adriel.voyager.navigator.LocalNavigator +import cafe.adriel.voyager.navigator.currentOrThrow +import coil.compose.AsyncImage +import dev.beefers.vendetta.manager.BuildConfig +import dev.beefers.vendetta.manager.R +import dev.beefers.vendetta.manager.ui.widgets.about.LinkItem +import dev.beefers.vendetta.manager.ui.widgets.about.ListItem +import dev.beefers.vendetta.manager.ui.widgets.about.UserEntry +import dev.beefers.vendetta.manager.utils.Constants +import dev.beefers.vendetta.manager.utils.getBitmap + +class AboutScreen: Screen { + + @Composable + @OptIn(ExperimentalMaterial3Api::class) + override fun Content() { + val uriHandler = LocalUriHandler.current + val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior() + val ctx = LocalContext.current + val bitmap = remember { + ctx.getBitmap(R.drawable.ic_launcher, 60).asImageBitmap() + } + + Scaffold( + topBar = { TitleBar(scrollBehavior) }, + modifier = Modifier + .nestedScroll(scrollBehavior.nestedScrollConnection) + ) { + Column( + modifier = Modifier + .padding(it) + .verticalScroll(rememberScrollState()) + ) { + Column( + verticalArrangement = Arrangement.spacedBy(16.dp), + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier + .fillMaxWidth() + .padding(top = 16.dp, bottom = 20.dp) + ) { + Image( + bitmap = bitmap, + contentDescription = null, + modifier = Modifier + .size(60.dp) + .clip(CircleShape) + ) + + Text( + stringResource(R.string.app_name), + style = MaterialTheme.typography.titleLarge + ) + + Text( + text = "v${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})", + style = MaterialTheme.typography.labelLarge, + color = LocalContentColor.current.copy(alpha = 0.5f), + modifier = Modifier.clickable { } + ) + + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceEvenly, + modifier = Modifier.fillMaxWidth() + ) { + LinkItem( + icon = R.drawable.ic_github, + label = R.string.label_github, + link = "https://github.com/vendetta-mod" + ) + + LinkItem( + icon = R.drawable.ic_discord, + label = R.string.label_discord, + link = "https://discord.gg/n9QQ4XhhJP" + ) + } + } + + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceEvenly, + modifier = Modifier + .fillMaxWidth() + .padding(top = 16.dp, bottom = 20.dp) + ) { + UserEntry("Fiery", "Lead dev\niOS", "FieryFlames") + UserEntry("Beef", "Creator\nVendetta", "Beefers", isLarge = true) + UserEntry("Wing", "Lead dev\nManager", "wingio") + } + + Text( + text = stringResource(R.string.label_team), + style = MaterialTheme.typography.labelLarge, + modifier = Modifier.padding(16.dp), + color = MaterialTheme.colorScheme.primary + ) + Box( + modifier = Modifier.padding(horizontal = 16.dp) + ) { + ElevatedCard { + Constants.TEAM_MEMBERS.forEachIndexed { i, member -> + ListItem( + text = member.name, + subtext = member.role, + imageUrl = "https://github.com/${member.username}.png", + onClick = { + uriHandler.openUri("https://github.com/${member.username}") + } + ) + if(i != Constants.TEAM_MEMBERS.lastIndex) { + Divider( + thickness = 0.5.dp, + color = MaterialTheme.colorScheme.outline.copy(alpha = 0.3f), + modifier = Modifier.padding(horizontal = 16.dp) + ) + } + } + } + } + + Text( + text = stringResource(R.string.label_special_thanks), + style = MaterialTheme.typography.labelLarge, + modifier = Modifier.padding(16.dp), + color = MaterialTheme.colorScheme.primary + ) + Box( + modifier = Modifier.padding(horizontal = 16.dp) + ) { + ElevatedCard { + ListItem( + text = "Rushii", + subtext = "for some of the installer code", + imageUrl = "https://github.com/rushiiMachine.png", + onClick = { + uriHandler.openUri("https://github.com/rushiiMachine") + } + ) + Divider( + thickness = 0.5.dp, + color = MaterialTheme.colorScheme.outline.copy(alpha = 0.3f), + modifier = Modifier.padding(horizontal = 16.dp) + ) + ListItem( + text = "Xinto", + subtext = "for the preference manager", + imageUrl = "https://github.com/X1nto.png", + onClick = { + uriHandler.openUri("https://github.com/X1nto") + } + ) + } + } + + Box( + modifier = Modifier.padding(16.dp) + ) { + ElevatedCard { + ListItem( + text = stringResource(R.string.label_translate), + subtext = stringResource(R.string.msg_coming_soon) + ) + } + } + } + } + } + + @Composable + @OptIn(ExperimentalMaterial3Api::class) + private fun TitleBar( + scrollBehavior: TopAppBarScrollBehavior + ) { + val navigator = LocalNavigator.currentOrThrow + + TopAppBar( + title = { Text(stringResource(R.string.title_about)) }, + scrollBehavior = scrollBehavior, + navigationIcon = { + IconButton(onClick = { navigator.pop() }) { + Icon( + imageVector = Icons.Filled.ArrowBack, + contentDescription = stringResource(R.string.action_back) + ) + } + } + ) + } + +} \ No newline at end of file diff --git a/app/src/main/java/dev/beefers/vendetta/manager/ui/screen/home/HomeScreen.kt b/app/src/main/java/dev/beefers/vendetta/manager/ui/screen/home/HomeScreen.kt index a353658..9f4267f 100644 --- a/app/src/main/java/dev/beefers/vendetta/manager/ui/screen/home/HomeScreen.kt +++ b/app/src/main/java/dev/beefers/vendetta/manager/ui/screen/home/HomeScreen.kt @@ -19,11 +19,16 @@ import androidx.compose.material.icons.filled.Delete import androidx.compose.material.icons.filled.Home import androidx.compose.material.icons.filled.Info import androidx.compose.material.icons.filled.OpenInNew +import androidx.compose.material.icons.filled.Refresh +import androidx.compose.material.icons.filled.RestartAlt import androidx.compose.material.icons.outlined.Home +import androidx.compose.material.icons.outlined.Info import androidx.compose.material3.Button import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.Divider import androidx.compose.material3.ElevatedCard +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text @@ -46,8 +51,10 @@ import cafe.adriel.voyager.navigator.tab.TabOptions import dev.beefers.vendetta.manager.R import dev.beefers.vendetta.manager.domain.manager.PreferenceManager import dev.beefers.vendetta.manager.ui.components.SegmentedButton +import dev.beefers.vendetta.manager.ui.screen.about.AboutScreen import dev.beefers.vendetta.manager.ui.screen.installer.InstallerScreen import dev.beefers.vendetta.manager.ui.viewmodel.home.HomeViewModel +import dev.beefers.vendetta.manager.ui.viewmodel.main.MainViewModel import dev.beefers.vendetta.manager.ui.widgets.home.Commit import dev.beefers.vendetta.manager.utils.DiscordVersion import dev.beefers.vendetta.manager.utils.ManagerTab @@ -234,6 +241,21 @@ class HomeScreen : ManagerTab { @Composable override fun Actions() { + val viewModel: HomeViewModel = getScreenModel() + val navigator = LocalNavigator.currentOrThrow + + IconButton(onClick = { viewModel.getDiscordVersions() }) { + Icon( + imageVector = Icons.Filled.Refresh, + contentDescription = stringResource(R.string.action_reload) + ) + } + IconButton(onClick = { navigator.navigate(AboutScreen()) }) { + Icon( + imageVector = Icons.Outlined.Info, + contentDescription = stringResource(R.string.action_open_about) + ) + } } } \ No newline at end of file diff --git a/app/src/main/java/dev/beefers/vendetta/manager/ui/screen/settings/SettingsScreen.kt b/app/src/main/java/dev/beefers/vendetta/manager/ui/screen/settings/SettingsScreen.kt index 7fdb78f..18a9f59 100644 --- a/app/src/main/java/dev/beefers/vendetta/manager/ui/screen/settings/SettingsScreen.kt +++ b/app/src/main/java/dev/beefers/vendetta/manager/ui/screen/settings/SettingsScreen.kt @@ -6,12 +6,17 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Settings +import androidx.compose.material.icons.outlined.Info import androidx.compose.material.icons.outlined.Settings +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import cafe.adriel.voyager.koin.getScreenModel +import cafe.adriel.voyager.navigator.LocalNavigator +import cafe.adriel.voyager.navigator.currentOrThrow import cafe.adriel.voyager.navigator.tab.TabOptions import dev.beefers.vendetta.manager.R import dev.beefers.vendetta.manager.domain.manager.PreferenceManager @@ -20,9 +25,11 @@ import dev.beefers.vendetta.manager.ui.components.settings.SettingsHeader import dev.beefers.vendetta.manager.ui.components.settings.SettingsItemChoice import dev.beefers.vendetta.manager.ui.components.settings.SettingsSwitch import dev.beefers.vendetta.manager.ui.components.settings.SettingsTextField +import dev.beefers.vendetta.manager.ui.screen.about.AboutScreen import dev.beefers.vendetta.manager.ui.viewmodel.settings.SettingsViewModel import dev.beefers.vendetta.manager.utils.ManagerTab import dev.beefers.vendetta.manager.utils.TabOptions +import dev.beefers.vendetta.manager.utils.navigate import org.koin.androidx.compose.get class SettingsScreen : ManagerTab { @@ -101,5 +108,13 @@ class SettingsScreen : ManagerTab { @Composable override fun Actions() { + val navigator = LocalNavigator.currentOrThrow + + IconButton(onClick = { navigator.navigate(AboutScreen()) }) { + Icon( + imageVector = Icons.Outlined.Info, + contentDescription = stringResource(R.string.action_open_about) + ) + } } } \ No newline at end of file diff --git a/app/src/main/java/dev/beefers/vendetta/manager/ui/viewmodel/home/HomeViewModel.kt b/app/src/main/java/dev/beefers/vendetta/manager/ui/viewmodel/home/HomeViewModel.kt index 97ebd9d..2746c62 100644 --- a/app/src/main/java/dev/beefers/vendetta/manager/ui/viewmodel/home/HomeViewModel.kt +++ b/app/src/main/java/dev/beefers/vendetta/manager/ui/viewmodel/home/HomeViewModel.kt @@ -61,7 +61,7 @@ class HomeViewModel( getDiscordVersions() } - private fun getDiscordVersions() { + fun getDiscordVersions() { coroutineScope.launch { discordVersions = repo.getLatestDiscordVersions().dataOrNull } diff --git a/app/src/main/java/dev/beefers/vendetta/manager/ui/viewmodel/main/MainViewModel.kt b/app/src/main/java/dev/beefers/vendetta/manager/ui/viewmodel/main/MainViewModel.kt index 0a56aeb..5e39400 100644 --- a/app/src/main/java/dev/beefers/vendetta/manager/ui/viewmodel/main/MainViewModel.kt +++ b/app/src/main/java/dev/beefers/vendetta/manager/ui/viewmodel/main/MainViewModel.kt @@ -35,7 +35,7 @@ class MainViewModel( checkForUpdate() } - private fun checkForUpdate() { + fun checkForUpdate() { coroutineScope.launch { release = repo.getLatestRelease("VendettaManager").dataOrNull release?.let { diff --git a/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/about/LinkItem.kt b/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/about/LinkItem.kt new file mode 100644 index 0000000..b5353c0 --- /dev/null +++ b/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/about/LinkItem.kt @@ -0,0 +1,53 @@ +package dev.beefers.vendetta.manager.ui.widgets.about + +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.ripple.rememberRipple +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp + +@Composable +fun LinkItem( + @DrawableRes icon: Int, + @StringRes label: Int, + link: String +) { + val uriHandler = LocalUriHandler.current + + Column( + verticalArrangement = Arrangement.spacedBy(8.dp), + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier + .clickable( + onClick = { uriHandler.openUri(link) }, + indication = rememberRipple(bounded = false, radius = 40.dp), + interactionSource = remember { MutableInteractionSource() } + ) + .padding(8.dp) + ) { + Icon( + painter = painterResource(icon), + contentDescription = stringResource(label), + modifier = Modifier.size(30.dp) + ) + Text( + text = stringResource(label), + style = MaterialTheme.typography.labelMedium + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/about/ListItem.kt b/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/about/ListItem.kt new file mode 100644 index 0000000..e9b9b98 --- /dev/null +++ b/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/about/ListItem.kt @@ -0,0 +1,67 @@ +package dev.beefers.vendetta.manager.ui.widgets.about + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.LocalContentColor +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.unit.dp +import coil.compose.AsyncImage + +@Composable +fun ListItem( + text: String, + subtext: String? = null, + imageUrl: String? = null, + onClick: (() -> Unit)? = null +) { + + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(16.dp), + modifier = Modifier + .clickable( + enabled = onClick != null, + onClick = onClick ?: { -> } + ) + .padding(16.dp) + .fillMaxWidth() + ) { + imageUrl?.let { + AsyncImage( + model = it, + contentDescription = null, + modifier = Modifier + .size(35.dp) + .clip(CircleShape) + ) + } + + Column( + verticalArrangement = Arrangement.spacedBy(4.dp) + ) { + Text( + text = text, + style = MaterialTheme.typography.bodyLarge + ) + subtext?.let { + Text( + text = it, + style = MaterialTheme.typography.labelMedium, + color = LocalContentColor.current.copy(alpha = 0.5f) + ) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/about/UserEntry.kt b/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/about/UserEntry.kt new file mode 100644 index 0000000..f2aa757 --- /dev/null +++ b/app/src/main/java/dev/beefers/vendetta/manager/ui/widgets/about/UserEntry.kt @@ -0,0 +1,73 @@ +package dev.beefers.vendetta.manager.ui.widgets.about + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.widthIn +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.ripple.rememberRipple +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.surfaceColorAtElevation +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import coil.compose.AsyncImage + +@Composable +fun UserEntry( + name: String, + roles: String, + username: String = name, + isLarge: Boolean = false +) { + val uriHandler = LocalUriHandler.current + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(16.dp), + modifier = Modifier + .clickable( + onClick = { uriHandler.openUri("https://github.com/$username") }, + indication = rememberRipple(bounded = false, radius = 90.dp), + interactionSource = remember { MutableInteractionSource() } + ) + .widthIn(min = 100.dp) + ) { + AsyncImage( + modifier = Modifier + .size(if(isLarge) 70.dp else 50.dp) + .clip(CircleShape) + .background(MaterialTheme.colorScheme.surfaceColorAtElevation(1.dp)), + model = "https://github.com/$username.png", + contentDescription = username + ) + + Column( + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + text = name, + style = MaterialTheme.typography.titleMedium.copy( + fontSize = 18.sp + ) + ) + + Text( + text = roles, + style = MaterialTheme.typography.titleSmall.copy( + color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.6f) + ), + textAlign = TextAlign.Center + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/beefers/vendetta/manager/utils/Constants.kt b/app/src/main/java/dev/beefers/vendetta/manager/utils/Constants.kt new file mode 100644 index 0000000..a733ccc --- /dev/null +++ b/app/src/main/java/dev/beefers/vendetta/manager/utils/Constants.kt @@ -0,0 +1,16 @@ +package dev.beefers.vendetta.manager.utils + +object Constants { + + val TEAM_MEMBERS = listOf( + TeamMember("Pylix", "Developer - Vendetta", "amsyarasyiq"), + TeamMember("Kasi", "Developer - Xposed Module", "redstonekasi") + ) + +} + +data class TeamMember( + val name: String, + val role: String, + val username: String = name +) \ No newline at end of file diff --git a/app/src/main/java/dev/beefers/vendetta/manager/utils/NavUtils.kt b/app/src/main/java/dev/beefers/vendetta/manager/utils/NavUtils.kt index bdc80af..adf5699 100644 --- a/app/src/main/java/dev/beefers/vendetta/manager/utils/NavUtils.kt +++ b/app/src/main/java/dev/beefers/vendetta/manager/utils/NavUtils.kt @@ -13,6 +13,7 @@ import com.google.accompanist.pager.ExperimentalPagerApi import dev.beefers.vendetta.manager.ui.screen.home.HomeScreen import dev.beefers.vendetta.manager.ui.screen.main.LocalPagerState import dev.beefers.vendetta.manager.ui.screen.settings.SettingsScreen +import dev.beefers.vendetta.manager.ui.viewmodel.main.MainViewModel enum class MainTab(val tab: ManagerTab) { HOME(HomeScreen()), diff --git a/app/src/main/java/dev/beefers/vendetta/manager/utils/Utils.kt b/app/src/main/java/dev/beefers/vendetta/manager/utils/Utils.kt index ccabc01..df4165d 100644 --- a/app/src/main/java/dev/beefers/vendetta/manager/utils/Utils.kt +++ b/app/src/main/java/dev/beefers/vendetta/manager/utils/Utils.kt @@ -3,8 +3,11 @@ package dev.beefers.vendetta.manager.utils import android.content.ClipData import android.content.ClipboardManager import android.content.Context +import android.graphics.Bitmap import android.widget.Toast +import androidx.annotation.DrawableRes import androidx.annotation.StringRes +import androidx.core.graphics.drawable.toBitmap import dev.beefers.vendetta.manager.BuildConfig fun Context.copyText(text: String) { @@ -19,4 +22,27 @@ fun Context.showToast(@StringRes res: Int, vararg params: Any, short: Boolean = getString(res, *params), if (short) Toast.LENGTH_SHORT else Toast.LENGTH_LONG ).show() +} + +private val cachedBitmaps: MutableMap> = mutableMapOf() + +context(Context) +private val Int.dp: Int + get() = (45 * this@Context.resources.displayMetrics.density + 0.5f).toInt() + +fun Context.getBitmap(@DrawableRes icon: Int, size: Int): Bitmap { + cachedBitmaps[icon]?.let { it[size]?.let { bitmap -> return bitmap } } + val sizePx = size.dp + + val bitmap = getDrawable(icon)!!.toBitmap( + height = sizePx, + width = sizePx + ) + + cachedBitmaps[icon] = mutableMapOf() + cachedBitmaps[icon]?.let { + it[size] = bitmap + } + + return bitmap } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_discord.xml b/app/src/main/res/drawable/ic_discord.xml new file mode 100644 index 0000000..baaa8d4 --- /dev/null +++ b/app/src/main/res/drawable/ic_discord.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_github.xml b/app/src/main/res/drawable/ic_github.xml new file mode 100644 index 0000000..d2e9192 --- /dev/null +++ b/app/src/main/res/drawable/ic_github.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 580c6c8..8e14959 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,6 +2,8 @@ Vendetta Manager Cache cleared successfully + Failed to load commits + Coming soon Download APKs Patching @@ -43,6 +45,8 @@ Uninstall Info Retry + Reload + Open about Cached @@ -50,6 +54,7 @@ Home Settings Update available! + About System Light @@ -72,5 +77,10 @@ Beta Alpha - Failed to load commits + Github + Discord + Team + Special thanks + Open source licenses + Translate \ No newline at end of file