summaryrefslogtreecommitdiff
path: root/Source/Android/app/src/main/java/org
diff options
context:
space:
mode:
authorTom Pratt <tom.pratt@outlook.com>2026-04-06 13:32:57 +0100
committerTom Pratt <tompratt@squareup.com>2026-05-19 12:02:53 +0200
commitc716c32ce891b340f5b287f6ae589e43832c427e (patch)
tree4afefcaec758b59bb7c85574e4c1a92e4c5d691c /Source/Android/app/src/main/java/org
parent7b69949cec7afcd1691a9a046d26d5c4a99ce4fc (diff)
Add compose dependencies for Android and empty NetplaySetupActivity
Derive compose colour theming from the existing XML styles already set at the activity level.
Diffstat (limited to 'Source/Android/app/src/main/java/org')
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/netplay/ui/NetplaySetupActivity.kt107
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.kt6
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/theme/DolphinTheme.kt103
3 files changed, 216 insertions, 0 deletions
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/netplay/ui/NetplaySetupActivity.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/netplay/ui/NetplaySetupActivity.kt
new file mode 100644
index 0000000000..f79584c484
--- /dev/null
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/netplay/ui/NetplaySetupActivity.kt
@@ -0,0 +1,107 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+@file:OptIn(ExperimentalMaterial3Api::class)
+
+package org.dolphinemu.dolphinemu.features.netplay.ui
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import androidx.activity.compose.setContent
+import androidx.activity.enableEdgeToEdge
+import androidx.appcompat.app.AppCompatActivity
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.consumeWindowInsets
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.automirrored.filled.ArrowBack
+import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.Icon
+import androidx.compose.material3.IconButton
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.MediumTopAppBar
+import androidx.compose.material3.Scaffold
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.tooling.preview.Preview
+import org.dolphinemu.dolphinemu.R
+import org.dolphinemu.dolphinemu.ui.main.ThemeProvider
+import org.dolphinemu.dolphinemu.ui.theme.DolphinTheme
+import org.dolphinemu.dolphinemu.utils.ThemeHelper
+
+class NetplaySetupActivity : AppCompatActivity(), ThemeProvider {
+ override var themeId: Int = 0
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ ThemeHelper.setTheme(this)
+ enableEdgeToEdge()
+ super.onCreate(savedInstanceState)
+
+ setContent {
+ DolphinTheme {
+ NetplaySetupScreen(
+ onBackClicked = { finish() },
+ )
+ }
+ }
+ }
+
+ override fun setTheme(themeId: Int) {
+ super.setTheme(themeId)
+ this.themeId = themeId
+ }
+
+ override fun onResume() {
+ ThemeHelper.setCorrectTheme(this)
+ super.onResume()
+ }
+
+ companion object {
+ @JvmStatic
+ fun launch(context: Context) {
+ context.startActivity(Intent(context, NetplaySetupActivity::class.java))
+ }
+ }
+}
+
+@Composable
+private fun NetplaySetupScreen(
+ onBackClicked: () -> Unit,
+) {
+ Scaffold(
+ topBar = {
+ MediumTopAppBar(
+ title = { Text(stringResource(R.string.netplay_setup_title)) },
+ navigationIcon = {
+ IconButton(onClick = onBackClicked) {
+ Icon(
+ Icons.AutoMirrored.Filled.ArrowBack,
+ contentDescription = "Back"
+ )
+ }
+ },
+ )
+ }
+ ) { innerPadding ->
+ Column(
+ modifier = Modifier
+ .consumeWindowInsets(innerPadding)
+ .padding(innerPadding)
+ .padding(horizontal = DolphinTheme.scaffoldPadding)
+ .verticalScroll(rememberScrollState()),
+ ) {
+ }
+ }
+}
+
+@Preview
+@Composable
+private fun NetplaySetupScreenPreview() {
+ MaterialTheme {
+ NetplayScreen(onBackClicked = {})
+ }
+}
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.kt
index 893d6a16d4..1e1d55dbd7 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.kt
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.kt
@@ -21,6 +21,7 @@ import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag
import org.dolphinemu.dolphinemu.features.sysupdate.ui.SystemMenuNotInstalledDialogFragment
import org.dolphinemu.dolphinemu.features.sysupdate.ui.SystemUpdateProgressBarDialogFragment
import org.dolphinemu.dolphinemu.features.sysupdate.ui.SystemUpdateViewModel
+import org.dolphinemu.dolphinemu.features.netplay.ui.NetplaySetupActivity
import org.dolphinemu.dolphinemu.fragments.AboutDialogFragment
import org.dolphinemu.dolphinemu.model.GameFileCache
import org.dolphinemu.dolphinemu.services.GameFileCacheManager
@@ -188,6 +189,11 @@ class MainPresenter(private val mainView: MainView, private val activity: Fragme
true
}
+ R.id.menu_netplay -> {
+ NetplaySetupActivity.launch(activity)
+ true
+ }
+
R.id.menu_about -> {
showAboutDialog()
false
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/theme/DolphinTheme.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/theme/DolphinTheme.kt
new file mode 100644
index 0000000000..58eb52b347
--- /dev/null
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/theme/DolphinTheme.kt
@@ -0,0 +1,103 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+package org.dolphinemu.dolphinemu.ui.theme
+
+import android.content.Context
+import androidx.annotation.AttrRes
+import androidx.compose.foundation.isSystemInDarkTheme
+import androidx.compose.material3.ColorScheme
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.darkColorScheme
+import androidx.compose.material3.lightColorScheme
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.unit.dp
+import com.google.android.material.color.MaterialColors
+import androidx.appcompat.R as AppCompatR
+import com.google.android.material.R as MaterialR
+
+object DolphinTheme {
+ val scaffoldPadding = 16.dp
+}
+
+@Composable
+fun DolphinTheme(content: @Composable () -> Unit) {
+ val context = LocalContext.current
+ val isDark = isSystemInDarkTheme()
+ val colorScheme = remember(context, isDark) { context.toDolphinColorScheme(isDark) }
+
+ MaterialTheme(
+ colorScheme = colorScheme,
+ content = content
+ )
+}
+
+private fun Context.toDolphinColorScheme(isDark: Boolean): ColorScheme {
+ fun attr(@AttrRes attr: Int) = Color(MaterialColors.getColor(this, attr, 0))
+
+ val background = obtainStyledAttributes(intArrayOf(android.R.attr.colorBackground)).use {
+ Color(it.getColor(0, 0))
+ }
+
+ return if (isDark) {
+ darkColorScheme(
+ primary = attr(AppCompatR.attr.colorPrimary),
+ onPrimary = attr(MaterialR.attr.colorOnPrimary),
+ primaryContainer = attr(MaterialR.attr.colorPrimaryContainer),
+ onPrimaryContainer = attr(MaterialR.attr.colorOnPrimaryContainer),
+ secondary = attr(MaterialR.attr.colorSecondary),
+ onSecondary = attr(MaterialR.attr.colorOnSecondary),
+ secondaryContainer = attr(MaterialR.attr.colorSecondaryContainer),
+ onSecondaryContainer = attr(MaterialR.attr.colorOnSecondaryContainer),
+ tertiary = attr(MaterialR.attr.colorTertiary),
+ onTertiary = attr(MaterialR.attr.colorOnTertiary),
+ tertiaryContainer = attr(MaterialR.attr.colorTertiaryContainer),
+ onTertiaryContainer = attr(MaterialR.attr.colorOnTertiaryContainer),
+ error = attr(AppCompatR.attr.colorError),
+ onError = attr(MaterialR.attr.colorOnError),
+ errorContainer = attr(MaterialR.attr.colorErrorContainer),
+ onErrorContainer = attr(MaterialR.attr.colorOnErrorContainer),
+ background = background,
+ onBackground = attr(MaterialR.attr.colorOnBackground),
+ surface = attr(MaterialR.attr.colorSurface),
+ onSurface = attr(MaterialR.attr.colorOnSurface),
+ surfaceVariant = attr(MaterialR.attr.colorSurfaceVariant),
+ onSurfaceVariant = attr(MaterialR.attr.colorOnSurfaceVariant),
+ outline = attr(MaterialR.attr.colorOutline),
+ inverseSurface = attr(MaterialR.attr.colorSurfaceInverse),
+ inverseOnSurface = attr(MaterialR.attr.colorOnSurfaceInverse),
+ inversePrimary = attr(MaterialR.attr.colorPrimaryInverse),
+ )
+ } else {
+ lightColorScheme(
+ primary = attr(AppCompatR.attr.colorPrimary),
+ onPrimary = attr(MaterialR.attr.colorOnPrimary),
+ primaryContainer = attr(MaterialR.attr.colorPrimaryContainer),
+ onPrimaryContainer = attr(MaterialR.attr.colorOnPrimaryContainer),
+ secondary = attr(MaterialR.attr.colorSecondary),
+ onSecondary = attr(MaterialR.attr.colorOnSecondary),
+ secondaryContainer = attr(MaterialR.attr.colorSecondaryContainer),
+ onSecondaryContainer = attr(MaterialR.attr.colorOnSecondaryContainer),
+ tertiary = attr(MaterialR.attr.colorTertiary),
+ onTertiary = attr(MaterialR.attr.colorOnTertiary),
+ tertiaryContainer = attr(MaterialR.attr.colorTertiaryContainer),
+ onTertiaryContainer = attr(MaterialR.attr.colorOnTertiaryContainer),
+ error = attr(AppCompatR.attr.colorError),
+ onError = attr(MaterialR.attr.colorOnError),
+ errorContainer = attr(MaterialR.attr.colorErrorContainer),
+ onErrorContainer = attr(MaterialR.attr.colorOnErrorContainer),
+ background = background,
+ onBackground = attr(MaterialR.attr.colorOnBackground),
+ surface = attr(MaterialR.attr.colorSurface),
+ onSurface = attr(MaterialR.attr.colorOnSurface),
+ surfaceVariant = attr(MaterialR.attr.colorSurfaceVariant),
+ onSurfaceVariant = attr(MaterialR.attr.colorOnSurfaceVariant),
+ outline = attr(MaterialR.attr.colorOutline),
+ inverseSurface = attr(MaterialR.attr.colorSurfaceInverse),
+ inverseOnSurface = attr(MaterialR.attr.colorOnSurfaceInverse),
+ inversePrimary = attr(MaterialR.attr.colorPrimaryInverse),
+ )
+ }
+}