# X4.25 — Hardware Validation + APK Build Report

Date: 2026-10-07

## Environment

| Item | Value |
|---|---|
| Android device | **TIDAK ADA** (`adb devices` kosong — tidak ada tablet/device Android terhubung ke mesin dev) |
| Bluetooth printer | **TIDAK TERIDENTIFIKASI** — device ter-pairing hanyalah ponsel/speaker/headset (Redmi 13C, vivo 1904, P47, JBL Flip 2, ROBOT RB290, i12, RPP02N, dll.); tidak ada printer SPP yang dapat dipastikan |
| Java/JDK | OpenJDK Temurin 11.0.28 (build agent dengan AGP 7.4.2 — kompatibel JDK 11) |
| Gradle | 7.6.4 (diunduh ke `~/x4.25-toolchain`, di luar repo) |
| Android SDK | `C:\Android\sdk` (platform android-33, build-tools 33.0.1) |
| build-tools | 33.0.1 (aapt/aapt2) |
| APK | `android-print-agent/build/outputs/apk/debug/pos-print-agent-debug.apk` |
| Printer brand/model | UNKNOWN (requirement input X4.23 belum terisi) |

## Build — **PASS**

- `gradle assembleDebug` → **BUILD SUCCESSFUL** (29 tasks; 2 percobaan — perbaikan settings.gradle: `dependencyResolutionManagement` untuk resolusi aapt2).
- APK: `pos-print-agent-debug.apk`, **57,345 bytes**, package `id.sategajah.printagent`, versionCode 1 / versionName `0.1.0-mvp`, minSdk **29** (Android 10+), targetSdk 33, compileSdk 33.
- Satu catatan deprecation (`createRfcommSocketToServiceRecord`) — API SPP standar, diterima/didokumentasikan.
- **Static verification (aapt):** permissions persis sesuai desain (BLUETOOTH maxSdk 30, BLUETOOTH_CONNECT, INTERNET, FOREGROUND_SERVICE, FOREGROUND_SERVICE_CONNECTED_DEVICE, RECEIVE_BOOT_COMPLETED — tanpa permission berlebih); activity exported (launcher), **service exported=false**, receiver BOOT_COMPLETED exported=true (wajib untuk broadcast sistem).
- **Secret scan:** bersih — nol hardcoded token/password/api_key/secret; header Authorization dibangun saat runtime dari token tersimpan (Keystore AES-GCM).

## Installation — **NOT TESTED**

Tidak ada perangkat Android (`adb devices` = empty). `adb install` tidak dieksekusi.

## H1–H10

| Test | Result | Evidence |
|---|---|---|
| H1 Pairing | **NOT TESTED** | tanpa tablet Android + tanpa printer SPP |
| H2 Local Test Print | **NOT TESTED** | idem |
| H3 Real POS Kitchen Order | **NOT TESTED** | idem — TIDAK ada claim/ACK dari Android yang pernah terjadi |
| H4 Multiple Jobs | **NOT TESTED** | idem |
| H5 Printer Disconnected | **NOT TESTED** | idem |
| H6 Printer Reconnect | **NOT TESTED** | idem |
| H7 Service Restart | **NOT TESTED** | idem |
| H8 Network Interruption | **NOT TESTED** | idem |
| H9 Long Payload | **NOT TESTED** | idem |
| H10 Indonesian Text | **NOT TESTED** | idem |

Tidak ada satu pun yang dikonversi menjadi PASS. Semua perilaku failure/recovery yang diuji H5–H8 sudah dibuktikan di level pipeline JVM (X4.24, 48 tes) — tetapi bukti itu **bukan** bukti hardware.

## Duplicate-print test

Tidak direproduksi dengan hardware (tanpa device). Invarian X4.24 (Android tidak pernah mencetak ulang lokal karena ACK timeout) tetap teruji di JVM: `testAckTimeoutNeverReprintsLocally`.

## Windows ↔ Android switchover

**NOT TESTED** (butuh device terdaftar di POS + dua agent fisik). Aturan operasional tetap: **hanya SATU agent KITCHEN aktif per destinasi** (dua aktif = job terbagi). Prosedur: nonaktifkan device lawan via UI Perangkat.

## Battery / foreground service

Tidak dapat diinspeksi tanpa device. Desain: foreground notification ongoing + `FOREGROUND_SERVICE_CONNECTED_DEVICE` + `START_STICKY` + BootReceiver. Catatan untuk operator: matikan battery optimization pabrikan (Xiaomi/vivo dll.) untuk aplikasi ini — langkah perangkat manual, didokumentasikan di README.

## Security validation (device)

Tidak dapat diinspeksi via logcat tanpa device. Di level build: HTTPS-only (URL non-https ditolak di `HttpTransport`), token Keystore, token-safe logging, branch/destination server-authoritative — statis terverifikasi.

## Server safety check

**SERVER CHANGE: NONE.** Tidak ada perubahan PHP/DB/API/Windows bridge pada fase ini. Tidak ada tes yang menyentuh server produksi.

## Automated regression — **48/48 PASS**

`javac + java agent.test.RunTests` (clean rebuild pada fase ini): PASSED 48, FAILED 0 — renderer 14, JSON 7, protokol 13, policy 4, pipeline 10. Tidak ada tes Android device (butuh device).

## Klasifikasi masalah

| Kategori | Status |
|---|---|
| BUILD ENVIRONMENT | RESOLVED (Gradle 7.6.4 diunduh; AGP 7.4.2; SDK `C:\Android\sdk`) |
| ANDROID ENVIRONMENT | BLOCKED — tidak ada device USB/WiFi-adb |
| BLUETOOTH HARDWARE | BLOCKED — tidak ada printer SPP teridentifikasi |
| CODE BUG | TIDAK ADA (build + 48 tes hijau) |
| SERVER CONTRACT | TIDAK ADA perubahan yang diperlukan |

---

```
========================================
X4.25 STATUS
========================================

CONDITIONAL PASS

BUILD: PASS
INSTALL: NOT TESTED
AUTOMATED TESTS: 48/48
HARDWARE TESTS: 0/10
REAL PRINT: NOT TESTED
H1: NOT TESTED
H2: NOT TESTED
H3: NOT TESTED
H4: NOT TESTED
H5: NOT TESTED
H6: NOT TESTED
H7: NOT TESTED
H8: NOT TESTED
H9: NOT TESTED
H10: NOT TESTED
TOKEN SECURITY: PASS (statis: Keystore AES-GCM, tanpa secret di source/APK, HTTPS-only)
SERVER CHANGE: NONE
WINDOWS SWITCHOVER: NOT TESTED
DUPLICATE RISK: at-least-once (teruji di JVM; hardware belum)
NEXT RECOMMENDED PHASE: X4.26 — ON-SITE VALIDATION (operator/outlet)
  - sambungkan tablet dapur Android 10+ ke mesin dengan adb (USB) lalu:
      adb install -r android-print-agent/build/outputs/apk/debug/pos-print-agent-debug.apk
  - pairing printer SPP + isi konfigurasi + TEST CONNECTION + TEST PRINT
  - jalankan H1–H10 persis sesuai matriks X4.25
  - switchover Windows↔Android via nonaktifkan device lawan
  - kirim logcat + foto hasil print sebagai bukti
========================================
```

## HARD STOP

Selesai. Tidak ada perubahan server/database/Windows bridge, tidak ada commit, tidak ada deployment produksi, tidak ada fitur baru. Hasil fase ini: **APK terbangun dan terverifikasi statis**; validasi hardware fisik membutuhkan tablet + printer SPP di outlet — tidak dipalsukan.
