# BiznisPortal — Android Release Guide

Consumer aplikacija (`rs.biznisportal.app`, ime **BiznisPortal**). Hibridna
arhitektura: Capacitor učitava živi sajt (`https://www.biznisportal.rs`) uz
native sloj (`components/native/CapacitorBootstrap.tsx`).

> Partner appId (`rs.biznisportal.partner`) je i dalje dostupan preko
> `CAPACITOR_APP_ID` env override-a, ali su default vrednosti consumer.

---

## 0. Preduslovi (lokalna mašina)

- **JDK 21** (Temurin/Adoptium preporučeno)
- **Android Studio** (najnovija stabilna) + Android SDK Platform 34/35
- Node 20+, `npm`
- Naložen Google Play Console nalog (jednokratna $25 registracija)

Provera: `java -version` → 21.x.

---

## 1. Env varijable

| Var | Default | Opis |
|-----|---------|------|
| `CAPACITOR_APP_ID` | `rs.biznisportal.app` | applicationId / namespace |
| `CAPACITOR_APP_NAME` | `BiznisPortal` | ime aplikacije |
| `CAPACITOR_SERVER_URL` | `https://www.biznisportal.rs` | URL koji webview učitava |
| `CAPACITOR_ANDROID_VERSION_CODE` | `1` | Play versionCode (raste svaki upload) |
| `CAPACITOR_ANDROID_VERSION_NAME` | `1.0.0` | prikazana verzija |
| `ANDROID_KEYSTORE_FILE` | — | putanja do release keystore-a |
| `ANDROID_KEYSTORE_PASSWORD` | — | keystore lozinka |
| `ANDROID_KEY_ALIAS` | — | key alias |
| `ANDROID_KEY_PASSWORD` | — | key lozinka |

Primer (`.env.local` ili shell export pre build-a):

```bash
export CAPACITOR_SERVER_URL="https://www.biznisportal.rs"
export CAPACITOR_ANDROID_VERSION_CODE=1
export CAPACITOR_ANDROID_VERSION_NAME="1.0.0"
```

---

## 2. Firebase / FCM — `google-services.json`

Push kod je već napisan i no-op je dok Firebase nije podešen.

1. Kreiraj Firebase projekat na <https://console.firebase.google.com>.
2. Dodaj Android app sa package name **`rs.biznisportal.app`**.
3. Preuzmi `google-services.json` i stavi ga u:
   `android/app/google-services.json`
4. Gotovo. `android/app/build.gradle` ima
   `if (file('google-services.json').exists())` guard koji automatski
   uključuje Google Services plugin + `firebase-messaging`. Bez fajla
   build i dalje prolazi (push samo no-op).
5. Server strana (slanje): u admin podešavanjima sajta unesi
   `notifications.fcmProjectId`, `notifications.fcmClientEmail`,
   `notifications.fcmPrivateKey` (FCM service account) — slanje ide kroz
   postojeći `lib/native-push.ts` → `sendDirectNativePush`.

---

## 3. Generisanje release keystore-a (jednokratno)

Preporučeno — vođeni skript (odbija prepisivanje postojećeg ključa,
ispisuje SHA-256 za App Links, podseća na backup):

```bash
npm run native:keystore
```

Ili ručno:

```bash
keytool -genkeypair -v \
  -keystore ~/biznisportal-release.keystore \
  -alias biznisportal \
  -keyalg RSA -keysize 2048 -validity 10000
```

Sačuvaj keystore i lozinke na sigurno (Play Console upload više nije
moguć bez njih). Zatim:

```bash
export ANDROID_KEYSTORE_FILE="$HOME/biznisportal-release.keystore"
export ANDROID_KEYSTORE_PASSWORD="••••"
export ANDROID_KEY_ALIAS="biznisportal"
export ANDROID_KEY_PASSWORD="••••"
```

---

## 4. Build koraci (po redu)

```bash
# 1. Instaliraj zavisnosti
npm install --legacy-peer-deps

# 2. (Opc.) regeneriši ikone + splash
npm run assets:android

# 3. Sinhronizuj web → native (kopira capacitor.config, plugine)
npx cap sync android

# 4. Otvori u Android Studio (ili build iz CLI)
npx cap open android
```

### Potpisan AAB (za Play Store)

U Android Studio: **Build → Generate Signed Bundle / APK → Android App
Bundle**, izaberi keystore. Ili iz CLI:

