feat: android webview app + APK build script + CI artifact
CI / test-and-package (push) Successful in 43s
CI / build-android (push) Failing after 39s

Android app (WebView wrapper):
- Wraps the public household sharing URL in a native Android app
- Swipe-to-refresh, error handling, back navigation, settings dialog
- User enters their household's public URL on first launch
- Material Design with toolbar, progress indicator

Build tooling:
- build-apk.sh: one-command APK build (auto-installs Java, SDK, Gradle)
- .gitignore updated for Android build artifacts

CI (.gitea/workflows/ci.yml):
- New 'build-android' job (needs test-and-package)
- Installs Android SDK + Java 17, builds debug APK
- Uploads APK as 'meal-tracker-apk' artifact
This commit is contained in:
agentbox
2026-08-01 10:28:54 +00:00
parent ae95841b5b
commit 92c69ddf4b
24 changed files with 1082 additions and 0 deletions
@@ -0,0 +1,81 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/swipe_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:title="@string/app_name"
app:titleTextColor="@android:color/white"
android:background="@color/colorPrimary">
<ImageButton
android:id="@+id/btn_refresh"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="end"
android:layout_marginEnd="4dp"
android:src="@drawable/ic_refresh"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/refresh" />
<ImageButton
android:id="@+id/btn_settings"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="end"
android:layout_marginEnd="4dp"
android:src="@drawable/ic_settings"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="@string/settings" />
</androidx.appcompat.widget.Toolbar>
<ProgressBar
android:id="@+id/progress_bar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="3dp"
android:indeterminate="true"
android:visibility="gone"
android:indeterminateTint="@color/colorAccent" />
</com.google.android.material.appbar.AppBarLayout>
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<TextView
android:id="@+id/error_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:padding="32dp"
android:textSize="16sp"
android:textColor="@android:color/darker_gray"
android:visibility="gone"
android:clickable="true"
android:focusable="true"
android:background="?attr/selectableItemBackground"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>