implement barebones settings ui

This commit is contained in:
qimiko committed 2022-11-03 12:59:23 -07:00
1 parent cfc26553e6
commit 0e9f48dafc
5 files changed
+161 -100

No files matched your search

+12 -2
View File
@@ -26,6 +26,15 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:theme="@style/Theme.GeodeLauncher"
tools:targetApi="31">
<activity
android:name=".SettingsActivity"
android:exported="false"
android:label="@string/title_activity_settings"
android:theme="@style/Theme.GeodeLauncher">
<meta-data
android:name="android.app.lib_name"
android:value="" />
</activity>
<activity
android:name=".GeometryDashActivity"
android:exported="true"
@@ -39,10 +48,11 @@
</activity>
<activity
android:name=".MainActivity"
android:theme="@style/Theme.GeodeLauncher"
android:exported="true">
android:exported="true"
android:theme="@style/Theme.GeodeLauncher">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
@@ -11,24 +11,18 @@ import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.selection.toggleable
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Edit
import androidx.compose.material.icons.filled.PlayArrow
import androidx.compose.material.icons.filled.Warning
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.core.content.edit
import com.geode.geodelauncher.ui.theme.GeodeLauncherTheme
import com.geode.geodelauncher.utils.LaunchUtils
@@ -60,7 +54,8 @@ fun onLaunch(context: Context) {
}
fun onSettings(context: Context) {
Toast.makeText(context, "Settings are not implemented yet!", Toast.LENGTH_SHORT).show()
val launchIntent = Intent(context, SettingsActivity::class.java)
context.startActivity(launchIntent)
}
fun onOpenFolder(context: Context) {
@@ -79,30 +74,6 @@ fun onOpenFolder(context: Context) {
}
}
fun toggleLoadTesting(context: Context): Boolean {
val preferences = context.getSharedPreferences(
context.getString(R.string.preference_file_key), Context.MODE_PRIVATE
)
val current = preferences.getBoolean(
context.getString(R.string.preference_load_testing), false
)
preferences.edit {
putBoolean(context.getString(R.string.preference_load_testing), !current)
commit()
}
return preferences.getBoolean(context.getString(R.string.preference_load_testing), false)
}
fun getLoadTesting(context: Context): Boolean {
val preferences = context.getSharedPreferences(
context.getString(R.string.preference_file_key), Context.MODE_PRIVATE
)
return preferences.getBoolean(context.getString(R.string.preference_load_testing), false)
}
@Composable
fun MainScreen(gdInstalled: Boolean = true) {
val context = LocalContext.current
@@ -132,21 +103,18 @@ fun MainScreen(gdInstalled: Boolean = true) {
Spacer(Modifier.size(ButtonDefaults.IconSpacing))
Text("Launch")
}
/*
IconButton(onClick = { onSettings(context) }) {
Icon(
Icons.Filled.Settings,
contentDescription = "Settings Icon"
)
}
*/
}
} else {
Text(
"Geometry Dash could not be found.",
modifier = Modifier.padding(12.dp)
)
/*
Button(onClick = { onSettings(context) }) {
Icon(
Icons.Filled.Settings,
@@ -155,69 +123,6 @@ fun MainScreen(gdInstalled: Boolean = true) {
Spacer(Modifier.size(ButtonDefaults.IconSpacing))
Text("Settings")
}
*/
}
Spacer(modifier = Modifier.height(12.dp))
TestingUtils()
}
}
@Composable
fun TestingUtils() {
val context = LocalContext.current
val isLoadTesting = remember { mutableStateOf(getLoadTesting(context)) }
Card(
elevation = CardDefaults.elevatedCardElevation(),
colors = CardDefaults.elevatedCardColors(),
) {
Column(
Modifier.padding(16.dp),
verticalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterVertically),
horizontalAlignment = Alignment.CenterHorizontally,
) {
Row {
Icon(
Icons.Filled.Warning,
contentDescription = "Warning Icon"
)
Spacer(Modifier.size(4.dp))
Text("Testing Utils")
}
Row(
Modifier
.height(48.dp)
.toggleable(
value = isLoadTesting.value,
onValueChange = { isLoadTesting.value = toggleLoadTesting(context) },
role = Role.Checkbox
)
.padding(horizontal = 16.dp),
verticalAlignment = Alignment.CenterVertically
) {
Checkbox(
checked = isLoadTesting.value,
onCheckedChange = null
)
Text(
text = "Load files in /test",
style = MaterialTheme.typography.bodyLarge,
modifier = Modifier.padding(start = 16.dp)
)
}
OutlinedButton(
onClick = { onOpenFolder(context) }
) {
Icon(
Icons.Filled.Edit,
contentDescription = "Folder Icon"
)
Spacer(Modifier.size(ButtonDefaults.IconSpacing))
Text("Copy external folder path")
}
}
}
}
@@ -0,0 +1,142 @@
package com.geode.geodelauncher
import android.content.Context
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.OnBackPressedDispatcher
import androidx.activity.compose.setContent
import androidx.annotation.StringRes
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.selection.toggleable
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.core.content.edit
import com.geode.geodelauncher.ui.theme.GeodeLauncherTheme
class SettingsActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
GeodeLauncherTheme {
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
SettingsScreen(
onBackPressedDispatcher = onBackPressedDispatcher
)
}
}
}
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SettingsScreen(onBackPressedDispatcher: OnBackPressedDispatcher?) {
Scaffold(
topBar = {
TopAppBar(
navigationIcon = {
IconButton(onClick = { onBackPressedDispatcher?.onBackPressed() }) {
Icon(
imageVector = Icons.Filled.ArrowBack,
contentDescription = "Back"
)
}
},
title = {
Text(
"Settings",
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
},
)
},
content = { innerPadding ->
Column(
Modifier
.padding(innerPadding)
.fillMaxWidth(),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
OptionsCard(R.string.preference_load_testing_name, R.string.preference_load_testing)
}
}
)
}
fun toggleSetting(context: Context, @StringRes preferenceId: Int): Boolean {
val preferences = context.getSharedPreferences(
context.getString(R.string.preference_file_key), Context.MODE_PRIVATE
)
val current = preferences.getBoolean(
context.getString(preferenceId), false
)
preferences.edit {
putBoolean(context.getString(preferenceId), !current)
commit()
}
return preferences.getBoolean(context.getString(R.string.preference_load_testing), false)
}
fun getSetting(context: Context, @StringRes preferenceId: Int): Boolean {
val preferences = context.getSharedPreferences(
context.getString(R.string.preference_file_key), Context.MODE_PRIVATE
)
return preferences.getBoolean(context.getString(preferenceId), false)
}
@Composable
fun OptionsCard(@StringRes title: Int, @StringRes preferenceId: Int) {
val context = LocalContext.current
val settingEnabled = remember {
mutableStateOf(getSetting(context, preferenceId)) }
Row(
Modifier.fillMaxWidth()
.height(64.dp)
.toggleable(
value = settingEnabled.value,
onValueChange = { settingEnabled.value = toggleSetting(context, preferenceId) },
role = Role.Switch,
)
.padding(horizontal = 16.dp),
Arrangement.SpaceBetween,
Alignment.CenterVertically,
) {
Text(context.getString(title))
Switch(checked = settingEnabled.value, onCheckedChange = null)
}
}
@Preview(showBackground = true)
@Composable
fun OptionsCardPreview() {
GeodeLauncherTheme {
OptionsCard(R.string.preference_load_testing_name, R.string.preference_load_testing)
}
}
@Preview(showSystemUi = true)
@Composable
fun DefaultPreview() {
GeodeLauncherTheme {
SettingsScreen(null)
}
}
+2
View File
@@ -5,4 +5,6 @@
<string name="no_activity_found">No activity found for this action.</string>
<string name="preference_file_key">GeodeLauncherPreferencesFileKey</string>
<string name="preference_load_testing">PreferenceLoadTesting</string>
<string name="preference_load_testing_name">Load files from /test</string>
<string name="title_activity_settings">SettingsActivity</string>
</resources>
+2
View File
@@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.NoActionBar.Fullscreen" parent="@style/Theme.AppCompat.Light.NoActionBar">
<item name="android:windowNoTitle">true</item>
<item name="android:windowActionBar">false</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
<style name="Theme.GeodeLauncher" parent="android:Theme.Material.Light.NoActionBar" />
</resources>