Set up project skeleton (milestone 1)

- Architecture and feature overview in docs/ARCHITECTURE.md
- Gradle 9.8 / AGP 9.4 / Kotlin 2.4 with version catalog and convention plugins
- Modules :app, :core:*, :device-profiles, :feature:* (placeholder screens)
- Flavors core (no INTERNET, enforced by a build check) and full
- Material You theme, navigation, expert mode and dry-run settings (DataStore)
- Pixel 8-10 device detection, unit tests, GPLv3 license, English README with Obtainium badge

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
2026-10-15 22:02:14 +02:00
co-authored by Claude Opus 5.5
commit 0a7caf6c5f
117 changed files with 3175 additions and 0 deletions
+7
View File
@@ -0,0 +1,7 @@
plugins {
alias(libs.plugins.pixelwall.android.feature)
}
android {
namespace = "org.pixelwall.feature.changelog"
}
@@ -0,0 +1,17 @@
package org.pixelwall.feature.changelog
import androidx.compose.ui.res.stringResource
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import org.pixelwall.core.ui.component.PlaceholderScreen
const val CHANGELOG_ROUTE = "changelog"
fun NavGraphBuilder.changelogScreen() {
composable(CHANGELOG_ROUTE) {
PlaceholderScreen(
title = stringResource(R.string.changelog_title),
description = stringResource(R.string.changelog_description),
)
}
}
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="changelog_title">Änderungsprotokoll</string>
<string name="changelog_description">Jede Änderung, die Pixelwall vorgenommen hat, mit Rückgängig.</string>
</resources>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="changelog_title">Change log</string>
<string name="changelog_description">Every change Pixelwall made, with undo.</string>
</resources>
+7
View File
@@ -0,0 +1,7 @@
plugins {
alias(libs.plugins.pixelwall.android.feature)
}
android {
namespace = "org.pixelwall.feature.dashboard"
}
@@ -0,0 +1,17 @@
package org.pixelwall.feature.dashboard
import androidx.compose.ui.res.stringResource
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import org.pixelwall.core.ui.component.PlaceholderScreen
const val DASHBOARD_ROUTE = "dashboard"
fun NavGraphBuilder.dashboardScreen() {
composable(DASHBOARD_ROUTE) {
PlaceholderScreen(
title = stringResource(R.string.dashboard_title),
description = stringResource(R.string.dashboard_description),
)
}
}
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="dashboard_title">Übersicht</string>
<string name="dashboard_description">Sicherheitsbewertung und Befunde für dieses Gerät.</string>
</resources>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="dashboard_title">Overview</string>
<string name="dashboard_description">Security score and findings for this device.</string>
</resources>
+7
View File
@@ -0,0 +1,7 @@
plugins {
alias(libs.plugins.pixelwall.android.feature)
}
android {
namespace = "org.pixelwall.feature.monitor"
}
View File
@@ -0,0 +1,17 @@
package org.pixelwall.feature.monitor
import androidx.compose.ui.res.stringResource
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import org.pixelwall.core.ui.component.PlaceholderScreen
const val MONITOR_ROUTE = "monitor"
fun NavGraphBuilder.monitorScreen() {
composable(MONITOR_ROUTE) {
PlaceholderScreen(
title = stringResource(R.string.monitor_title),
description = stringResource(R.string.monitor_description),
)
}
}
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="monitor_title">Überwachung</string>
<string name="monitor_description">Hinweise bei neuen Apps, neuen Berechtigungen und zurückgesetzten Einstellungen.</string>
</resources>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="monitor_title">Monitoring</string>
<string name="monitor_description">Alerts for new apps, new permissions and reset settings.</string>
</resources>
+7
View File
@@ -0,0 +1,7 @@
plugins {
alias(libs.plugins.pixelwall.android.feature)
}
android {
namespace = "org.pixelwall.feature.network"
}
View File
@@ -0,0 +1,17 @@
package org.pixelwall.feature.network
import androidx.compose.ui.res.stringResource
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import org.pixelwall.core.ui.component.PlaceholderScreen
const val NETWORK_ROUTE = "network"
fun NavGraphBuilder.networkScreen() {
composable(NETWORK_ROUTE) {
PlaceholderScreen(
title = stringResource(R.string.network_title),
description = stringResource(R.string.network_description),
)
}
}
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="network_title">Netzwerk</string>
<string name="network_description">Privates DNS, Funkverbindungen und die optionale Firewall.</string>
</resources>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="network_title">Network</string>
<string name="network_description">Private DNS, radios and the optional firewall.</string>
</resources>
+7
View File
@@ -0,0 +1,7 @@
plugins {
alias(libs.plugins.pixelwall.android.feature)
}
android {
namespace = "org.pixelwall.feature.onboarding"
}
@@ -0,0 +1,17 @@
package org.pixelwall.feature.onboarding
import androidx.compose.ui.res.stringResource
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import org.pixelwall.core.ui.component.PlaceholderScreen
const val ONBOARDING_ROUTE = "onboarding"
fun NavGraphBuilder.onboardingScreen() {
composable(ONBOARDING_ROUTE) {
PlaceholderScreen(
title = stringResource(R.string.onboarding_title),
description = stringResource(R.string.onboarding_description),
)
}
}
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="onboarding_title">Zugriffsstufen</string>
<string name="onboarding_description">Shizuku oder die ADB-Freigabe einrichten, um Änderungen freizuschalten.</string>
</resources>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="onboarding_title">Access levels</string>
<string name="onboarding_description">Set up Shizuku or the ADB grant to unlock changes.</string>
</resources>
+7
View File
@@ -0,0 +1,7 @@
plugins {
alias(libs.plugins.pixelwall.android.feature)
}
android {
namespace = "org.pixelwall.feature.permissions"
}
@@ -0,0 +1,17 @@
package org.pixelwall.feature.permissions
import androidx.compose.ui.res.stringResource
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import org.pixelwall.core.ui.component.PlaceholderScreen
const val PERMISSIONS_ROUTE = "permissions"
fun NavGraphBuilder.permissionsScreen() {
composable(PERMISSIONS_ROUTE) {
PlaceholderScreen(
title = stringResource(R.string.permissions_title),
description = stringResource(R.string.permissions_description),
)
}
}
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="permissions_title">Berechtigungen</string>
<string name="permissions_description">App-Berechtigungen und AppOps fein justieren.</string>
</resources>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="permissions_title">Permissions</string>
<string name="permissions_description">Fine-tune app permissions and app operations.</string>
</resources>
+7
View File
@@ -0,0 +1,7 @@
plugins {
alias(libs.plugins.pixelwall.android.feature)
}
android {
namespace = "org.pixelwall.feature.profiles"
}
View File
@@ -0,0 +1,17 @@
package org.pixelwall.feature.profiles
import androidx.compose.ui.res.stringResource
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import org.pixelwall.core.ui.component.PlaceholderScreen
const val PROFILES_ROUTE = "profiles"
fun NavGraphBuilder.profilesScreen() {
composable(PROFILES_ROUTE) {
PlaceholderScreen(
title = stringResource(R.string.profiles_title),
description = stringResource(R.string.profiles_description),
)
}
}
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="profiles_title">Profile</string>
<string name="profiles_description">Vordefinierte und eigene Profile, Regeln und Automatisierung.</string>
</resources>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="profiles_title">Profiles</string>
<string name="profiles_description">Predefined and custom profiles, rules and automation.</string>
</resources>
+7
View File
@@ -0,0 +1,7 @@
plugins {
alias(libs.plugins.pixelwall.android.feature)
}
android {
namespace = "org.pixelwall.feature.system"
}
View File
@@ -0,0 +1,17 @@
package org.pixelwall.feature.system
import androidx.compose.ui.res.stringResource
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import org.pixelwall.core.ui.component.PlaceholderScreen
const val SYSTEM_ROUTE = "system"
fun NavGraphBuilder.systemScreen() {
composable(SYSTEM_ROUTE) {
PlaceholderScreen(
title = stringResource(R.string.system_title),
description = stringResource(R.string.system_description),
)
}
}
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="system_title">System &amp; Google</string>
<string name="system_description">Systemschalter und eine Checkliste für dein Google-Konto.</string>
</resources>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="system_title">System &amp; Google</string>
<string name="system_description">System toggles and a checklist for your Google account.</string>
</resources>
+7
View File
@@ -0,0 +1,7 @@
plugins {
alias(libs.plugins.pixelwall.android.feature)
}
android {
namespace = "org.pixelwall.feature.trackers"
}
View File
@@ -0,0 +1,17 @@
package org.pixelwall.feature.trackers
import androidx.compose.ui.res.stringResource
import androidx.navigation.NavGraphBuilder
import androidx.navigation.compose.composable
import org.pixelwall.core.ui.component.PlaceholderScreen
const val TRACKERS_ROUTE = "trackers"
fun NavGraphBuilder.trackersScreen() {
composable(TRACKERS_ROUTE) {
PlaceholderScreen(
title = stringResource(R.string.trackers_title),
description = stringResource(R.string.trackers_description),
)
}
}
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="trackers_title">Tracker</string>
<string name="trackers_description">Offline-Erkennung von Trackern in installierten Apps.</string>
</resources>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="trackers_title">Trackers</string>
<string name="trackers_description">Offline tracker detection in installed apps.</string>
</resources>