```bash
cd android
./gradlew bundleRelease
# Izlaz: android/app/build/outputs/bundle/release/app-release.aab
```

> Ova mašina NEMA Java/Android SDK — AAB se gradi na mašini sa
> Android Studio. Sve je pripremljeno za "one-click" build.

---

## 5. App Links verifikacija (`assetlinks.json`)

Deep linkovi (`https://www.biznisportal.rs/...` otvaraju app) zahtevaju:

1. `assetlinks.json` se servira **dinamički** iz rute
   `app/.well-known/assetlinks.json/route.ts` (više nema statičkog
   placeholder-a). Dostupan na
   `https://www.biznisportal.rs/.well-known/assetlinks.json` i bez deploya
   se menja samo promenom env-a.
2. Postavi env (oba otiska, zarezom razdvojeno) i restartuj app:
   ```bash
   ANDROID_CERT_FINGERPRINTS="AA:BB:..(upload key)..,CC:DD:..(play signing key).."
   ```
   - Upload key:
     `keytool -list -v -keystore ~/biznisportal-release.keystore -alias biznisportal`
     → kopiraj `SHA256` red.
   - Play App Signing key: Play Console → Setup → App integrity →
     App signing key certificate → SHA-256.
3. AndroidManifest već ima `<intent-filter android:autoVerify="true">` za
   `biznisportal.rs` i `www.biznisportal.rs` + custom scheme
   `rs.biznisportal.app://open` — ništa se ne dira.
4. Provera: `https://developers.google.com/digital-asset-links/tools/generator`
   ili `curl https://www.biznisportal.rs/.well-known/assetlinks.json`.

---

## 6. Play Console listing checklist

- [ ] **Title (max 30):** `BiznisPortal — poslovni portal`
- [ ] **Short description (max 80, SR):**
      `Kompanije, nekretnine, poslovi, automobili i ponude širom Srbije.`
- [ ] **Short description (EN):**
      `Companies, real estate, jobs, cars and deals across Serbia.`
- [ ] **Full description (SR draft):**
      „BiznisPortal je premium poslovni portal Srbije. Pronađite kompanije,
      mesta, nekretnine, događaje, automobile, poslove i ekskluzivne ponude
      uz jaku lokalnu pretragu. Pratite omiljene oglase, primajte push
      obaveštenja o novim ponudama i sačuvanim pretragama."
- [ ] **Full description (EN draft):**
      "BiznisPortal is Serbia's premium business portal. Discover companies,
      places, real estate, events, cars, jobs and exclusive deals with strong
      local search. Follow listings and get push alerts for new offers and
      saved searches."
- [ ] **Grafika:** feature graphic 1024×500, app icon 512×512 (iz
      `assets/icon.png`), min 2 telefon screenshot-a (preporuka 4–8;
      home, pretraga, detalj oglasa, profil)
- [ ] **Kategorija:** Business
- [ ] **Content rating:** popuni upitnik → očekivano **Everyone / 3+**
      (nema nasilja/kockanja; korisnički sadržaj postoji → navedi to)
- [ ] **Privacy policy URL:** `https://www.biznisportal.rs/privatnost`

### Data safety form (na osnovu onoga što app prikuplja)

| Tip podatka | Prikuplja se? | Svrha | Deli se? |
|-------------|---------------|-------|----------|
| Approximate location | Da (opc., Geolocation za pretragu u blizini) | App funkcionalnost | Ne |
| Email / nalog | Da, ako se korisnik registruje na sajtu | Nalog, komunikacija | Ne |
| Device push token (FCM) | Da | Push obaveštenja | Ne |
| Web analitika (GA) | Da | Analitika | Da (Google) |
| Sadržaj koji korisnik unese (upiti/oglasi) | Da | App funkcionalnost | Ne |

- [ ] Šifrovanje u transitu: **Da** (HTTPS, network security config)
- [ ] Korisnik može tražiti brisanje podataka: **Da** (preko sajta /
      kontakt)

---

## 7. Post-launch

- [ ] Verifikuj App Links: Settings → Apps → BiznisPortal → Open by
      default → linkovi „verified".
- [ ] Pošalji test push iz admina (FCM) na realan uređaj.
- [ ] Za svaki sledeći upload: povećaj `CAPACITOR_ANDROID_VERSION_CODE`,
      ponovo `npx cap sync android` + signed bundle.
- [ ] Prati Play Console → Crashes & ANRs prvih 72h.
