Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
65fe0a0
Add GPU driver support (Pixel 9/Mali) and sensors features
google-labs-jules[bot] Feb 26, 2026
1f87430
Add GPU/sensors support (Pixel 9) and fix check/help
google-labs-jules[bot] Feb 26, 2026
fd09517
Add GPU and Sensors support to Android GUI
google-labs-jules[bot] Feb 26, 2026
3aae569
Implement GPU/Sensors features and integrate into Android GUI
google-labs-jules[bot] Feb 26, 2026
c7bc616
Add GPU config flags and safer permission handling
google-labs-jules[bot] Feb 26, 2026
a9309e0
Refine GPU support with configurable permissions and safety checks
google-labs-jules[bot] Feb 26, 2026
6e57741
Fix CI build and implement safe GPU/Sensors support
google-labs-jules[bot] Feb 26, 2026
3b1e30d
Fix CI build and implement safe GPU/Sensors support
google-labs-jules[bot] Feb 26, 2026
6476d98
Fix Android CI build and finalize GPU features
google-labs-jules[bot] Feb 26, 2026
293b403
Fix CI build failures and complete GPU/Sensors implementation
google-labs-jules[bot] Feb 26, 2026
720b9f8
Finalize GPU/Sensors support and fix CI
google-labs-jules[bot] Feb 26, 2026
c96dc58
Fix CI build failures and complete GPU/Sensors implementation
google-labs-jules[bot] Feb 26, 2026
e257f2c
Fix CI and add comprehensive Pixel/accelerator support
google-labs-jules[bot] Feb 26, 2026
53b3376
Finalize GPU/Sensors support, Fix CI, and Polish GUI
google-labs-jules[bot] Feb 26, 2026
8ffff87
Fix network, CI and finalize GPU/Sensors features
google-labs-jules[bot] Feb 26, 2026
d577e67
Add GPU support for Pixel 9 Pro XL and fix host connectivity by remov…
google-labs-jules[bot] Feb 26, 2026
d873552
Add --network-mode (NAT/Macvlan) support with Fake MAC and isolated IP.
google-labs-jules[bot] Feb 26, 2026
7416520
Add Network Mode selector to Android GUI.
google-labs-jules[bot] Feb 26, 2026
36b680c
Fix Android build errors in Navigation and ContainerConfigScreen.
google-labs-jules[bot] Feb 26, 2026
4f6ff6e
Fix Android build error: Update ContainerInstallationViewModel for ne…
google-labs-jules[bot] Feb 26, 2026
68ed060
Fix network-mode arguments, validation, and Android UI robustness.
google-labs-jules[bot] Feb 26, 2026
3750f80
Fix GPU validation logic and clean up Android UI imports.
google-labs-jules[bot] Feb 26, 2026
374e987
Fix Network Mode: Implement NetNS sync protocol between Monitor and I…
google-labs-jules[bot] Feb 26, 2026
4d51b92
Add debug logging to diagnose Init process crash in Network Mode.
google-labs-jules[bot] Feb 26, 2026
9da8f06
Fix CI build failure: Restore missing functions in src/container.c.
google-labs-jules[bot] Feb 26, 2026
52dbf59
Fix Network Mode: Correct PID sending, improve interface detection, a…
google-labs-jules[bot] Feb 26, 2026
521c5fd
Fix Network Mode robustness: Error handling for pipes, waitpid, and I…
google-labs-jules[bot] Feb 26, 2026
c5be440
Fix Network Mode robustness: EINTR handling, allocation exhaustion, a…
google-labs-jules[bot] Feb 26, 2026
59844df
Fix Network Mode robustness: Pipe writes, cleanup on failure, and FD …
google-labs-jules[bot] Feb 26, 2026
a64deda
Fix CI build failure: Remove variable redeclaration in src/container.c.
google-labs-jules[bot] Feb 26, 2026
5c68ec0
Fix CI build failure: Remove variable redeclaration in src/container.…
google-labs-jules[bot] Feb 26, 2026
a3bc75c
Add Pixel 9 Pro XL GPU support, new network modes, and sensor access
google-labs-jules[bot] Feb 26, 2026
be0d758
Add Pixel 9 Pro XL GPU support, new network modes, and sensor access
google-labs-jules[bot] Feb 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 33 additions & 1 deletion Android/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,38 @@ android {
if (keystorePassword.isEmpty()) {
println("WARNING: KEYSTORE_PASSWORD not set in local.properties or gradle.properties, using default debug keystore")
}

// Ensure debug keystore exists (CI environment might lack default ~/.android/debug.keystore)
val debugConfig = getByName("debug")
var targetStoreFile = debugConfig.storeFile

if (targetStoreFile == null || !targetStoreFile!!.exists()) {
val localKeystore = rootProject.file("debug.keystore")
if (!localKeystore.exists()) {
println("Generating temporary debug keystore at ${localKeystore.absolutePath}...")
try {
exec {
commandLine("keytool", "-genkey", "-v",
"-keystore", localKeystore.absolutePath,
"-storepass", "android",
"-alias", "androiddebugkey",
"-keypass", "android",
"-keyalg", "RSA",
"-keysize", "2048",
"-validity", "10000",
"-dname", "CN=Android Debug,O=Android,C=US")
}
} catch (e: Exception) {
println("Warning: Failed to generate debug keystore: ${e.message}")
}
}
targetStoreFile = localKeystore
}

getByName("debug") {
if (targetStoreFile != null && targetStoreFile!!.exists()) {
storeFile = targetStoreFile
Comment on lines +79 to +106
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Potential source of Kotlin compilation issues — refactor nullability handling.

The targetStoreFile is a var, which prevents Kotlin smart-casting after null checks. The current code uses !! assertions which are error-prone and may be related to the pipeline's "Kotlin type errors."

Consider using a local val to capture the store file safely:

🔧 Suggested refactor for safer nullability handling
             val debugConfig = getByName("debug")
-            var targetStoreFile = debugConfig.storeFile
-
-            if (targetStoreFile == null || !targetStoreFile!!.exists()) {
+            val configuredStoreFile = debugConfig.storeFile
+            val targetStoreFile: File? = if (configuredStoreFile == null || !configuredStoreFile.exists()) {
                 val localKeystore = rootProject.file("debug.keystore")
                 if (!localKeystore.exists()) {
                     println("Generating temporary debug keystore at ${localKeystore.absolutePath}...")
                     try {
                         exec {
                             commandLine("keytool", "-genkey", "-v",
                                 "-keystore", localKeystore.absolutePath,
                                 "-storepass", "android",
                                 "-alias", "androiddebugkey",
                                 "-keypass", "android",
                                 "-keyalg", "RSA",
                                 "-keysize", "2048",
                                 "-validity", "10000",
                                 "-dname", "CN=Android Debug,O=Android,C=US")
                         }
                     } catch (e: Exception) {
                         println("Warning: Failed to generate debug keystore: ${e.message}")
                     }
                 }
-                targetStoreFile = localKeystore
-            }
+                localKeystore
+            } else {
+                configuredStoreFile
+            }

             getByName("debug") {
-                if (targetStoreFile != null && targetStoreFile!!.exists()) {
+                if (targetStoreFile != null && targetStoreFile.exists()) {
                     storeFile = targetStoreFile
                 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Android/app/build.gradle.kts` around lines 79 - 106, The nullable handling of
targetStoreFile (assigned from debugConfig.storeFile) uses a mutable var and !!
assertions which can break smart-cast and cause Kotlin type errors; replace this
pattern by introducing an immutable val (e.g., finalStoreFile or
resolvedStoreFile) that is computed once after checking/creating the
localKeystore and using safe calls/let to avoid !!, then use that val inside the
getByName("debug") block to set storeFile; reference targetStoreFile,
debugConfig.storeFile, localKeystore, and the getByName("debug") closure when
locating and updating the code.

}
storePassword = "android"
keyAlias = "androiddebugkey"
keyPassword = "android"
Expand All @@ -92,7 +123,8 @@ android {
// Enable R8 full mode for maximum optimization
isDebuggable = false
isJniDebuggable = false
signingConfig = signingConfigs.getByName("release")
// Use release config if it exists (created above), otherwise fallback to debug (safe default)
signingConfig = signingConfigs.findByName("release") ?: signingConfigs.getByName("debug")
}
debug {
// Disable minification in debug for faster builds
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package com.droidspaces.app.ui.component

import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Wifi
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import com.droidspaces.app.R

@Composable
fun NetworkModeSelector(
networkMode: String,
onModeSelected: (String) -> Unit
) {
Card(
colors = CardDefaults.cardColors(
containerColor = MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.5f)
),
modifier = Modifier.fillMaxWidth()
) {
Column(
modifier = Modifier.padding(16.dp)
) {
Row(
verticalAlignment = Alignment.CenterVertically
) {
Icon(
imageVector = Icons.Default.Wifi,
contentDescription = null,
tint = MaterialTheme.colorScheme.primary
)
Spacer(modifier = Modifier.width(16.dp))
Column {
Text(
text = stringResource(R.string.network_mode_title),
style = MaterialTheme.typography.titleMedium,
fontWeight = FontWeight.SemiBold
)
Text(
text = stringResource(R.string.network_mode_description),
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
}
}

Spacer(modifier = Modifier.height(8.dp))

val modes = listOf(
"host" to stringResource(R.string.network_mode_host),
"nat" to stringResource(R.string.network_mode_nat),
"macvlan" to stringResource(R.string.network_mode_macvlan)
)

modes.forEach { (mode, label) ->
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 4.dp)
.clickable { onModeSelected(mode) }
) {
RadioButton(
selected = (networkMode == mode),
onClick = { onModeSelected(mode) }
)
Text(
text = label,
style = MaterialTheme.typography.bodyMedium,
modifier = Modifier.padding(start = 8.dp)
)
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -287,13 +287,15 @@ fun DroidspacesNavigation(
initialEnableIPv6 = viewModel.enableIPv6,
initialEnableAndroidStorage = viewModel.enableAndroidStorage,
initialEnableHwAccess = viewModel.enableHwAccess,
initialEnableSensors = viewModel.enableSensors,
initialNetworkMode = viewModel.networkMode,
initialSelinuxPermissive = viewModel.selinuxPermissive,
initialVolatileMode = viewModel.volatileMode,
initialBindMounts = viewModel.bindMounts,
initialDnsServers = viewModel.dnsServers,
initialRunAtBoot = viewModel.runAtBoot,
onNext = { enableIPv6, enableAndroidStorage, enableHwAccess, selinuxPermissive, volatileMode, bindMounts, dnsServers, runAtBoot ->
viewModel.setConfig(enableIPv6, enableAndroidStorage, enableHwAccess, selinuxPermissive, volatileMode, bindMounts, dnsServers, runAtBoot)
onNext = { enableIPv6, enableAndroidStorage, enableHwAccess, enableSensors, networkMode, selinuxPermissive, volatileMode, bindMounts, dnsServers, runAtBoot ->
viewModel.setConfig(enableIPv6, enableAndroidStorage, enableHwAccess, enableSensors, networkMode, selinuxPermissive, volatileMode, bindMounts, dnsServers, runAtBoot)
navController.navigate(Screen.SparseImageConfig.route)
},
onBack = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import com.droidspaces.app.ui.component.ToggleCard
import com.droidspaces.app.ui.component.NetworkModeSelector
import androidx.compose.ui.platform.LocalContext
import com.droidspaces.app.R

Expand All @@ -27,6 +28,8 @@ fun ContainerConfigScreen(
initialEnableIPv6: Boolean = false,
initialEnableAndroidStorage: Boolean = false,
initialEnableHwAccess: Boolean = false,
initialEnableSensors: Boolean = false,
initialNetworkMode: String = "host",
initialSelinuxPermissive: Boolean = false,
initialVolatileMode: Boolean = false,
initialBindMounts: List<BindMount> = emptyList(),
Expand All @@ -36,6 +39,8 @@ fun ContainerConfigScreen(
enableIPv6: Boolean,
enableAndroidStorage: Boolean,
enableHwAccess: Boolean,
enableSensors: Boolean,
networkMode: String,
selinuxPermissive: Boolean,
volatileMode: Boolean,
bindMounts: List<BindMount>,
Expand All @@ -47,6 +52,8 @@ fun ContainerConfigScreen(
var enableIPv6 by remember { mutableStateOf(initialEnableIPv6) }
var enableAndroidStorage by remember { mutableStateOf(initialEnableAndroidStorage) }
var enableHwAccess by remember { mutableStateOf(initialEnableHwAccess) }
var enableSensors by remember { mutableStateOf(initialEnableSensors) }
var networkMode by remember { mutableStateOf(initialNetworkMode) }
var selinuxPermissive by remember { mutableStateOf(initialSelinuxPermissive) }
var volatileMode by remember { mutableStateOf(initialVolatileMode) }
var bindMounts by remember { mutableStateOf(initialBindMounts) }
Expand Down Expand Up @@ -123,7 +130,7 @@ fun ContainerConfigScreen(
) {
Button(
onClick = {
onNext(enableIPv6, enableAndroidStorage, enableHwAccess, selinuxPermissive, volatileMode, bindMounts, dnsServers, runAtBoot)
onNext(enableIPv6, enableAndroidStorage, enableHwAccess, enableSensors, networkMode, selinuxPermissive, volatileMode, bindMounts, dnsServers, runAtBoot)
},
modifier = Modifier
.fillMaxWidth()
Expand Down Expand Up @@ -199,6 +206,19 @@ fun ContainerConfigScreen(
onCheckedChange = { enableHwAccess = it }
)

ToggleCard(
icon = Icons.Default.BatteryChargingFull,
title = context.getString(R.string.enable_sensors),
description = context.getString(R.string.enable_sensors_description),
checked = enableSensors,
onCheckedChange = { enableSensors = it }
)

NetworkModeSelector(
networkMode = networkMode,
onModeSelected = { networkMode = it }
)

ToggleCard(
icon = Icons.Default.Security,
title = context.getString(R.string.selinux_permissive),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import com.droidspaces.app.ui.util.ClearFocusOnClickOutside
import com.droidspaces.app.ui.util.FocusUtils
import androidx.compose.foundation.clickable
import com.droidspaces.app.ui.component.ToggleCard
import com.droidspaces.app.ui.component.NetworkModeSelector
import com.droidspaces.app.util.ContainerInfo
import com.droidspaces.app.util.ContainerManager
import com.droidspaces.app.util.SystemInfoManager
Expand Down Expand Up @@ -56,6 +57,8 @@ fun EditContainerScreen(
var enableIPv6 by remember { mutableStateOf(container.enableIPv6) }
var enableAndroidStorage by remember { mutableStateOf(container.enableAndroidStorage) }
var enableHwAccess by remember { mutableStateOf(container.enableHwAccess) }
var enableSensors by remember { mutableStateOf(container.enableSensors) }
var networkMode by remember { mutableStateOf(container.networkMode) }
var selinuxPermissive by remember { mutableStateOf(container.selinuxPermissive) }
var volatileMode by remember { mutableStateOf(container.volatileMode) }
var bindMounts by remember { mutableStateOf(container.bindMounts) }
Expand All @@ -67,6 +70,8 @@ fun EditContainerScreen(
var savedEnableIPv6 by remember { mutableStateOf(container.enableIPv6) }
var savedEnableAndroidStorage by remember { mutableStateOf(container.enableAndroidStorage) }
var savedEnableHwAccess by remember { mutableStateOf(container.enableHwAccess) }
var savedEnableSensors by remember { mutableStateOf(container.enableSensors) }
var savedNetworkMode by remember { mutableStateOf(container.networkMode) }
var savedSelinuxPermissive by remember { mutableStateOf(container.selinuxPermissive) }
var savedVolatileMode by remember { mutableStateOf(container.volatileMode) }
var savedBindMounts by remember { mutableStateOf(container.bindMounts) }
Expand All @@ -90,6 +95,8 @@ fun EditContainerScreen(
enableIPv6 != savedEnableIPv6 ||
enableAndroidStorage != savedEnableAndroidStorage ||
enableHwAccess != savedEnableHwAccess ||
enableSensors != savedEnableSensors ||
networkMode != savedNetworkMode ||
selinuxPermissive != savedSelinuxPermissive ||
volatileMode != savedVolatileMode ||
bindMounts != savedBindMounts ||
Expand Down Expand Up @@ -118,6 +125,8 @@ fun EditContainerScreen(
enableIPv6 = enableIPv6,
enableAndroidStorage = enableAndroidStorage,
enableHwAccess = enableHwAccess,
enableSensors = enableSensors,
networkMode = networkMode,
selinuxPermissive = selinuxPermissive,
volatileMode = volatileMode,
bindMounts = bindMounts,
Expand All @@ -137,6 +146,8 @@ fun EditContainerScreen(
savedEnableIPv6 = enableIPv6
savedEnableAndroidStorage = enableAndroidStorage
savedEnableHwAccess = enableHwAccess
savedEnableSensors = enableSensors
savedNetworkMode = networkMode
savedSelinuxPermissive = selinuxPermissive
savedVolatileMode = volatileMode
savedBindMounts = bindMounts
Expand Down Expand Up @@ -410,6 +421,25 @@ fun EditContainerScreen(
}
)

ToggleCard(
icon = Icons.Default.BatteryChargingFull,
title = context.getString(R.string.enable_sensors),
description = context.getString(R.string.enable_sensors_description),
checked = enableSensors,
onCheckedChange = {
clearFocus()
enableSensors = it
}
)

NetworkModeSelector(
networkMode = networkMode,
onModeSelected = {
clearFocus()
networkMode = it
}
)

ToggleCard(
icon = Icons.Default.Security,
title = context.getString(R.string.selinux_permissive),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,12 @@ class ContainerInstallationViewModel : ViewModel() {
var enableHwAccess: Boolean by mutableStateOf(false)
private set

var enableSensors: Boolean by mutableStateOf(false)
private set

var networkMode: String by mutableStateOf("host")
private set
Comment on lines +37 to +38
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Validate networkMode before storing it.

networkMode is accepted as an arbitrary string (Line 80) and propagated directly (Line 91, Line 115). A bad value can leak into runtime config and fail later in harder-to-debug code paths.

🔧 Proposed fix (whitelist + normalization + safe fallback)
 class ContainerInstallationViewModel : ViewModel() {
+    private val allowedNetworkModes = setOf("host", "nat", "macvlan")
+    private val defaultNetworkMode = "host"
+
     var tarballUri: Uri? by mutableStateOf(null)
         private set
@@
-    var networkMode: String by mutableStateOf("host")
+    var networkMode: String by mutableStateOf(defaultNetworkMode)
         private set
@@
-        this.networkMode = networkMode
+        val normalizedNetworkMode = networkMode.trim().lowercase()
+        this.networkMode = if (normalizedNetworkMode in allowedNetworkModes) {
+            normalizedNetworkMode
+        } else {
+            defaultNetworkMode
+        }
@@
-        networkMode = "host"
+        networkMode = defaultNetworkMode

Also applies to: 80-81, 91-91, 115-115, 135-135

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@Android/app/src/main/java/com/droidspaces/app/ui/viewmodel/ContainerInstallationViewModel.kt`
around lines 37 - 38, Validate and normalize any incoming value before assigning
it to the mutable state property networkMode: accept only a small whitelist
(e.g. "host", "bridge", "none"), trim and lowercase the input, and if the value
is not in the whitelist set networkMode to a safe default (e.g. "host"); apply
this check at every place that writes to the networkMode property (search for
assignments to the networkMode var in ContainerInstallationViewModel and any
helper methods that accept a network mode string) and optionally surface/log
invalid attempts so callers can be corrected.


var selinuxPermissive: Boolean by mutableStateOf(false)
private set

Expand Down Expand Up @@ -70,6 +76,8 @@ class ContainerInstallationViewModel : ViewModel() {
enableIPv6: Boolean,
enableAndroidStorage: Boolean,
enableHwAccess: Boolean,
enableSensors: Boolean,
networkMode: String,
selinuxPermissive: Boolean,
volatileMode: Boolean,
bindMounts: List<BindMount>,
Expand All @@ -79,6 +87,8 @@ class ContainerInstallationViewModel : ViewModel() {
this.enableIPv6 = enableIPv6
this.enableAndroidStorage = enableAndroidStorage
this.enableHwAccess = enableHwAccess
this.enableSensors = enableSensors
this.networkMode = networkMode
this.selinuxPermissive = selinuxPermissive
this.volatileMode = volatileMode
this.bindMounts = bindMounts
Expand All @@ -101,6 +111,8 @@ class ContainerInstallationViewModel : ViewModel() {
enableIPv6 = enableIPv6,
enableAndroidStorage = enableAndroidStorage,
enableHwAccess = enableHwAccess,
enableSensors = enableSensors,
networkMode = networkMode,
selinuxPermissive = selinuxPermissive,
volatileMode = volatileMode,
bindMounts = bindMounts,
Expand All @@ -119,6 +131,8 @@ class ContainerInstallationViewModel : ViewModel() {
enableIPv6 = false
enableAndroidStorage = false
enableHwAccess = false
enableSensors = false
networkMode = "host"
selinuxPermissive = false
volatileMode = false
bindMounts = emptyList()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,14 @@ object ContainerCommandBuilder {
parts.add("--hw-access")
}

if (container.enableSensors) {
parts.add("--sensors")
}

if (container.networkMode != "host") {
parts.add("--network-mode=${quote(container.networkMode)}")
}

if (container.selinuxPermissive) {
parts.add("--selinux-permissive")
}
Expand Down Expand Up @@ -114,6 +122,8 @@ object ContainerCommandBuilder {
if (container.enableIPv6) parts.add("--enable-ipv6")
if (container.enableAndroidStorage) parts.add("--enable-android-storage")
if (container.enableHwAccess) parts.add("--hw-access")
if (container.enableSensors) parts.add("--sensors")
if (container.networkMode != "host") parts.add("--network-mode=${quote(container.networkMode)}")
if (container.selinuxPermissive) parts.add("--selinux-permissive")
if (container.volatileMode) parts.add("-V")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ data class ContainerInfo(
val enableIPv6: Boolean = false,
val enableAndroidStorage: Boolean = false,
val enableHwAccess: Boolean = false,
val enableSensors: Boolean = false,
val networkMode: String = "host",
val selinuxPermissive: Boolean = false,
val volatileMode: Boolean = false,
val bindMounts: List<BindMount> = emptyList(),
Expand All @@ -48,6 +50,8 @@ data class ContainerInfo(
appendLine("enable_ipv6=${if (enableIPv6) "1" else "0"}")
appendLine("enable_android_storage=${if (enableAndroidStorage) "1" else "0"}")
appendLine("enable_hw_access=${if (enableHwAccess) "1" else "0"}")
appendLine("enable_sensors=${if (enableSensors) "1" else "0"}")
appendLine("network_mode=$networkMode")
appendLine("selinux_permissive=${if (selinuxPermissive) "1" else "0"}")
appendLine("volatile_mode=${if (volatileMode) "1" else "0"}")
if (bindMounts.isNotEmpty()) {
Expand Down Expand Up @@ -209,6 +213,8 @@ object ContainerManager {
enableIPv6 = configMap["enable_ipv6"] == "1",
enableAndroidStorage = configMap["enable_android_storage"] == "1",
enableHwAccess = configMap["enable_hw_access"] == "1",
enableSensors = configMap["enable_sensors"] == "1",
networkMode = configMap["network_mode"] ?: "host",
selinuxPermissive = configMap["selinux_permissive"] == "1",
volatileMode = configMap["volatile_mode"] == "1",
bindMounts = bindMounts,
Expand Down
Loading