From 9bd6dd5ef5eca15a8f1dedaceac402a8d304ac90 Mon Sep 17 00:00:00 2001
From: Joseph Yaksich
Date: Sun, 26 Jul 2026 08:30:52 +0000
Subject: [PATCH 1/2] feat: add secure mobile gateway clients
Signed-off-by: Joseph Yaksich
---
CHANGELOG.md | 35 +-
README.md | 35 +-
android/.gitignore | 101 ++
android/app/.gitignore | 2 +
android/app/build.gradle | 84 ++
android/app/capacitor.build.gradle | 24 +
android/app/proguard-rules.pro | 21 +
.../myapp/ExampleInstrumentedTest.java | 26 +
android/app/src/main/AndroidManifest.xml | 52 +
.../onehelm/mobile/MainActivity.java | 5 +
.../main/res/drawable-land-hdpi/splash.png | Bin 0 -> 49761 bytes
.../main/res/drawable-land-mdpi/splash.png | Bin 0 -> 25484 bytes
.../main/res/drawable-land-xhdpi/splash.png | Bin 0 -> 94919 bytes
.../main/res/drawable-land-xxhdpi/splash.png | Bin 0 -> 145674 bytes
.../main/res/drawable-land-xxxhdpi/splash.png | Bin 0 -> 220221 bytes
.../main/res/drawable-port-hdpi/splash.png | Bin 0 -> 48914 bytes
.../main/res/drawable-port-mdpi/splash.png | Bin 0 -> 25066 bytes
.../main/res/drawable-port-xhdpi/splash.png | Bin 0 -> 93165 bytes
.../main/res/drawable-port-xxhdpi/splash.png | Bin 0 -> 141427 bytes
.../main/res/drawable-port-xxxhdpi/splash.png | Bin 0 -> 214485 bytes
.../drawable-v24/ic_launcher_foreground.xml | 34 +
.../res/drawable/ic_launcher_background.xml | 170 ++++
android/app/src/main/res/drawable/splash.png | Bin 0 -> 25484 bytes
.../app/src/main/res/layout/activity_main.xml | 12 +
.../res/mipmap-anydpi-v26/ic_launcher.xml | 5 +
.../mipmap-anydpi-v26/ic_launcher_round.xml | 5 +
.../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 9756 bytes
.../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 36970 bytes
.../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 9756 bytes
.../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 4839 bytes
.../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 19148 bytes
.../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 4839 bytes
.../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 15954 bytes
.../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 57979 bytes
.../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 15954 bytes
.../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 30566 bytes
.../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 108519 bytes
.../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 30566 bytes
.../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 48139 bytes
.../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 168135 bytes
.../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 48139 bytes
.../res/values/ic_launcher_background.xml | 4 +
android/app/src/main/res/values/strings.xml | 7 +
android/app/src/main/res/values/styles.xml | 28 +
.../main/res/xml/data_extraction_rules.xml | 15 +
android/app/src/main/res/xml/file_paths.xml | 5 +
.../getcapacitor/myapp/ExampleUnitTest.java | 18 +
android/build.gradle | 29 +
android/capacitor.settings.gradle | 21 +
android/gradle.properties | 22 +
android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43764 bytes
.../gradle/wrapper/gradle-wrapper.properties | 7 +
android/gradlew | 251 +++++
android/gradlew.bat | 94 ++
android/settings.gradle | 5 +
android/variables.gradle | 16 +
capacitor.config.json | 53 ++
docs/release-checklist.md | 22 +-
docs/release-lifecycle.md | 9 +-
ios/.gitignore | 13 +
ios/App/App.xcodeproj/project.pbxproj | 380 ++++++++
.../xcshareddata/IDEWorkspaceChecks.plist | 8 +
ios/App/App/AppDelegate.swift | 49 +
.../AppIcon.appiconset/AppIcon-512@2x.png | Bin 0 -> 638097 bytes
.../AppIcon.appiconset/Contents.json | 14 +
ios/App/App/Assets.xcassets/Contents.json | 6 +
.../Splash.imageset/Contents.json | 23 +
.../Splash.imageset/splash-2732x2732-1.png | Bin 0 -> 713541 bytes
.../Splash.imageset/splash-2732x2732-2.png | Bin 0 -> 713541 bytes
.../Splash.imageset/splash-2732x2732.png | Bin 0 -> 713541 bytes
.../App/Base.lproj/LaunchScreen.storyboard | 32 +
ios/App/App/Base.lproj/Main.storyboard | 19 +
ios/App/App/Info.plist | 70 ++
ios/App/App/PrivacyInfo.xcprivacy | 14 +
ios/App/CapApp-SPM/.gitignore | 9 +
ios/App/CapApp-SPM/Package.swift | 37 +
ios/App/CapApp-SPM/README.md | 5 +
.../Sources/CapApp-SPM/CapApp-SPM.swift | 1 +
ios/debug.xcconfig | 1 +
package-lock.json | 898 +++++++++++++++++-
package.json | 17 +-
public/index.html | 2 +-
scripts/generate-mobile-assets.mjs | 58 ++
scripts/package-android-apk.mjs | 58 ++
scripts/package-ios-ipa.mjs | 49 +
scripts/run-test-suite.mjs | 2 +-
scripts/sync-mobile-version.mjs | 18 +
src/client/api.ts | 25 +-
src/client/app.ts | 81 +-
src/client/mobile.ts | 145 +++
src/client/onboarding.ts | 2 +-
src/client/routing.ts | 5 +-
src/client/settings.ts | 22 +-
src/client/term.ts | 4 +-
src/server/channel-computers.ts | 2 +-
src/server/db.ts | 2 +-
src/server/index.ts | 29 +
test/channel-computers.mjs | 2 +-
test/mobile.mjs | 213 +++++
99 files changed, 3463 insertions(+), 69 deletions(-)
create mode 100644 android/.gitignore
create mode 100644 android/app/.gitignore
create mode 100644 android/app/build.gradle
create mode 100644 android/app/capacitor.build.gradle
create mode 100644 android/app/proguard-rules.pro
create mode 100644 android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java
create mode 100644 android/app/src/main/AndroidManifest.xml
create mode 100644 android/app/src/main/java/com/gitcommit90/onehelm/mobile/MainActivity.java
create mode 100644 android/app/src/main/res/drawable-land-hdpi/splash.png
create mode 100644 android/app/src/main/res/drawable-land-mdpi/splash.png
create mode 100644 android/app/src/main/res/drawable-land-xhdpi/splash.png
create mode 100644 android/app/src/main/res/drawable-land-xxhdpi/splash.png
create mode 100644 android/app/src/main/res/drawable-land-xxxhdpi/splash.png
create mode 100644 android/app/src/main/res/drawable-port-hdpi/splash.png
create mode 100644 android/app/src/main/res/drawable-port-mdpi/splash.png
create mode 100644 android/app/src/main/res/drawable-port-xhdpi/splash.png
create mode 100644 android/app/src/main/res/drawable-port-xxhdpi/splash.png
create mode 100644 android/app/src/main/res/drawable-port-xxxhdpi/splash.png
create mode 100644 android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
create mode 100644 android/app/src/main/res/drawable/ic_launcher_background.xml
create mode 100644 android/app/src/main/res/drawable/splash.png
create mode 100644 android/app/src/main/res/layout/activity_main.xml
create mode 100644 android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
create mode 100644 android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png
create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png
create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
create mode 100644 android/app/src/main/res/values/ic_launcher_background.xml
create mode 100644 android/app/src/main/res/values/strings.xml
create mode 100644 android/app/src/main/res/values/styles.xml
create mode 100644 android/app/src/main/res/xml/data_extraction_rules.xml
create mode 100644 android/app/src/main/res/xml/file_paths.xml
create mode 100644 android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java
create mode 100644 android/build.gradle
create mode 100644 android/capacitor.settings.gradle
create mode 100644 android/gradle.properties
create mode 100644 android/gradle/wrapper/gradle-wrapper.jar
create mode 100644 android/gradle/wrapper/gradle-wrapper.properties
create mode 100755 android/gradlew
create mode 100644 android/gradlew.bat
create mode 100644 android/settings.gradle
create mode 100644 android/variables.gradle
create mode 100644 capacitor.config.json
create mode 100644 ios/.gitignore
create mode 100644 ios/App/App.xcodeproj/project.pbxproj
create mode 100644 ios/App/App.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
create mode 100644 ios/App/App/AppDelegate.swift
create mode 100644 ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png
create mode 100644 ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json
create mode 100644 ios/App/App/Assets.xcassets/Contents.json
create mode 100644 ios/App/App/Assets.xcassets/Splash.imageset/Contents.json
create mode 100644 ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png
create mode 100644 ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png
create mode 100644 ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png
create mode 100644 ios/App/App/Base.lproj/LaunchScreen.storyboard
create mode 100644 ios/App/App/Base.lproj/Main.storyboard
create mode 100644 ios/App/App/Info.plist
create mode 100644 ios/App/App/PrivacyInfo.xcprivacy
create mode 100644 ios/App/CapApp-SPM/.gitignore
create mode 100644 ios/App/CapApp-SPM/Package.swift
create mode 100644 ios/App/CapApp-SPM/README.md
create mode 100644 ios/App/CapApp-SPM/Sources/CapApp-SPM/CapApp-SPM.swift
create mode 100644 ios/debug.xcconfig
create mode 100644 scripts/generate-mobile-assets.mjs
create mode 100644 scripts/package-android-apk.mjs
create mode 100644 scripts/package-ios-ipa.mjs
create mode 100644 scripts/sync-mobile-version.mjs
create mode 100644 src/client/mobile.ts
create mode 100644 test/mobile.mjs
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7e9cead..d943dc5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,38 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
+## [0.0.13] - 2026-07-26
+
+### Added
+
+- iPhone, iPad, and Android now have thin Capacitor gateway clients for an
+ already configured 1Helm host. The connection screen accepts an HTTPS server
+ address, username, and password, confirms the host's explicit mobile
+ compatibility contract, and never exposes first-run host setup.
+- Android ships as a directly distributed, signed universal APK with a stable
+ application ID and permanent release certificate. Release builds fail
+ closed without external signing material and verify alignment, package and
+ version metadata, v2/v3 signatures, and native ABI coverage.
+- iOS has an App Store archive/export path with iPhone and iPad support, stable
+ bundle and callback identifiers, a privacy manifest, and the required
+ microphone, speech, and encryption declarations.
+
+### Security
+
+- Mobile passwords are used only for the sign-in request and are never saved.
+ Sessions are kept in the device-only iOS Keychain or encrypted with an
+ Android Keystore-held key; Disconnect erases the session and server address.
+- The packaged local web client connects only to HTTPS servers, disables
+ native WebView debugging and release logging, rejects cleartext traffic and
+ Android backups, and limits server CORS to the two packaged Capacitor origins.
+
+### Changed
+
+- Authenticated API calls, files, avatars, workspace photos, terminals, app
+ events, external links, and provider OAuth flows now resolve correctly
+ through a selected mobile server while bundled brand and resident character
+ assets remain local.
+
## [0.0.12] - 2026-07-26
### Fixed
@@ -348,7 +380,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
notarization, stapled tickets, Gatekeeper verification, persistent
Application Support, and isolated Apple container machines.
-[Unreleased]: https://github.com/gitcommit90/1Helm/compare/v0.0.12...HEAD
+[Unreleased]: https://github.com/gitcommit90/1Helm/compare/v0.0.13...HEAD
+[0.0.13]: https://github.com/gitcommit90/1Helm/releases/tag/v0.0.13
[0.0.12]: https://github.com/gitcommit90/1Helm/releases/tag/v0.0.12
[0.0.11]: https://github.com/gitcommit90/1Helm/releases/tag/v0.0.11
[0.0.10]: https://github.com/gitcommit90/1Helm/releases/tag/v0.0.10
diff --git a/README.md b/README.md
index d1859e4..66728da 100644
--- a/README.md
+++ b/README.md
@@ -18,6 +18,8 @@
·
for Linux
·
+ for Android
+ ·
The story
·
Ship's manual
@@ -32,7 +34,7 @@
Self-hosted
Model-agnostic
Signed + notarized
- macOS · Windows · Linux
+ macOS · Windows · Linux · iOS · Android
---
@@ -132,6 +134,26 @@ digest-verified, health-checked updater — see the
it works best on a dedicated machine: your crew works around the clock, and
your everyday computer takes naps.
+### Connect from iPhone, iPad, or Android
+
+The mobile apps are thin, native gateways to a 1Helm you already run. Install
+and finish setup on a supported Mac, Windows, or Linux host first, give that
+host an HTTPS address, then enter the address, username, and password in the
+mobile app. The password is used only for sign-in and is never retained; the
+resulting session is stored in the iOS Keychain or encrypted with a key held by
+Android Keystore.
+
+- iPhone and iPad use the App Store build under the stable bundle identifier
+ `com.gitcommit90.onehelm.mobile`.
+- Android is distributed directly as `1Helm--universal.apk` on the
+ matching GitHub Release. Android may ask you to allow installs from the app
+ you used to open the file. Verify the release SHA-256 and install it; future
+ releases signed by the same permanent 1Helm certificate install in place.
+- The native clients require HTTPS, do not contain or initialize the 1Helm
+ server, and do not retain host data or provider credentials beyond the
+ selected server address and secure session token. Use **Disconnect** in the
+ profile menu to erase both from the device.
+
## Ready on day one. Specialized by day one hundred.
@@ -223,6 +245,8 @@ and an audit trail. A prompt saying “use this service” is not a connector.
- Host-owned updates: a signed native Mac updater plus an atomic,
digest-verified Linux system service with health-check rollback.
- Signed, Apple-notarized, stapled Apple Silicon DMG releases.
+- Native iPhone/iPad and directly distributed Android gateway clients for an
+ already configured HTTPS 1Helm host.
### Platform truth
@@ -231,10 +255,11 @@ and an audit trail. A prompt saying “use this service” is not a connector.
| **Apple Silicon macOS 26** | Native desktop product and real isolated Linux computer per resident (Apple `container machine`, `home-mount=none`). |
| **Linux / CI** | Supported headless systemd host with one unprivileged LXC per resident (subordinate UID/GID mapping, exact ownership checks); CI may select an explicit test backend. |
| **Windows 11 x64** | Native desktop product with one private WSL 2 world per resident (Windows-drive mounts and interop disabled); the signed Setup executable ships with every release. |
+| **iPhone and iPad** | App Store gateway to an already configured HTTPS 1Helm host; sessions live in the device-only iOS Keychain. |
+| **Android 7+** | Directly distributed signed universal APK gateway; sessions are encrypted by a key held in Android Keystore. |
-Not yet shipped: a native Linux desktop shell, mobile clients, a hosted
-control plane, rich Photon attachment fidelity, or blind execution of
-community skills.
+Not yet shipped: a native Linux desktop shell, a hosted control plane, rich
+Photon attachment fidelity, or blind execution of community skills.
## Run the source workspace
@@ -257,7 +282,7 @@ A fresh data directory opens first-run setup. The source runtime defaults to
| `PORT` | `8123` | HTTP/WebSocket control-plane port. |
| `CTRL_DATA_DIR` | `./data` | Databases, routing state, uploads, and narrow workspace mirrors. |
| `HELM_CHANNEL_COMPUTER_BACKEND` | `apple` on macOS, `lxc` on Linux, `wsl` on Windows | Host isolation backend; `native` and `mock` are explicit development/test overrides. |
-| `HELM_CHANNEL_MACHINE_IMAGE` | `local/1helm-channel-machine:0.0.12` | Versioned channel-machine image contract. |
+| `HELM_CHANNEL_MACHINE_IMAGE` | `local/1helm-channel-machine:0.0.13` | Versioned channel-machine image contract. |
### Agent-first JSON CLI
diff --git a/android/.gitignore b/android/.gitignore
new file mode 100644
index 0000000..5af5489
--- /dev/null
+++ b/android/.gitignore
@@ -0,0 +1,101 @@
+# Using Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore
+
+# Built application files
+*.apk
+*.aar
+*.ap_
+*.aab
+
+# Files for the ART/Dalvik VM
+*.dex
+
+# Java class files
+*.class
+
+# Generated files
+bin/
+gen/
+out/
+# Uncomment the following line in case you need and you don't have the release build type files in your app
+# release/
+
+# Gradle files
+.gradle/
+build/
+
+# Local configuration file (sdk path, etc)
+local.properties
+
+# Proguard folder generated by Eclipse
+proguard/
+
+# Log Files
+*.log
+
+# Android Studio Navigation editor temp files
+.navigation/
+
+# Android Studio captures folder
+captures/
+
+# IntelliJ
+*.iml
+.idea/workspace.xml
+.idea/tasks.xml
+.idea/gradle.xml
+.idea/assetWizardSettings.xml
+.idea/dictionaries
+.idea/libraries
+# Android Studio 3 in .gitignore file.
+.idea/caches
+.idea/modules.xml
+# Comment next line if keeping position of elements in Navigation Editor is relevant for you
+.idea/navEditor.xml
+
+# Keystore files
+*.jks
+*.keystore
+*.properties.local
+
+# External native build folder generated in Android Studio 2.2 and later
+.externalNativeBuild
+.cxx/
+
+# Google Services (e.g. APIs or Firebase)
+# google-services.json
+
+# Freeline
+freeline.py
+freeline/
+freeline_project_description.json
+
+# fastlane
+fastlane/report.xml
+fastlane/Preview.html
+fastlane/screenshots
+fastlane/test_output
+fastlane/readme.md
+
+# Version control
+vcs.xml
+
+# lint
+lint/intermediates/
+lint/generated/
+lint/outputs/
+lint/tmp/
+# lint/reports/
+
+# Android Profiling
+*.hprof
+
+# Cordova plugins for Capacitor
+capacitor-cordova-android-plugins
+
+# Copied web assets
+app/src/main/assets/public
+
+# Generated Config files
+app/src/main/assets/capacitor.config.json
+app/src/main/assets/capacitor.plugins.json
+app/src/main/res/xml/config.xml
diff --git a/android/app/.gitignore b/android/app/.gitignore
new file mode 100644
index 0000000..043df80
--- /dev/null
+++ b/android/app/.gitignore
@@ -0,0 +1,2 @@
+/build/*
+!/build/.npmkeep
diff --git a/android/app/build.gradle b/android/app/build.gradle
new file mode 100644
index 0000000..4f25f81
--- /dev/null
+++ b/android/app/build.gradle
@@ -0,0 +1,84 @@
+import java.util.Properties
+
+apply plugin: 'com.android.application'
+
+def oneHelmVersion = new groovy.json.JsonSlurper().parseText(file('../../package.json').text).version as String
+def oneHelmVersionParts = oneHelmVersion.tokenize('.').collect { it as int }
+def oneHelmVersionCode = oneHelmVersionParts[0] * 1000000 + oneHelmVersionParts[1] * 1000 + oneHelmVersionParts[2]
+def signingPropertiesPath = System.getenv('HELM_ANDROID_SIGNING_PROPERTIES')
+def signingProperties = new Properties()
+if (signingPropertiesPath) {
+ def signingPropertiesFile = file(signingPropertiesPath)
+ if (!signingPropertiesFile.isFile()) throw new GradleException('HELM_ANDROID_SIGNING_PROPERTIES does not name a readable file.')
+ signingPropertiesFile.withInputStream { signingProperties.load(it) }
+}
+
+android {
+ namespace = "com.gitcommit90.onehelm.mobile"
+ compileSdk = rootProject.ext.compileSdkVersion
+ defaultConfig {
+ applicationId "com.gitcommit90.onehelm.mobile"
+ minSdkVersion rootProject.ext.minSdkVersion
+ targetSdkVersion rootProject.ext.targetSdkVersion
+ versionCode oneHelmVersionCode
+ versionName oneHelmVersion
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ aaptOptions {
+ // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
+ // Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61
+ ignoreAssetsPattern = '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~'
+ }
+ }
+ signingConfigs {
+ release {
+ if (signingPropertiesPath) {
+ storeFile file(signingProperties.getProperty('storeFile'))
+ storePassword signingProperties.getProperty('storePassword')
+ keyAlias signingProperties.getProperty('keyAlias')
+ keyPassword signingProperties.getProperty('keyPassword')
+ enableV1Signing true
+ enableV2Signing true
+ enableV3Signing true
+ enableV4Signing true
+ }
+ }
+ }
+ buildTypes {
+ release {
+ if (!signingPropertiesPath) throw new GradleException('Release builds require HELM_ANDROID_SIGNING_PROPERTIES.')
+ signingConfig signingConfigs.release
+ minifyEnabled true
+ shrinkResources true
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+repositories {
+ flatDir{
+ dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs'
+ }
+}
+
+dependencies {
+ implementation fileTree(include: ['*.jar'], dir: 'libs')
+ implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"
+ implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion"
+ implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion"
+ implementation project(':capacitor-android')
+ testImplementation "junit:junit:$junitVersion"
+ androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
+ androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
+ implementation project(':capacitor-cordova-android-plugins')
+}
+
+apply from: 'capacitor.build.gradle'
+
+try {
+ def servicesJSON = file('google-services.json')
+ if (servicesJSON.text) {
+ apply plugin: 'com.google.gms.google-services'
+ }
+} catch(Exception e) {
+ logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work")
+}
diff --git a/android/app/capacitor.build.gradle b/android/app/capacitor.build.gradle
new file mode 100644
index 0000000..8062541
--- /dev/null
+++ b/android/app/capacitor.build.gradle
@@ -0,0 +1,24 @@
+// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN
+
+android {
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_21
+ targetCompatibility JavaVersion.VERSION_21
+ }
+}
+
+apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle"
+dependencies {
+ implementation project(':aparajita-capacitor-secure-storage')
+ implementation project(':capacitor-app')
+ implementation project(':capacitor-browser')
+ implementation project(':capacitor-keyboard')
+ implementation project(':capacitor-splash-screen')
+ implementation project(':capacitor-status-bar')
+
+}
+
+
+if (hasProperty('postBuildExtras')) {
+ postBuildExtras()
+}
diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro
new file mode 100644
index 0000000..f1b4245
--- /dev/null
+++ b/android/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java b/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..f2c2217
--- /dev/null
+++ b/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package com.getcapacitor.myapp;
+
+import static org.junit.Assert.*;
+
+import android.content.Context;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+
+ @Test
+ public void useAppContext() throws Exception {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+
+ assertEquals("com.getcapacitor.app", appContext.getPackageName());
+ }
+}
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..470cdd3
--- /dev/null
+++ b/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/java/com/gitcommit90/onehelm/mobile/MainActivity.java b/android/app/src/main/java/com/gitcommit90/onehelm/mobile/MainActivity.java
new file mode 100644
index 0000000..b5099ce
--- /dev/null
+++ b/android/app/src/main/java/com/gitcommit90/onehelm/mobile/MainActivity.java
@@ -0,0 +1,5 @@
+package com.gitcommit90.onehelm.mobile;
+
+import com.getcapacitor.BridgeActivity;
+
+public class MainActivity extends BridgeActivity {}
diff --git a/android/app/src/main/res/drawable-land-hdpi/splash.png b/android/app/src/main/res/drawable-land-hdpi/splash.png
new file mode 100644
index 0000000000000000000000000000000000000000..5ca6e098d9a35b4434bae10f56d86ce415bd9efe
GIT binary patch
literal 49761
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