chore(config): coil-gif dependency, RECORD_AUDIO permission, firestore rules allow voice type

- build.gradle.kts: add coil-gif 2.7.0 for animated GIF/WebP support
- AndroidManifest: RECORD_AUDIO permission + microphone feature (optional)
- firestore.rules: messages create allows 'voice' type alongside 'image', accepts durationMs field
This commit is contained in:
null 2026-06-24 16:34:53 -05:00
parent 3ad725ca8a
commit dbf7ae662b
3 changed files with 6 additions and 2 deletions

View File

@ -187,6 +187,8 @@ dependencies {
// Image loading
implementation("io.coil-kt:coil-compose:2.7.0")
// Animated GIF / WebP support (for GIFs, stickers, Bitmoji from the keyboard)
implementation("io.coil-kt:coil-gif:2.7.0")
// AppCompat — required by BiometricPrompt (needs FragmentActivity base)
implementation("androidx.appcompat:appcompat:1.7.0")

View File

@ -4,8 +4,10 @@
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.microphone" android:required="false" />
<application
android:name=".CloserApp"

View File

@ -433,9 +433,9 @@ service cloud.firestore {
allow create: if isCouplesMember(coupleId)
&& coupleEncryptionEnabled(coupleId)
&& request.resource.data.authorUserId == request.auth.uid
&& request.resource.data.keys().hasOnly(['authorUserId', 'text', 'createdAt', 'type', 'mediaUrl'])
&& request.resource.data.keys().hasOnly(['authorUserId', 'text', 'createdAt', 'type', 'mediaUrl', 'durationMs'])
&& (
(request.resource.data.get('type', 'text') == 'image'
(request.resource.data.get('type', 'text') in ['image', 'voice']
&& request.resource.data.mediaUrl is string
&& request.resource.data.mediaUrl.size() > 0)
||