Track HiveGrid Cloud planning reference

This commit is contained in:
david committed 2026-06-26 20:48:01 +02:00
1 parent b3d5ea6764
commit e341c5938a
5784 files changed
+1104929 -3

No files matched your search

@@ -0,0 +1,51 @@
# Android native project (skeleton)
Generated by hand for task #65 (Phase 08). The committed structure is
intentionally minimal — operators with Android Studio installed should run:
```bash
cd apps/mobile
rm -rf android
npx cap add android
npx cap sync android
```
…to overwrite this skeleton with the canonical Capacitor CLI output.
Application id, app name and webDir are sourced from
`apps/mobile/capacitor.config.ts` and stay stable across regenerations.
## Layout
```
android/
├── build.gradle # Top-level build config (AGP 8.7.2)
├── settings.gradle # Module includes + plugin paths
├── capacitor.settings.gradle # Per-plugin Gradle modules
├── gradle.properties # JVM heap + AndroidX
├── gradle/wrapper/
│ └── gradle-wrapper.properties # Gradle 8.11.1
└── app/
├── build.gradle # applicationId, sdk, deps, FCM hook
├── capacitor.build.gradle # Plugin module includes
└── src/main/
├── AndroidManifest.xml # Permissions, intent-filters, FileProvider
├── java/de/toolctrl/app/MainActivity.java # BridgeActivity
└── res/
├── values/strings.xml
├── values/styles.xml
├── values/colors.xml
├── xml/file_paths.xml
└── xml/network_security_config.xml
```
## Signing & store submission
Operator-owned. See `docs/operations/capacitor.md` for the full
Play-Console runbook (keystore generation, Gradle signing config,
service-account JSON, internal-track upload).
## Push notifications
`google-services.json` must be dropped into `android/app/` before any
release build. The plugin is wired conditionally in `app/build.gradle`
so debug builds without the file still compile.
@@ -0,0 +1,56 @@
apply plugin: 'com.android.application'
android {
namespace 'de.toolctrl.app'
compileSdk 34
defaultConfig {
applicationId 'de.toolctrl.app'
minSdkVersion 23
targetSdkVersion 34
versionCode 1
versionName '1.0'
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
aaptOptions {
// Files and dirs to omit from the APK
ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
}
repositories {
flatDir {
dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs'
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.appcompat:appcompat:1.7.0'
implementation 'androidx.coordinatorlayout:coordinatorlayout:1.2.0'
implementation 'androidx.core:core-splashscreen:1.0.1'
implementation project(':capacitor-android')
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.2.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
}
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 will not be available.")
}
@@ -0,0 +1,24 @@
// Generated by `npx cap sync android`. Hand-scaffolded skeleton here.
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
}
apply from: "../capacitor.settings.gradle"
dependencies {
implementation project(':capacitor-app')
implementation project(':capacitor-browser')
implementation project(':capacitor-local-notifications')
implementation project(':capacitor-preferences')
implementation project(':capacitor-push-notifications')
implementation project(':capacitor-splash-screen')
implementation project(':capacitor-status-bar')
implementation project(':sentry-capacitor')
}
if (hasProperty('postBuildExtras')) {
postBuildExtras()
}
@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Required for any HTTP traffic + push registration with FCM. -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- API 33+: runtime POST_NOTIFICATIONS permission for displaying pushes. -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<!-- Biometric prompt (Touch / Fingerprint). -->
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
<!-- Optional: camera for avatar / document capture (matches NSCameraUsageDescription on iOS). -->
<uses-permission android:name="android.permission.CAMERA" />
<application
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:networkSecurityConfig="@xml/network_security_config"
android:usesCleartextTraffic="false">
<activity
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode|navigation"
android:name="de.toolctrl.app.MainActivity"
android:label="@string/title_activity_main"
android:theme="@style/AppTheme.NoActionBarLaunch"
android:launchMode="singleTask"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- Custom URL scheme: toolctrl:// -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="toolctrl" />
</intent-filter>
</activity>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
</application>
</manifest>
@@ -0,0 +1,10 @@
package de.toolctrl.app;
import com.getcapacitor.BridgeActivity;
public class MainActivity extends BridgeActivity {
// The Capacitor 7 BridgeActivity wires plugin lifecycle, web-view
// configuration and deep-link handling. We do not override anything
// here; native customization (eg. status-bar color overrides) lives
// in AndroidManifest.xml + res/values/styles.xml.
}
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="splash_background">#FFFFFF</color>
</resources>
@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="app_name">ToolCtrl</string>
<string name="title_activity_main">ToolCtrl</string>
<string name="package_name">de.toolctrl.app</string>
<string name="custom_url_scheme">toolctrl</string>
</resources>
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
<item name="colorPrimary">#2563eb</item>
<item name="colorPrimaryDark">#1e40af</item>
<item name="colorAccent">#2563eb</item>
</style>
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="AppTheme.NoActionBarLaunch" parent="AppTheme.NoActionBar">
<item name="android:windowSplashScreenBackground">@color/splash_background</item>
</style>
</resources>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-files-path name="my_images" path="."/>
<cache-path name="my_cache_images" path="."/>
</paths>
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!-- HTTPS by default. The committed skeleton permits cleartext only to
localhost and the Android emulator host loopback (10.0.2.2) so
live-reload can reach `pnpm --filter @toolctrl/web dev`. -->
<base-config cleartextTrafficPermitted="false">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
<debug-overrides>
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</debug-overrides>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="false">localhost</domain>
<domain includeSubdomains="false">10.0.2.2</domain>
</domain-config>
</network-security-config>
@@ -0,0 +1,23 @@
// Top-level build file. Hand-scaffolded skeleton for task #65;
// regenerated by `npx cap add android` on the operator machine.
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.7.2'
classpath 'com.google.gms:google-services:4.4.2'
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
@@ -0,0 +1,27 @@
// Generated by `npx cap sync android` on the operator machine. This
// hand-scaffolded variant lists the plugins pinned in
// apps/mobile/package.json so the Android Studio project file system
// is consistent before the canonical regeneration.
include ':capacitor-app'
project(':capacitor-app').projectDir = new File('../../../node_modules/@capacitor/app/android')
include ':capacitor-browser'
project(':capacitor-browser').projectDir = new File('../../../node_modules/@capacitor/browser/android')
include ':capacitor-local-notifications'
project(':capacitor-local-notifications').projectDir = new File('../../../node_modules/@capacitor/local-notifications/android')
include ':capacitor-preferences'
project(':capacitor-preferences').projectDir = new File('../../../node_modules/@capacitor/preferences/android')
include ':capacitor-push-notifications'
project(':capacitor-push-notifications').projectDir = new File('../../../node_modules/@capacitor/push-notifications/android')
include ':capacitor-splash-screen'
project(':capacitor-splash-screen').projectDir = new File('../../../node_modules/@capacitor/splash-screen/android')
include ':capacitor-status-bar'
project(':capacitor-status-bar').projectDir = new File('../../../node_modules/@capacitor/status-bar/android')
include ':sentry-capacitor'
project(':sentry-capacitor').projectDir = new File('../../../node_modules/@sentry/capacitor/android')
@@ -0,0 +1,4 @@
# Gradle project-level properties. Hand-scaffolded for task #65.
org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m
android.useAndroidX=true
android.enableJetifier=true
@@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-all.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
@@ -0,0 +1,5 @@
include ':app'
include ':capacitor-android'
project(':capacitor-android').projectDir = new File('../../../node_modules/@capacitor/android/capacitor')
apply from: 'capacitor.settings.gradle'