Skip to content

Bidirectional Streaming Android #6759

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 95 commits into from
Mar 28, 2025
Merged
Show file tree
Hide file tree
Changes from 48 commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
ae8df74
Post release cleanup for m160
VinayGuthal Mar 11, 2025
9995d9d
revert
VinayGuthal Mar 11, 2025
ffb7e2e
new line
VinayGuthal Mar 11, 2025
503a2d2
add basic classes
VinayGuthal Mar 11, 2025
7ef4910
bidi
VinayGuthal Mar 14, 2025
8442dd6
finish bidi
VinayGuthal Mar 16, 2025
7ddb697
remove base64 strings
VinayGuthal Mar 16, 2025
de11da7
Merge branch 'main' into bidi
VinayGuthal Mar 16, 2025
c32ce9a
live model testing removal
VinayGuthal Mar 16, 2025
889babc
commited
VinayGuthal Mar 18, 2025
096bc4c
working
VinayGuthal Mar 18, 2025
b63b807
working
VinayGuthal Mar 19, 2025
a2fa02f
working
VinayGuthal Mar 20, 2025
87df72c
working
VinayGuthal Mar 20, 2025
aaa742e
update
VinayGuthal Mar 20, 2025
d849230
update function calling
VinayGuthal Mar 20, 2025
c5a0e40
add comments
VinayGuthal Mar 24, 2025
43701eb
update code
VinayGuthal Mar 24, 2025
4707b8f
make it releasable
VinayGuthal Mar 24, 2025
0b37cb1
small changes
VinayGuthal Mar 24, 2025
db33888
working
VinayGuthal Mar 24, 2025
39d4a0b
add java compat
VinayGuthal Mar 25, 2025
eb4e7d9
update all
VinayGuthal Mar 25, 2025
1095d33
add change log
VinayGuthal Mar 25, 2025
225d32e
use okhttp instead of cio engine
VinayGuthal Mar 25, 2025
2df0572
small change
VinayGuthal Mar 25, 2025
d4c90b9
Merge branch 'main' into bidi
VinayGuthal Mar 25, 2025
eba78c8
update api text
VinayGuthal Mar 25, 2025
445075b
nit
VinayGuthal Mar 25, 2025
50b919b
add tool config
VinayGuthal Mar 25, 2025
5b468a5
update
VinayGuthal Mar 25, 2025
bf3c169
add comments
VinayGuthal Mar 25, 2025
2e4cef1
copyright
VinayGuthal Mar 25, 2025
b0997cd
small changes
VinayGuthal Mar 25, 2025
ef7c8e7
remove tool config
VinayGuthal Mar 25, 2025
4088069
remove print statement
VinayGuthal Mar 25, 2025
40d6d3c
remove breaking change
VinayGuthal Mar 25, 2025
329937c
small change
VinayGuthal Mar 25, 2025
f8b1d12
live config builders
VinayGuthal Mar 25, 2025
a6c1c48
Merge branch 'main' into bidi
VinayGuthal Mar 25, 2025
6c88b19
add exception
VinayGuthal Mar 25, 2025
f435c97
Update permissions
rlazo Mar 26, 2025
84e656a
commit
VinayGuthal Mar 26, 2025
485e521
address comments
VinayGuthal Mar 26, 2025
7f071cd
small fixes
VinayGuthal Mar 26, 2025
a099493
add background dispatcher
VinayGuthal Mar 26, 2025
e3af693
add logs
VinayGuthal Mar 26, 2025
5f3b427
add documentation
VinayGuthal Mar 26, 2025
6e78b10
add background dispatcher
VinayGuthal Mar 26, 2025
70e4f2f
update
VinayGuthal Mar 26, 2025
8c8fc9d
update api text file
VinayGuthal Mar 26, 2025
d730323
update
VinayGuthal Mar 26, 2025
3adf3a3
update api text file
VinayGuthal Mar 27, 2025
1df7e48
comments
VinayGuthal Mar 27, 2025
aeed57e
add modality
VinayGuthal Mar 27, 2025
1379e3d
Rl.bidi.receiveddata (#6815)
rlazo Mar 27, 2025
4b4ec66
update
VinayGuthal Mar 27, 2025
d0dca26
update api text
VinayGuthal Mar 27, 2025
907feb0
Merge branch 'main' into bidi
VinayGuthal Mar 27, 2025
6e9ec6f
update function calling stuff
VinayGuthal Mar 27, 2025
cc7c007
Fix submodules
VinayGuthal Mar 27, 2025
a09e5d9
update submodules
VinayGuthal Mar 27, 2025
83c7d9b
update copyright
VinayGuthal Mar 27, 2025
0ca205f
update api text file
VinayGuthal Mar 27, 2025
0427017
add response modality
VinayGuthal Mar 27, 2025
fe9d201
configure voices correctly
VinayGuthal Mar 27, 2025
e8495d5
update change log
VinayGuthal Mar 28, 2025
50c78c1
Remove `isRecording` from constructor (#6817)
rlazo Mar 28, 2025
9cdba61
Rename bidi exceptions to better match other exceptions (#6818)
rlazo Mar 28, 2025
ca41f47
update exceptions
VinayGuthal Mar 28, 2025
da5d78e
update tags
VinayGuthal Mar 28, 2025
4757abc
Update firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai…
rlazo Mar 28, 2025
72bf37c
Update firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai…
VinayGuthal Mar 28, 2025
1c4c9b9
update baseline file
VinayGuthal Mar 28, 2025
1374b64
update baseline lint
VinayGuthal Mar 28, 2025
87c3215
Update firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai…
VinayGuthal Mar 28, 2025
6059fd3
Update firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai…
VinayGuthal Mar 28, 2025
27dea6a
Update firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai…
VinayGuthal Mar 28, 2025
1739069
Update firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai…
VinayGuthal Mar 28, 2025
7f4ed1a
Update firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai…
VinayGuthal Mar 28, 2025
8a16326
Update firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai…
VinayGuthal Mar 28, 2025
3a67651
Update firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai…
VinayGuthal Mar 28, 2025
fe9843a
Update firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai…
VinayGuthal Mar 28, 2025
cf99e50
Update firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai…
VinayGuthal Mar 28, 2025
24e04a2
Update firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai…
VinayGuthal Mar 28, 2025
251c128
Update firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai…
VinayGuthal Mar 28, 2025
6bfb831
Update firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai…
VinayGuthal Mar 28, 2025
c17d56a
Update firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai…
VinayGuthal Mar 28, 2025
7f0aa89
Update firebase-vertexai/src/main/kotlin/com/google/firebase/vertexai…
VinayGuthal Mar 28, 2025
db883a3
Apply suggestions from code review
VinayGuthal Mar 28, 2025
fe5f611
spottless apply
VinayGuthal Mar 28, 2025
784c427
update api text
VinayGuthal Mar 28, 2025
d770015
small fix
VinayGuthal Mar 28, 2025
9c0c0d5
Merge branch 'main' into bidi
VinayGuthal Mar 28, 2025
8be7e2b
Merge branch 'main' into bidi
rlazo Mar 28, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions firebase-vertexai/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
`GenerativeModel` or `ImagenModel`.
* [changed] Added new exception type for quota exceeded scenarios.
* [feature] `CountTokenRequest` now includes `GenerationConfig` from the model.
* [feature] Public Preview: Added support for streaming input and output (including audio) using the [Multimodal Live API](/docs/vertex-ai/live-api?platform=android)
* [changed] **Breaking Change**: `ImagenInlineImage.data` now returns the raw
image bytes (in JPEG or PNG format, as specified in
`ImagenInlineImage.mimeType`) instead of Base64-encoded data. (#6800)
Expand Down
151 changes: 151 additions & 0 deletions firebase-vertexai/api.txt
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,11 @@ package com.google.firebase.vertexai {
method @com.google.firebase.vertexai.type.PublicPreviewAPI public com.google.firebase.vertexai.ImagenModel imagenModel(String modelName, com.google.firebase.vertexai.type.ImagenGenerationConfig? generationConfig = null);
method @com.google.firebase.vertexai.type.PublicPreviewAPI public com.google.firebase.vertexai.ImagenModel imagenModel(String modelName, com.google.firebase.vertexai.type.ImagenGenerationConfig? generationConfig = null, com.google.firebase.vertexai.type.ImagenSafetySettings? safetySettings = null);
method @com.google.firebase.vertexai.type.PublicPreviewAPI public com.google.firebase.vertexai.ImagenModel imagenModel(String modelName, com.google.firebase.vertexai.type.ImagenGenerationConfig? generationConfig = null, com.google.firebase.vertexai.type.ImagenSafetySettings? safetySettings = null, com.google.firebase.vertexai.type.RequestOptions requestOptions = com.google.firebase.vertexai.type.RequestOptions());
method @com.google.firebase.vertexai.type.PublicPreviewAPI public com.google.firebase.vertexai.LiveGenerativeModel liveModel(String modelName);
method @com.google.firebase.vertexai.type.PublicPreviewAPI public com.google.firebase.vertexai.LiveGenerativeModel liveModel(String modelName, com.google.firebase.vertexai.type.LiveGenerationConfig? generationConfig = null);
method @com.google.firebase.vertexai.type.PublicPreviewAPI public com.google.firebase.vertexai.LiveGenerativeModel liveModel(String modelName, com.google.firebase.vertexai.type.LiveGenerationConfig? generationConfig = null, java.util.List<com.google.firebase.vertexai.type.Tool>? tools = null);
method @com.google.firebase.vertexai.type.PublicPreviewAPI public com.google.firebase.vertexai.LiveGenerativeModel liveModel(String modelName, com.google.firebase.vertexai.type.LiveGenerationConfig? generationConfig = null, java.util.List<com.google.firebase.vertexai.type.Tool>? tools = null, com.google.firebase.vertexai.type.Content? systemInstruction = null);
method @com.google.firebase.vertexai.type.PublicPreviewAPI public com.google.firebase.vertexai.LiveGenerativeModel liveModel(String modelName, com.google.firebase.vertexai.type.LiveGenerationConfig? generationConfig = null, java.util.List<com.google.firebase.vertexai.type.Tool>? tools = null, com.google.firebase.vertexai.type.Content? systemInstruction = null, com.google.firebase.vertexai.type.RequestOptions requestOptions = com.google.firebase.vertexai.type.RequestOptions());
property public static final com.google.firebase.vertexai.FirebaseVertexAI instance;
field public static final com.google.firebase.vertexai.FirebaseVertexAI.Companion Companion;
}
Expand Down Expand Up @@ -63,6 +68,10 @@ package com.google.firebase.vertexai {
method public suspend Object? generateImages(String prompt, kotlin.coroutines.Continuation<? super com.google.firebase.vertexai.type.ImagenGenerationResponse<com.google.firebase.vertexai.type.ImagenInlineImage>>);
}

public final class LiveGenerativeModel {
method public suspend Object? connect(kotlin.coroutines.Continuation<? super com.google.firebase.vertexai.type.LiveSession>);
}

}

package com.google.firebase.vertexai.java {
Expand Down Expand Up @@ -105,10 +114,43 @@ package com.google.firebase.vertexai.java {
method public com.google.firebase.vertexai.java.ImagenModelFutures from(com.google.firebase.vertexai.ImagenModel model);
}

public abstract class LiveModelFutures {
method public abstract com.google.common.util.concurrent.ListenableFuture<com.google.firebase.vertexai.type.LiveSession> connect();
method public static final com.google.firebase.vertexai.java.LiveModelFutures from(com.google.firebase.vertexai.LiveGenerativeModel model);
field public static final com.google.firebase.vertexai.java.LiveModelFutures.Companion Companion;
}

public static final class LiveModelFutures.Companion {
method public com.google.firebase.vertexai.java.LiveModelFutures from(com.google.firebase.vertexai.LiveGenerativeModel model);
}

public abstract class LiveSessionFutures {
method public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> close();
method public static final com.google.firebase.vertexai.java.LiveSessionFutures from(com.google.firebase.vertexai.type.LiveSession session);
method public abstract com.google.common.util.concurrent.ListenableFuture<org.reactivestreams.Publisher<com.google.firebase.vertexai.type.LiveContentResponse>> receive(java.util.List<com.google.firebase.vertexai.type.ContentModality> outputModalities);
method public abstract org.reactivestreams.Publisher<java.util.List<com.google.firebase.vertexai.type.FunctionCallPart>> receiveAudioConversationFunctionCalls();
method public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> send(com.google.firebase.vertexai.type.Content content);
method public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> send(String text);
method public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> sendFunctionResponse(java.util.List<com.google.firebase.vertexai.type.FunctionResponsePart> functionList);
method public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> sendMediaStream(java.util.List<com.google.firebase.vertexai.type.MediaData> mediaChunks);
method public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> startAudioConversation();
method public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> stopAudioConversation();
method public abstract void stopReceiving();
field public static final com.google.firebase.vertexai.java.LiveSessionFutures.Companion Companion;
}

public static final class LiveSessionFutures.Companion {
method public com.google.firebase.vertexai.java.LiveSessionFutures from(com.google.firebase.vertexai.type.LiveSession session);
}

}

package com.google.firebase.vertexai.type {

public final class AudioRecordInitializationFailedException extends com.google.firebase.vertexai.type.FirebaseVertexAIException {
ctor public AudioRecordInitializationFailedException(String message);
}

public final class BlockReason {
method public String getName();
method public int getOrdinal();
Expand Down Expand Up @@ -284,6 +326,10 @@ package com.google.firebase.vertexai.type {
property public final kotlinx.serialization.json.JsonObject response;
}

public final class GeminiConnectionHandshakeFailed extends com.google.firebase.vertexai.type.FirebaseVertexAIException {
ctor public GeminiConnectionHandshakeFailed();
}

public final class GenerateContentResponse {
ctor public GenerateContentResponse(java.util.List<com.google.firebase.vertexai.type.Candidate> candidates, com.google.firebase.vertexai.type.PromptFeedback? promptFeedback, com.google.firebase.vertexai.type.UsageMetadata? usageMetadata);
method public java.util.List<com.google.firebase.vertexai.type.Candidate> getCandidates();
Expand Down Expand Up @@ -520,6 +566,86 @@ package com.google.firebase.vertexai.type {
public final class InvalidStateException extends com.google.firebase.vertexai.type.FirebaseVertexAIException {
}

public final class LiveContentResponse {
method public com.google.firebase.vertexai.type.Content? getData();
method public java.util.List<com.google.firebase.vertexai.type.FunctionCallPart>? getFunctionCalls();
method public int getStatus();
method public String? getText();
property public final com.google.firebase.vertexai.type.Content? data;
property public final java.util.List<com.google.firebase.vertexai.type.FunctionCallPart>? functionCalls;
property public final int status;
property public final String? text;
}

@kotlin.jvm.JvmInline public static final value class LiveContentResponse.Status {
field public static final com.google.firebase.vertexai.type.LiveContentResponse.Status.Companion Companion;
}

public static final class LiveContentResponse.Status.Companion {
method public int getINTERRUPTED();
method public int getNORMAL();
method public int getTURN_COMPLETE();
property public final int INTERRUPTED;
property public final int NORMAL;
property public final int TURN_COMPLETE;
}

public final class LiveGenerationConfig {
field public static final com.google.firebase.vertexai.type.LiveGenerationConfig.Companion Companion;
}

public static final class LiveGenerationConfig.Builder {
ctor public LiveGenerationConfig.Builder();
method public com.google.firebase.vertexai.type.LiveGenerationConfig build();
method public com.google.firebase.vertexai.type.LiveGenerationConfig.Builder setCandidateCount(Integer? candidateCount);
method public com.google.firebase.vertexai.type.LiveGenerationConfig.Builder setFrequencyPenalty(Float? frequencyPenalty);
method public com.google.firebase.vertexai.type.LiveGenerationConfig.Builder setMaxOutputTokens(Integer? maxOutputTokens);
method public com.google.firebase.vertexai.type.LiveGenerationConfig.Builder setPresencePenalty(Float? presencePenalty);
method public com.google.firebase.vertexai.type.LiveGenerationConfig.Builder setResponseModalities(java.util.List<com.google.firebase.vertexai.type.ContentModality>? responseModalities);
method public com.google.firebase.vertexai.type.LiveGenerationConfig.Builder setSpeechConfig(com.google.firebase.vertexai.type.SpeechConfig? speechConfig);
method public com.google.firebase.vertexai.type.LiveGenerationConfig.Builder setTemperature(Float? temperature);
method public com.google.firebase.vertexai.type.LiveGenerationConfig.Builder setTopK(Integer? topK);
method public com.google.firebase.vertexai.type.LiveGenerationConfig.Builder setTopP(Float? topP);
field public Integer? candidateCount;
field public Float? frequencyPenalty;
field public Integer? maxOutputTokens;
field public Float? presencePenalty;
field public java.util.List<com.google.firebase.vertexai.type.ContentModality>? responseModalities;
field public com.google.firebase.vertexai.type.SpeechConfig? speechConfig;
field public Float? temperature;
field public Integer? topK;
field public Float? topP;
}

public static final class LiveGenerationConfig.Companion {
method public com.google.firebase.vertexai.type.LiveGenerationConfig.Builder builder();
}

public final class LiveGenerationConfigKt {
method public static com.google.firebase.vertexai.type.LiveGenerationConfig liveGenerationConfig(kotlin.jvm.functions.Function1<? super com.google.firebase.vertexai.type.LiveGenerationConfig.Builder,kotlin.Unit> init);
}

public final class LiveSession {
method public suspend Object? close(kotlin.coroutines.Continuation<? super kotlin.Unit>);
method public suspend Object? receive(java.util.List<com.google.firebase.vertexai.type.ContentModality> outputModalities, kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.Flow<? extends com.google.firebase.vertexai.type.LiveContentResponse>>);
method public kotlinx.coroutines.flow.Flow<java.util.List<com.google.firebase.vertexai.type.FunctionCallPart>> receiveAudioConversationFunctionCalls();
method public suspend Object? send(com.google.firebase.vertexai.type.Content content, kotlin.coroutines.Continuation<? super kotlin.Unit>);
method public suspend Object? send(String text, kotlin.coroutines.Continuation<? super kotlin.Unit>);
method public suspend Object? sendFunctionResponse(java.util.List<com.google.firebase.vertexai.type.FunctionResponsePart> functionList, kotlin.coroutines.Continuation<? super kotlin.Unit>);
method public suspend Object? sendMediaStream(java.util.List<com.google.firebase.vertexai.type.MediaData> mediaChunks, kotlin.coroutines.Continuation<? super kotlin.Unit>);
method public suspend Object? startAudioConversation(kotlin.coroutines.Continuation<? super kotlin.Unit>);
method public void stopAudioConversation();
method public void stopReceiving();
}

public final class MediaData {
ctor public MediaData(String mimeType, byte[] data);
method public byte[] getData();
method public String getMimeType();
property public final byte[] data;
property public final String mimeType;
}

public final class ModalityTokenCount {
method public operator com.google.firebase.vertexai.type.ContentModality component1();
method public operator int component2();
Expand Down Expand Up @@ -682,6 +808,16 @@ package com.google.firebase.vertexai.type {
public final class ServiceDisabledException extends com.google.firebase.vertexai.type.FirebaseVertexAIException {
}

public final class SessionAlreadyReceivingException extends com.google.firebase.vertexai.type.FirebaseVertexAIException {
ctor public SessionAlreadyReceivingException();
}

public final class SpeechConfig {
ctor public SpeechConfig(com.google.firebase.vertexai.type.Voices voice);
method public com.google.firebase.vertexai.type.Voices getVoice();
property public final com.google.firebase.vertexai.type.Voices voice;
}

public abstract class StringFormat {
}

Expand Down Expand Up @@ -728,5 +864,20 @@ package com.google.firebase.vertexai.type {
property public final int totalTokenCount;
}

public final class Voices {
method public int getOrdinal();
property public final int ordinal;
field public static final com.google.firebase.vertexai.type.Voices AOEDE;
field public static final com.google.firebase.vertexai.type.Voices CHARON;
field public static final com.google.firebase.vertexai.type.Voices.Companion Companion;
field public static final com.google.firebase.vertexai.type.Voices FENRIR;
field public static final com.google.firebase.vertexai.type.Voices KORE;
field public static final com.google.firebase.vertexai.type.Voices PUCK;
field public static final com.google.firebase.vertexai.type.Voices UNSPECIFIED;
}

public static final class Voices.Companion {
}

}

6 changes: 5 additions & 1 deletion firebase-vertexai/firebase-vertexai.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,10 @@ android {
isReturnDefaultValues = true
}
}
lint { targetSdk = targetSdkVersion }
lint {
targetSdk = targetSdkVersion
baseline = file("lint-baseline.xml")
}
}

// Enable Kotlin "Explicit API Mode". This causes the Kotlin compiler to fail if any
Expand All @@ -83,6 +86,7 @@ tasks.withType<KotlinCompile>().all {
dependencies {
implementation(libs.ktor.client.okhttp)
implementation(libs.ktor.client.core)
implementation(libs.ktor.client.websockets)
implementation(libs.ktor.client.content.negotiation)
implementation(libs.ktor.serialization.kotlinx.json)
implementation(libs.ktor.client.logging)
Expand Down
22 changes: 22 additions & 0 deletions firebase-vertexai/lint-baseline.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<issues format="6" by="lint 8.3.2" type="baseline" client="gradle" dependencies="false" name="AGP (8.3.2)" variant="all" version="8.3.2">

<issue
id="MissingPermission"
message="Missing permissions required by AudioRecord.AudioRecord: android.permission.RECORD_AUDIO"
errorLine1=" AudioRecord("
errorLine2=" ^">
<location
file="src/main/kotlin/com/google/firebase/vertexai/type/AudioHelper.kt"
line="85"
column="7"/>
</issue>

<issue
id="UnsafeOptInUsageWarning"
message="This declaration is opt-in and its usage should be marked with `@kotlinx.serialization.ExperimentalSerializationApi` or `@OptIn(markerClass = kotlinx.serialization.ExperimentalSerializationApi.class)`">
<location
file="src/main/kotlin/com/google/firebase/vertexai/type/LiveSession.kt"/>
</issue>

</issues>
6 changes: 5 additions & 1 deletion firebase-vertexai/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,11 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

<application>
<!-- To use the audio conversation feature of Live Sessions, update your app's manifest -->
<!-- to request audio recording permission -->
<!-- <uses-permission android:name="android.permission.RECORD_AUDIO" /> -->

<application>
<service android:name="com.google.firebase.components.ComponentDiscoveryService"
android:exported="false">
<meta-data
Expand Down
Loading
Loading