# MindMachine - Development Notes

## Build prerequisites

- JDK 17
- Android Studio (recommended)
- Android SDK installed
- `local.properties` configured (Android Studio usually writes this)


## Build outputs (where files end up)

- Debug APK
  - Task: `assembleDebug`
  - Output: `app/build/outputs/apk/debug/app-debug.apk`

- Release AAB (Android App Bundle)
  - Task: `bundleRelease`
  - Output: `app/build/outputs/bundle/release/app-release.aab`

- Debug AAB (rarely needed)
  - Task: `bundleDebug`
  - Output: `app/build/outputs/bundle/debug/app-debug.aab`


## Create an AAB (CLI)

Before uploading a new AAB to Google Play, make sure the app version is bumped:

- `app/build.gradle.kts` → `defaultConfig.versionCode` must be **unique and increasing** on Play Console.
- Update `versionName` as your human-readable release string.

From the repo root:

```bash
cd MindMachine
./gradlew bundleRelease
```

The bundle will be at:

```text
app/build/outputs/bundle/release/app-release.aab
```

(Optional) clean rebuild:

```bash
./gradlew clean bundleRelease
```


## Create an AAB (Android Studio)

1. **Build** → **Generate Signed Bundle / APK…**
2. Select **Android App Bundle**
3. Select **Release**
4. Select the **upload keystore**
5. Finish


## Signing setup (release bundles)

Release signing is configured in `app/build.gradle.kts` to load credentials from:

- `keystore/upload-keystore.properties`

That file should contain the standard fields:

```properties
storeFile=keystore/<your-upload-keystore>.jks
storePassword=<password>
keyAlias=<alias>
keyPassword=<password>
```

Notes:
- Treat `upload-keystore.properties` as **secret**. Do not share it publicly.
- On Google Play you typically use **Play App Signing**. You upload with your **upload key**, Google signs for distribution.


## Play Billing testing (subscribe/buy) checklist

Important: **Billing only works reliably when the app is installed from Google Play** (Internal/Closed testing). Sideloaded builds often fail Billing flows.

1. **Play Console**
   - Create your **in-app products** and/or **subscriptions** (base plans/offers).
   - Make sure each product is in an **Active** state.

2. **Add testers**
   - Add your tester Gmail(s) to the app’s **Internal testing** (or Closed testing) track.
   - Also add the same Gmail(s) to **Play Console → Setup → License testing**.

3. **Upload AAB + publish to the test track**
   - Upload the latest `app-release.aab` to the test track.
   - Publish/roll out the test release.

4. **Install from Play Store**
   - On the device, log into the Play Store using the tester account.
   - Install the app from the test track (Play will show it as available to that tester).

5. **Payment profile / payment method (if prompted)**
   - If Google prompts for payment info on the tester account, add a payment method in:
     - Play Store → **Payments & subscriptions** → **Payment methods**
     - (and/or set up the Google Payments profile for that account)
   - Test purchases will use Google’s **test purchase flow** (no real charge).

6. **Verify in the app**
   - Trigger the subscribe/buy flow and confirm the purchase dialog appears.
   - Confirm acknowledgements/entitlements are applied as expected.


## Billing logging (ADB)

Billing logs are written to Android's system log (Logcat), not displayed in the app UI.

To view billing logs:

```bash
# View only MindMachine billing logs
adb logcat -s MindMachineBilling:D

# Filter with silence for other tags
adb logcat -s MindMachineBilling:D *:S
```

Example log lines you'll see:
- `Billing setup finished: 0 OK`
- `Product details loaded: 2 items`
- `Query purchases returned X items`
- `Active entitlement: true/false`
- `Entitlement changed: false -> true`

Billing log tags:
- `MindMachineBilling` for debug/info messages
- Errors use `Log.e()` and appear as `E/MindMachineBilling` in logcat
