Files
Kordant/android/docs/data-safety-form.md

284 lines
9.6 KiB
Markdown

# Google Play Data Safety Form — Kordant Android
> **Last updated:** 2026-06-01
> **Package:** `com.kordant.android`
> **Instructions:** Use this document to fill out the Play Console Data Safety section at
> **Play Console → Your app → App content → Data safety**
---
## Section 1: Data Collection & Sharing
### Q1: Does your app collect or share any of the required user data types?
**Answer:** ✅ Yes
### Q2: Is all of the user data collected by your app encrypted in transit?
**Answer:** ✅ Yes
All API communication uses TLS 1.2+ enforced via `network_security_config.xml`.
Clear text traffic is blocked at the platform level.
### Q3: Do you provide a way for users to request that their data is deleted?
**Answer:** ✅ Yes
Users can delete their data via:
1. **In-app:** Settings → Delete Account (calls backend API + clears all local data)
2. **Email:** privacy@kordant.com with data deletion request
3. **Backend:** Account deletion endpoint (`/api/trpc/user.delete`)
4. **Local effect:** `clearAllData()` on EncryptedSharedPreferences + DataStore + CacheManager
### Q4: Has your app been independently reviewed against a global security standard?
**Answer:** ⚠️ No (planned before production launch)
External security audit by a third party is planned but not yet completed.
---
## Section 2: Data Type Declarations
### 2.1 Location
**Do you collect precise or approximate location?**
**Answer:** ❌ No
Evidence: No `ACCESS_FINE_LOCATION` or `ACCESS_COARSE_LOCATION` permission in AndroidManifest.xml.
---
### 2.2 Personal Info
**Do you collect any personal info?**
**Answer:** ✅ Yes
| Data Type | Collected | Shared | Ephemeral | Purposes |
|-----------|-----------|--------|-----------|----------|
| **Name** | ✅ Yes | ❌ No | ❌ No | App functionality, Personalization, Account management |
| **Email address** | ✅ Yes | ❌ No | ❌ No | App functionality, Personalization, Account management |
| **Phone number** | ✅ Yes | ❌ No | ❌ No | App functionality, Personalization |
| **User IDs** | ✅ Yes | ❌ No | ❌ No | App functionality, Account management |
| **Address** | ✅ Yes | ❌ No | ❌ No | App functionality (HomeTitle property monitoring) |
| **Other info (avatar)** | ✅ Yes | ❌ No | ❌ No | Personalization |
**Details:**
- Name, email, and user ID collected at account registration (mandatory)
- Phone number collected optionally for spam call detection
- Address collected optionally for property monitoring
- Stored encrypted in `EncryptedSharedPreferences` and on the backend server
- Shared only with the app's backend API via TLS-encrypted connections
---
### 2.3 Financial Info
**Do you collect financial info?**
**Answer:** ❌ No (on-device)
Stripe Checkout and billing portal are handled via web views. Payment card data goes directly to Stripe and never touches the Kordant Android app.
**Exception:** Subscription tier and billing status are retrieved from the backend API (`/api/trpc/billing.*`), but no raw financial data (credit card numbers, bank accounts) is collected by the app.
---
### 2.4 Health & Fitness
**Do you collect health or fitness data?**
**Answer:** ❌ No
---
### 2.5 Messages
**Do you collect messages?**
**Answer:** ❌ No
No SMS, MMS, or in-app messaging data is collected.
---
### 2.6 Photos & Videos
**Do you collect photos or videos?**
**Answer:** ❌ No
The app loads images from URLs (avatars, property photos) via Coil image loader, but does not capture or store photos/videos. No `CAMERA` or storage permissions are declared.
---
### 2.7 Audio Files
**Do you collect audio files?**
**Answer:** ✅ Yes
| Data Type | Collected | Shared | Ephemeral | Purposes |
|-----------|-----------|--------|-----------|----------|
| **Voice recordings** | ✅ Yes | ❌ No | ❌ No | App functionality (VoicePrint) |
| **Audio analysis results** | ✅ Yes | ❌ No | ❌ No | App functionality (VoicePrint) |
**Details:**
- Voice recordings are collected as part of the VoicePrint feature for voice-based caller identification
- User must explicitly enroll and grant `RECORD_AUDIO` permission
- Recordings are sent to the backend for voice analysis
- Analysis results are stored for matching incoming calls
- Not shared with third parties
- Stored encrypted in transit (TLS) and at rest on the backend
---
### 2.8 Files & Docs
**Do you collect files or documents?**
**Answer:** ❌ No
---
### 2.9 Calendar
**Do you collect calendar events?**
**Answer:** ❌ No
---
### 2.10 Contacts
**Do you collect contacts?**
**Answer:** ❌ No
The app does not access the device contacts book. No `READ_CONTACTS` permission.
**Note:** Call screening receives incoming phone numbers via the Android telecom system, but does not read the user's contact list.
---
### 2.11 App Activity
**Do you collect app activity data?**
**Answer:** ✅ Yes
| Data Type | Collected | Shared | Ephemeral | Purposes |
|-----------|-----------|--------|-----------|----------|
| **App interactions** | ✅ Yes | ❌ No | ❌ No | Analytics, Fraud prevention |
| **Installed apps (security check)** | ✅ Yes | ❌ No | ✅ Ephemeral | Fraud prevention, Security |
| **In-app search history** | ✅ Yes | ❌ No | ❌ No | Analytics, Personalization |
| **Other user-generated content** | ✅ Yes | ❌ No | ❌ No | App functionality |
**Details:**
- App interactions tracked via API calls and analytics (startup timing, feature usage)
- Installed apps list checked only during root detection (`SecurityChecker.kt`) — checked ephemerally, not stored
- Watchlist items, property addresses, and exposure reports are user-generated content
- App activity is used for fraud prevention (root detection) and improving the service
---
### 2.12 Web Browsing
**Do you collect web browsing history?**
**Answer:** ❌ No
---
### 2.13 App Info & Performance
**Do you collect app info and performance data?**
**Answer:** ✅ Yes
| Data Type | Collected | Shared | Ephemeral | Purposes |
|-----------|-----------|--------|-----------|----------|
| **Crash logs** | ✅ Yes | ✅ Yes (Firebase) | ❌ No | Analytics, Fraud prevention |
| **Performance data** | ✅ Yes | ❌ No | ❌ No | Analytics |
| **Other diagnostics** | ✅ Yes | ❌ No | ❌ No | Analytics |
**Details:**
- Crash logs are collected via Firebase Crashlytics and sent to Google's Firebase servers
- Performance data includes app startup timing (`StartupTracker.kt`)
- Diagnostics include ANR traces and network request timing
- Crashlytics is enabled for both debug and release builds
---
### 2.14 Device & Other IDs
**Do you collect device IDs?**
**Answer:** ✅ Yes
| Data Type | Collected | Shared | Ephemeral | Purposes |
|-----------|-----------|--------|-----------|----------|
| **Device ID / FCM token** | ✅ Yes | ❌ No | ❌ No | Analytics, App functionality |
**Details:**
- FCM device token is collected for push notification delivery
- A unique request ID is generated for each API call (`X-Request-ID` header)
- Device platform and app version are sent with every API request
- No Android Advertising ID or device serial number is collected
---
## Section 3: Data Sharing Declaration
### Do you share user data with third parties?
**Answer:** ✅ Yes — Limited sharing
| Third Party | Data Shared | Purpose | Type |
|------------|-------------|---------|------|
| **Firebase Crashlytics (Google)** | Crash logs, device info, app version | Crash analytics | SDK |
| **Firebase Cloud Messaging (Google)** | Device token, notification delivery data | Push notifications | SDK |
| **Google Sign-In (Google)** | OAuth tokens, profile info | Authentication | SDK |
| **Stripe** | N/A on device (payment processed via web) | Payment processing | Web view |
### Do you sell user data?
**Answer:** ❌ No
The app does not sell user data to any third party.
---
## Section 4: Security Practices Summary
| Practice | Status | Notes |
|----------|--------|-------|
| **Encryption in transit** | ✅ TLS 1.2+ | All API traffic; cleartext blocked by `network_security_config.xml` |
| **Encryption at rest** | ✅ AES-256-GCM | EncryptedSharedPreferences with MasterKey in Android Keystore |
| **User data deletion** | ✅ Available | In-app account deletion + privacy@kordant.com |
| **Security review** | ⚠️ Pending | External audit planned before production launch |
---
## Section 5: Play Console Entry Map
Use the following to navigate directly to the right sections:
1. **Play Console** → Select app → **App content****Data safety**
2. Click **"Start"** (or **"Manage"** if already started)
3. Follow the sections above for each question
4. For "Does your app collect or share any of the required user data types?" → **Answer Yes**
5. Fill in each data type section as documented above
6. In **Security practices**, check:
- [x] Data encrypted in transit (TLS 1.3)
- [x] Data encrypted at rest (EncryptedSharedPreferences)
- [x] User can request data deletion
7. For **Independent security review** → Leave unchecked (pending)
8. Add **Privacy Policy URL**: `https://kordant.com/privacy`
---
## Section 6: Validation After Submission
After completing the form in Play Console, verify:
- [ ] Every question has an answer (no blanks)
- [ ] Crashlytics data sharing is accurately declared
- [ ] FCM data collection is accurately declared
- [ ] Google Sign-In data collection is accurately declared
- [ ] Voice recording collection is accurately declared
- [ ] No location data is declared (since not collected)
- [ ] "Data shared with third parties" accurately reflects Firebase/Google
- [ ] "Data encrypted in transit" is checked
- [ ] "User can request data deletion" is checked
- [ ] Privacy policy URL is linked and accessible
- [ ] Answers match the data collection audit document