Track HiveGrid Cloud planning reference
This commit is contained in:
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>
|
||||
+10
@@ -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'
|
||||
Reference in new issue
Block a user