900 lines
43 KiB
Java
900 lines
43 KiB
Java
package com.discord.stores;
|
|
|
|
import a0.a.a.b;
|
|
import android.content.Context;
|
|
import android.util.Log;
|
|
import c.a.q.w;
|
|
import c.d.b.a.a;
|
|
import co.discord.media_engine.VideoInputDeviceDescription;
|
|
import com.discord.api.channel.Channel;
|
|
import com.discord.api.guildscheduledevent.GuildScheduledEvent;
|
|
import com.discord.api.stageinstance.StageInstance;
|
|
import com.discord.api.voice.server.VoiceServer;
|
|
import com.discord.api.voice.state.VoiceState;
|
|
import com.discord.app.App;
|
|
import com.discord.app.AppLog;
|
|
import com.discord.gateway.io.OutgoingPayload;
|
|
import com.discord.models.domain.ModelPayload;
|
|
import com.discord.models.experiments.domain.Experiment;
|
|
import com.discord.rtcconnection.RtcConnection;
|
|
import com.discord.rtcconnection.VideoMetadata;
|
|
import com.discord.rtcconnection.mediaengine.MediaEngine;
|
|
import com.discord.rtcconnection.mediaengine.MediaEngineConnection;
|
|
import com.discord.stores.StoreMediaSettings;
|
|
import com.discord.stores.StoreStream;
|
|
import com.discord.utilities.analytics.AnalyticsTracker;
|
|
import com.discord.utilities.collections.ListenerCollection;
|
|
import com.discord.utilities.collections.ListenerCollectionSubject;
|
|
import com.discord.utilities.debug.DebugPrintBuilder;
|
|
import com.discord.utilities.debug.DebugPrintable;
|
|
import com.discord.utilities.debug.DebugPrintableCollection;
|
|
import com.discord.utilities.io.NetworkUtils;
|
|
import com.discord.utilities.logging.Logger;
|
|
import com.discord.utilities.networking.NetworkMonitor;
|
|
import com.discord.utilities.rx.ObservableExtensionsKt;
|
|
import com.discord.utilities.ssl.SecureSocketsLayerUtils;
|
|
import com.discord.utilities.systemlog.SystemLogUtils;
|
|
import com.discord.utilities.time.Clock;
|
|
import com.discord.utilities.time.ClockFactory;
|
|
import com.google.firebase.crashlytics.FirebaseCrashlytics;
|
|
import d0.t.h0;
|
|
import d0.z.d.m;
|
|
import java.util.LinkedHashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Objects;
|
|
import java.util.concurrent.TimeUnit;
|
|
import javax.net.ssl.SSLSocketFactory;
|
|
import kotlin.jvm.functions.Function0;
|
|
import kotlin.jvm.functions.Function1;
|
|
import kotlin.jvm.internal.DefaultConstructorMarker;
|
|
import rx.Observable;
|
|
import rx.subjects.BehaviorSubject;
|
|
import rx.subjects.PublishSubject;
|
|
import rx.subjects.SerializedSubject;
|
|
/* compiled from: StoreRtcConnection.kt */
|
|
public final class StoreRtcConnection extends RtcConnection.b implements DebugPrintable {
|
|
public static final Companion Companion = new Companion(null);
|
|
private static final long SPEAKING_UPDATES_BUFFER_MS = 300;
|
|
private static int instanceCounter;
|
|
private final Clock clock;
|
|
private final Observable<RtcConnection.StateChange> connectionState;
|
|
private final SerializedSubject<RtcConnection.StateChange, RtcConnection.StateChange> connectionStateSubject;
|
|
private Context context;
|
|
private OutgoingPayload.VoiceStateUpdate currentVoiceState;
|
|
private final long debugDisplayId;
|
|
private final Dispatcher dispatcher;
|
|
private final DebugPrintableCollection dpc;
|
|
private boolean hasSelectedVoiceChannel;
|
|
private Long joinedChannelTimestamp;
|
|
private final ListenerCollectionSubject<Listener> listenerSubject;
|
|
private final ListenerCollection<Listener> listeners;
|
|
private final Logger logger;
|
|
private final String loggingTag;
|
|
private NetworkMonitor networkMonitor;
|
|
private final Observable<RtcConnection.Quality> quality;
|
|
private final BehaviorSubject<RtcConnection.Quality> qualitySubject;
|
|
private RtcConnection rtcConnection;
|
|
private RtcConnection.Metadata rtcConnectionMetadata;
|
|
private final BehaviorSubject<RtcConnection.Metadata> rtcConnectionMetadataSubject;
|
|
private Channel selectedVoiceChannel;
|
|
private String sessionId;
|
|
private final Observable<List<SpeakingUserUpdate>> speakingUpdates;
|
|
private final PublishSubject<SpeakingUserUpdate> speakingUsersSubject;
|
|
private final StoreAnalytics storeAnalytics;
|
|
private final StoreRtcRegion storeRtcRegion;
|
|
private final StoreVoiceStates storeVoiceStates;
|
|
private final StoreStream stream;
|
|
private VoicePropsTracker voicePropsTracker;
|
|
private VoiceServer voiceServer;
|
|
|
|
/* compiled from: StoreRtcConnection.kt */
|
|
public static final class Companion {
|
|
private Companion() {
|
|
}
|
|
|
|
public /* synthetic */ Companion(DefaultConstructorMarker defaultConstructorMarker) {
|
|
this();
|
|
}
|
|
}
|
|
|
|
/* compiled from: StoreRtcConnection.kt */
|
|
public static abstract class DefaultListener implements Listener {
|
|
@Override // com.discord.stores.StoreRtcConnection.Listener
|
|
public void onConnected() {
|
|
}
|
|
|
|
@Override // com.discord.stores.StoreRtcConnection.Listener
|
|
public void onConnecting() {
|
|
}
|
|
|
|
@Override // com.discord.stores.StoreRtcConnection.Listener
|
|
public void onFirstFrameReceived(long j) {
|
|
}
|
|
|
|
@Override // com.discord.stores.StoreRtcConnection.Listener
|
|
public void onFirstFrameSent() {
|
|
}
|
|
}
|
|
|
|
/* compiled from: StoreRtcConnection.kt */
|
|
public interface Listener {
|
|
void onConnected();
|
|
|
|
void onConnecting();
|
|
|
|
/* synthetic */ void onFirstFrameReceived(long j);
|
|
|
|
/* synthetic */ void onFirstFrameSent();
|
|
}
|
|
|
|
/* compiled from: StoreRtcConnection.kt */
|
|
public static final class SpeakingUserUpdate {
|
|
private final boolean isSpeaking;
|
|
private final long userId;
|
|
|
|
public SpeakingUserUpdate(long j, boolean z2) {
|
|
this.userId = j;
|
|
this.isSpeaking = z2;
|
|
}
|
|
|
|
public static /* synthetic */ SpeakingUserUpdate copy$default(SpeakingUserUpdate speakingUserUpdate, long j, boolean z2, int i, Object obj) {
|
|
if ((i & 1) != 0) {
|
|
j = speakingUserUpdate.userId;
|
|
}
|
|
if ((i & 2) != 0) {
|
|
z2 = speakingUserUpdate.isSpeaking;
|
|
}
|
|
return speakingUserUpdate.copy(j, z2);
|
|
}
|
|
|
|
public final long component1() {
|
|
return this.userId;
|
|
}
|
|
|
|
public final boolean component2() {
|
|
return this.isSpeaking;
|
|
}
|
|
|
|
public final SpeakingUserUpdate copy(long j, boolean z2) {
|
|
return new SpeakingUserUpdate(j, z2);
|
|
}
|
|
|
|
public boolean equals(Object obj) {
|
|
if (this == obj) {
|
|
return true;
|
|
}
|
|
if (!(obj instanceof SpeakingUserUpdate)) {
|
|
return false;
|
|
}
|
|
SpeakingUserUpdate speakingUserUpdate = (SpeakingUserUpdate) obj;
|
|
return this.userId == speakingUserUpdate.userId && this.isSpeaking == speakingUserUpdate.isSpeaking;
|
|
}
|
|
|
|
public final long getUserId() {
|
|
return this.userId;
|
|
}
|
|
|
|
public int hashCode() {
|
|
int a = b.a(this.userId) * 31;
|
|
boolean z2 = this.isSpeaking;
|
|
if (z2) {
|
|
z2 = true;
|
|
}
|
|
int i = z2 ? 1 : 0;
|
|
int i2 = z2 ? 1 : 0;
|
|
int i3 = z2 ? 1 : 0;
|
|
return a + i;
|
|
}
|
|
|
|
public final boolean isSpeaking() {
|
|
return this.isSpeaking;
|
|
}
|
|
|
|
public String toString() {
|
|
StringBuilder O = a.O("SpeakingUserUpdate(userId=");
|
|
O.append(this.userId);
|
|
O.append(", isSpeaking=");
|
|
return a.K(O, this.isSpeaking, ")");
|
|
}
|
|
}
|
|
|
|
public final /* synthetic */ class WhenMappings {
|
|
public static final /* synthetic */ int[] $EnumSwitchMapping$0;
|
|
|
|
static {
|
|
RtcConnection.AnalyticsEvent.values();
|
|
int[] iArr = new int[5];
|
|
$EnumSwitchMapping$0 = iArr;
|
|
iArr[RtcConnection.AnalyticsEvent.VOICE_CONNECTION_SUCCESS.ordinal()] = 1;
|
|
iArr[RtcConnection.AnalyticsEvent.VOICE_CONNECTION_FAILURE.ordinal()] = 2;
|
|
iArr[RtcConnection.AnalyticsEvent.VOICE_DISCONNECT.ordinal()] = 3;
|
|
iArr[RtcConnection.AnalyticsEvent.VIDEO_STREAM_ENDED.ordinal()] = 4;
|
|
iArr[RtcConnection.AnalyticsEvent.MEDIA_SESSION_JOINED.ordinal()] = 5;
|
|
}
|
|
}
|
|
|
|
public StoreRtcConnection(StoreStream storeStream, Dispatcher dispatcher, Clock clock, StoreRtcRegion storeRtcRegion, StoreAnalytics storeAnalytics, StoreVoiceStates storeVoiceStates, Logger logger, DebugPrintableCollection debugPrintableCollection) {
|
|
m.checkNotNullParameter(storeStream, "stream");
|
|
m.checkNotNullParameter(dispatcher, "dispatcher");
|
|
m.checkNotNullParameter(clock, "clock");
|
|
m.checkNotNullParameter(storeRtcRegion, "storeRtcRegion");
|
|
m.checkNotNullParameter(storeAnalytics, "storeAnalytics");
|
|
m.checkNotNullParameter(storeVoiceStates, "storeVoiceStates");
|
|
m.checkNotNullParameter(logger, "logger");
|
|
m.checkNotNullParameter(debugPrintableCollection, "dpc");
|
|
this.stream = storeStream;
|
|
this.dispatcher = dispatcher;
|
|
this.clock = clock;
|
|
this.storeRtcRegion = storeRtcRegion;
|
|
this.storeAnalytics = storeAnalytics;
|
|
this.storeVoiceStates = storeVoiceStates;
|
|
this.logger = logger;
|
|
this.dpc = debugPrintableCollection;
|
|
ListenerCollectionSubject<Listener> listenerCollectionSubject = new ListenerCollectionSubject<>();
|
|
this.listenerSubject = listenerCollectionSubject;
|
|
this.listeners = listenerCollectionSubject;
|
|
PublishSubject<SpeakingUserUpdate> k0 = PublishSubject.k0();
|
|
this.speakingUsersSubject = k0;
|
|
BehaviorSubject<RtcConnection.Quality> l0 = BehaviorSubject.l0(RtcConnection.Quality.UNKNOWN);
|
|
this.qualitySubject = l0;
|
|
this.currentVoiceState = new OutgoingPayload.VoiceStateUpdate(null, null, false, false, false, null, 32, null);
|
|
SerializedSubject<RtcConnection.StateChange, RtcConnection.StateChange> serializedSubject = new SerializedSubject<>(BehaviorSubject.l0(new RtcConnection.StateChange(new RtcConnection.State.d(false), null)));
|
|
this.connectionStateSubject = serializedSubject;
|
|
this.rtcConnectionMetadataSubject = BehaviorSubject.l0(null);
|
|
Observable<RtcConnection.StateChange> q = ObservableExtensionsKt.computationLatest(serializedSubject).q();
|
|
m.checkNotNullExpressionValue(q, "connectionStateSubject\n … .distinctUntilChanged()");
|
|
this.connectionState = q;
|
|
m.checkNotNullExpressionValue(l0, "qualitySubject");
|
|
Observable<RtcConnection.Quality> q2 = ObservableExtensionsKt.computationLatest(l0).q();
|
|
m.checkNotNullExpressionValue(q2, "qualitySubject\n … .distinctUntilChanged()");
|
|
this.quality = q2;
|
|
Observable<List<SpeakingUserUpdate>> a = k0.a(300, TimeUnit.MILLISECONDS);
|
|
m.checkNotNullExpressionValue(a, "speakingUsersSubject\n …S, TimeUnit.MILLISECONDS)");
|
|
Observable<List<SpeakingUserUpdate>> q3 = ObservableExtensionsKt.computationLatest(a).q();
|
|
m.checkNotNullExpressionValue(q3, "speakingUsersSubject\n … .distinctUntilChanged()");
|
|
this.speakingUpdates = q3;
|
|
StringBuilder O = a.O("StoreRtcConnection ");
|
|
int i = instanceCounter + 1;
|
|
instanceCounter = i;
|
|
O.append(i);
|
|
String sb = O.toString();
|
|
this.loggingTag = sb;
|
|
this.debugDisplayId = debugPrintableCollection.add(this, sb);
|
|
}
|
|
|
|
/* JADX INFO: this call moved to the top of the method (can break code semantics) */
|
|
public /* synthetic */ StoreRtcConnection(StoreStream storeStream, Dispatcher dispatcher, Clock clock, StoreRtcRegion storeRtcRegion, StoreAnalytics storeAnalytics, StoreVoiceStates storeVoiceStates, Logger logger, DebugPrintableCollection debugPrintableCollection, int i, DefaultConstructorMarker defaultConstructorMarker) {
|
|
this(storeStream, dispatcher, clock, storeRtcRegion, storeAnalytics, storeVoiceStates, (i & 64) != 0 ? AppLog.g : logger, (i & 128) != 0 ? SystemLogUtils.INSTANCE.getDebugPrintables$app_productionBetaRelease() : debugPrintableCollection);
|
|
}
|
|
|
|
public static final /* synthetic */ Dispatcher access$getDispatcher$p(StoreRtcConnection storeRtcConnection) {
|
|
return storeRtcConnection.dispatcher;
|
|
}
|
|
|
|
public static final /* synthetic */ StoreAnalytics access$getStoreAnalytics$p(StoreRtcConnection storeRtcConnection) {
|
|
return storeRtcConnection.storeAnalytics;
|
|
}
|
|
|
|
public static final /* synthetic */ StoreStream access$getStream$p(StoreRtcConnection storeRtcConnection) {
|
|
return storeRtcConnection.stream;
|
|
}
|
|
|
|
public static final /* synthetic */ VoicePropsTracker access$getVoicePropsTracker$p(StoreRtcConnection storeRtcConnection) {
|
|
return storeRtcConnection.voicePropsTracker;
|
|
}
|
|
|
|
public static final /* synthetic */ void access$handleMediaSessionIdReceived(StoreRtcConnection storeRtcConnection) {
|
|
storeRtcConnection.handleMediaSessionIdReceived();
|
|
}
|
|
|
|
public static final /* synthetic */ void access$handleSelfDeafened(StoreRtcConnection storeRtcConnection, boolean z2) {
|
|
storeRtcConnection.handleSelfDeafened(z2);
|
|
}
|
|
|
|
public static final /* synthetic */ void access$handleSelfMuted(StoreRtcConnection storeRtcConnection, boolean z2) {
|
|
storeRtcConnection.handleSelfMuted(z2);
|
|
}
|
|
|
|
public static final /* synthetic */ void access$handleSelfVideo(StoreRtcConnection storeRtcConnection, boolean z2) {
|
|
storeRtcConnection.handleSelfVideo(z2);
|
|
}
|
|
|
|
public static final /* synthetic */ void access$handleUsersMuted(StoreRtcConnection storeRtcConnection, Map map) {
|
|
storeRtcConnection.handleUsersMuted(map);
|
|
}
|
|
|
|
public static final /* synthetic */ void access$handleUsersOffScreen(StoreRtcConnection storeRtcConnection, Map map) {
|
|
storeRtcConnection.handleUsersOffScreen(map);
|
|
}
|
|
|
|
public static final /* synthetic */ void access$handleUsersVolume(StoreRtcConnection storeRtcConnection, Map map) {
|
|
storeRtcConnection.handleUsersVolume(map);
|
|
}
|
|
|
|
public static final /* synthetic */ void access$setVoicePropsTracker$p(StoreRtcConnection storeRtcConnection, VoicePropsTracker voicePropsTracker) {
|
|
storeRtcConnection.voicePropsTracker = voicePropsTracker;
|
|
}
|
|
|
|
private final void applyVoiceConfiguration(RtcConnection rtcConnection, Long l) {
|
|
StoreMediaSettings.VoiceConfiguration voiceConfigurationBlocking = this.stream.getMediaSettings$app_productionBetaRelease().getVoiceConfigurationBlocking();
|
|
for (Map.Entry<Long, Float> entry : voiceConfigurationBlocking.getUserOutputVolumes().entrySet()) {
|
|
long longValue = entry.getKey().longValue();
|
|
float floatValue = entry.getValue().floatValue();
|
|
if (l == null || longValue == l.longValue()) {
|
|
rtcConnection.v(longValue, floatValue);
|
|
}
|
|
}
|
|
for (Map.Entry<Long, Boolean> entry2 : voiceConfigurationBlocking.getMutedUsers().entrySet()) {
|
|
long longValue2 = entry2.getKey().longValue();
|
|
boolean booleanValue = entry2.getValue().booleanValue();
|
|
if (l == null || longValue2 == l.longValue()) {
|
|
rtcConnection.X.put(Long.valueOf(longValue2), Boolean.valueOf(booleanValue));
|
|
MediaEngineConnection mediaEngineConnection = rtcConnection.w;
|
|
if (mediaEngineConnection != null) {
|
|
mediaEngineConnection.w(longValue2, booleanValue);
|
|
}
|
|
}
|
|
}
|
|
for (Map.Entry<Long, Boolean> entry3 : voiceConfigurationBlocking.getOffScreenUsers().entrySet()) {
|
|
long longValue3 = entry3.getKey().longValue();
|
|
boolean booleanValue2 = entry3.getValue().booleanValue();
|
|
if (l == null || longValue3 == l.longValue()) {
|
|
MediaEngineConnection mediaEngineConnection2 = rtcConnection.w;
|
|
if (mediaEngineConnection2 == null) {
|
|
Log.e("RtcConnection", "MediaEngine not connected for setLocalVideoOffscreen.");
|
|
} else {
|
|
mediaEngineConnection2.d(longValue3, booleanValue2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public static /* synthetic */ void applyVoiceConfiguration$default(StoreRtcConnection storeRtcConnection, RtcConnection rtcConnection, Long l, int i, Object obj) {
|
|
if ((i & 2) != 0) {
|
|
l = null;
|
|
}
|
|
storeRtcConnection.applyVoiceConfiguration(rtcConnection, l);
|
|
}
|
|
|
|
@StoreThread
|
|
private final void checkForVoiceServerUpdate() {
|
|
String str;
|
|
RtcConnection rtcConnection = this.rtcConnection;
|
|
VoiceServer voiceServer = this.voiceServer;
|
|
if (rtcConnection != null && voiceServer != null) {
|
|
if (voiceServer.c() == null || !(!m.areEqual(voiceServer.c(), rtcConnection.N))) {
|
|
if (voiceServer.a() != null) {
|
|
Long a = voiceServer.a();
|
|
long j = rtcConnection.O;
|
|
if (a == null || a.longValue() != j) {
|
|
return;
|
|
}
|
|
}
|
|
App.a aVar = App.j;
|
|
SSLSocketFactory sSLSocketFactory = null;
|
|
if (App.i) {
|
|
str = "";
|
|
} else {
|
|
str = voiceServer.b();
|
|
sSLSocketFactory = SecureSocketsLayerUtils.createSocketFactory$default(null, 1, null);
|
|
}
|
|
recordBreadcrumb(a.u("Voice server update, connect to server w/ endpoint: ", str));
|
|
rtcConnection.s(new w(rtcConnection, str, voiceServer.d(), sSLSocketFactory));
|
|
}
|
|
}
|
|
}
|
|
|
|
/* JADX WARNING: Removed duplicated region for block: B:11:0x0036 */
|
|
/* JADX WARNING: Removed duplicated region for block: B:12:0x0040 */
|
|
@StoreThread
|
|
private final void createRtcConnection() {
|
|
Long l;
|
|
long id2 = this.stream.getUsers$app_productionBetaRelease().getMeInternal$app_productionBetaRelease().getId();
|
|
String str = this.sessionId;
|
|
Channel channel = this.selectedVoiceChannel;
|
|
long j = 0;
|
|
String str2 = null;
|
|
if (channel != null) {
|
|
Long valueOf = Long.valueOf(channel.f());
|
|
if (valueOf.longValue() > 0) {
|
|
l = valueOf;
|
|
Channel channel2 = this.selectedVoiceChannel;
|
|
Long valueOf2 = channel2 == null ? Long.valueOf(channel2.h()) : null;
|
|
MediaEngine mediaEngine = StoreStream.Companion.getMediaEngine().getMediaEngine();
|
|
if (str != null && valueOf2 != null) {
|
|
RtcConnection rtcConnection = this.rtcConnection;
|
|
if (m.areEqual(rtcConnection != null ? Long.valueOf(rtcConnection.O) : null, valueOf2)) {
|
|
RtcConnection rtcConnection2 = this.rtcConnection;
|
|
if (rtcConnection2 != null) {
|
|
str2 = rtcConnection2.P;
|
|
}
|
|
if (m.areEqual(str2, str)) {
|
|
return;
|
|
}
|
|
}
|
|
if (l != null) {
|
|
j = l.longValue();
|
|
}
|
|
this.voicePropsTracker = new VoicePropsTracker(j, valueOf2.longValue(), id2, this.storeVoiceStates.get().get(Long.valueOf(j)));
|
|
Experiment userExperiment = this.stream.getExperiments$app_productionBetaRelease().getUserExperiment("2021-03_android_media_sink_wants", false);
|
|
boolean z2 = userExperiment != null && userExperiment.getBucket() == 1;
|
|
RtcConnection rtcConnection3 = this.rtcConnection;
|
|
if (rtcConnection3 != null) {
|
|
rtcConnection3.e();
|
|
}
|
|
long longValue = valueOf2.longValue();
|
|
String valueOf3 = String.valueOf(l != null ? l.longValue() : valueOf2.longValue());
|
|
Logger logger = this.logger;
|
|
String str3 = this.loggingTag;
|
|
NetworkMonitor networkMonitor = this.networkMonitor;
|
|
if (networkMonitor == null) {
|
|
m.throwUninitializedPropertyAccessException("networkMonitor");
|
|
}
|
|
RtcConnection rtcConnection4 = new RtcConnection(l, longValue, str, true, valueOf3, id2, mediaEngine, logger, ClockFactory.get(), null, networkMonitor, h0.toMutableMap(this.stream.getMediaSettings$app_productionBetaRelease().getMutedUsers()), null, null, z2, str3, null, 78336);
|
|
rtcConnection4.c(this);
|
|
this.rtcConnection = rtcConnection4;
|
|
this.listenerSubject.notify(StoreRtcConnection$createRtcConnection$1.INSTANCE);
|
|
updateMetadata();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
l = null;
|
|
Channel channel2 = this.selectedVoiceChannel;
|
|
if (channel2 == null) {
|
|
}
|
|
MediaEngine mediaEngine = StoreStream.Companion.getMediaEngine().getMediaEngine();
|
|
if (str != null) {
|
|
}
|
|
}
|
|
|
|
@StoreThread
|
|
private final void destroyRtcConnection(String str) {
|
|
RtcConnection rtcConnection = this.rtcConnection;
|
|
if (rtcConnection != null) {
|
|
recordBreadcrumb(a.u("destroying rtc connection: ", str));
|
|
rtcConnection.e();
|
|
this.rtcConnection = null;
|
|
updateMetadata();
|
|
}
|
|
}
|
|
|
|
@StoreThread
|
|
private final void handleMediaSessionIdReceived() {
|
|
AppLog appLog = AppLog.g;
|
|
RtcConnection rtcConnection = this.rtcConnection;
|
|
String str = rtcConnection != null ? rtcConnection.J : null;
|
|
Objects.requireNonNull(appLog);
|
|
FirebaseCrashlytics instance = FirebaseCrashlytics.getInstance();
|
|
if (str == null) {
|
|
str = "";
|
|
}
|
|
instance.setCustomKey("mediaSessionId", str);
|
|
updateMetadata();
|
|
}
|
|
|
|
@StoreThread
|
|
private final void handleSelfDeafened(boolean z2) {
|
|
this.currentVoiceState = OutgoingPayload.VoiceStateUpdate.copy$default(this.currentVoiceState, null, null, false, z2, false, null, 55, null);
|
|
onVoiceStateUpdated();
|
|
}
|
|
|
|
@StoreThread
|
|
private final void handleSelfMuted(boolean z2) {
|
|
this.currentVoiceState = OutgoingPayload.VoiceStateUpdate.copy$default(this.currentVoiceState, null, null, z2, false, false, null, 59, null);
|
|
onVoiceStateUpdated();
|
|
}
|
|
|
|
@StoreThread
|
|
private final void handleSelfVideo(boolean z2) {
|
|
this.currentVoiceState = OutgoingPayload.VoiceStateUpdate.copy$default(this.currentVoiceState, null, null, false, false, z2, null, 47, null);
|
|
onVoiceStateUpdated();
|
|
}
|
|
|
|
@StoreThread
|
|
private final void handleUsersMuted(Map<Long, Boolean> map) {
|
|
for (Map.Entry<Long, Boolean> entry : map.entrySet()) {
|
|
long longValue = entry.getKey().longValue();
|
|
boolean booleanValue = entry.getValue().booleanValue();
|
|
RtcConnection rtcConnection = this.rtcConnection;
|
|
if (rtcConnection != null) {
|
|
rtcConnection.X.put(Long.valueOf(longValue), Boolean.valueOf(booleanValue));
|
|
MediaEngineConnection mediaEngineConnection = rtcConnection.w;
|
|
if (mediaEngineConnection != null) {
|
|
mediaEngineConnection.w(longValue, booleanValue);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@StoreThread
|
|
private final void handleUsersOffScreen(Map<Long, Boolean> map) {
|
|
for (Map.Entry<Long, Boolean> entry : map.entrySet()) {
|
|
long longValue = entry.getKey().longValue();
|
|
boolean booleanValue = entry.getValue().booleanValue();
|
|
RtcConnection rtcConnection = this.rtcConnection;
|
|
if (rtcConnection != null) {
|
|
MediaEngineConnection mediaEngineConnection = rtcConnection.w;
|
|
if (mediaEngineConnection == null) {
|
|
Log.e("RtcConnection", "MediaEngine not connected for setLocalVideoOffscreen.");
|
|
} else {
|
|
mediaEngineConnection.d(longValue, booleanValue);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@StoreThread
|
|
private final void handleUsersVolume(Map<Long, Float> map) {
|
|
for (Map.Entry<Long, Float> entry : map.entrySet()) {
|
|
long longValue = entry.getKey().longValue();
|
|
float floatValue = entry.getValue().floatValue();
|
|
RtcConnection rtcConnection = this.rtcConnection;
|
|
if (rtcConnection != null) {
|
|
rtcConnection.v(longValue, floatValue);
|
|
}
|
|
}
|
|
}
|
|
|
|
@StoreThread
|
|
private final void logChannelJoin(Channel channel) {
|
|
String str;
|
|
long id2 = this.stream.getUsers$app_productionBetaRelease().getMeInternal$app_productionBetaRelease().getId();
|
|
RtcConnection rtcConnection = this.rtcConnection;
|
|
if (rtcConnection != null && (str = rtcConnection.l) != null) {
|
|
StageInstance stageInstanceForChannel = this.stream.getStageInstances$app_productionBetaRelease().getStageInstanceForChannel(channel.h());
|
|
Long valueOf = stageInstanceForChannel != null ? Long.valueOf(stageInstanceForChannel.c()) : null;
|
|
GuildScheduledEvent activeEventForChannel = this.stream.getGuildScheduledEvents$app_productionBetaRelease().getActiveEventForChannel(Long.valueOf(channel.f()), Long.valueOf(channel.h()));
|
|
Long valueOf2 = activeEventForChannel != null ? Long.valueOf(activeEventForChannel.g()) : null;
|
|
AnalyticsTracker analyticsTracker = AnalyticsTracker.INSTANCE;
|
|
Map<Long, VoiceState> map = (Map) a.s0(channel, this.stream.getVoiceStates$app_productionBetaRelease().get());
|
|
if (map == null) {
|
|
map = h0.emptyMap();
|
|
}
|
|
VideoInputDeviceDescription selectedVideoInputDeviceBlocking = this.stream.getMediaEngine$app_productionBetaRelease().getSelectedVideoInputDeviceBlocking();
|
|
NetworkUtils networkUtils = NetworkUtils.INSTANCE;
|
|
Context context = this.context;
|
|
if (context == null) {
|
|
m.throwUninitializedPropertyAccessException("context");
|
|
}
|
|
analyticsTracker.voiceChannelJoin(id2, str, channel, map, selectedVideoInputDeviceBlocking, networkUtils.getNetworkType(context), valueOf, valueOf2);
|
|
}
|
|
}
|
|
|
|
@StoreThread
|
|
private final void logChannelLeave(Channel channel) {
|
|
String str;
|
|
long id2 = this.stream.getUsers$app_productionBetaRelease().getMeInternal$app_productionBetaRelease().getId();
|
|
RtcConnection rtcConnection = this.rtcConnection;
|
|
if (rtcConnection != null && (str = rtcConnection.l) != null) {
|
|
Long l = null;
|
|
String str2 = rtcConnection != null ? rtcConnection.J : null;
|
|
StageInstance stageInstanceForChannel = this.stream.getStageInstances$app_productionBetaRelease().getStageInstanceForChannel(channel.h());
|
|
Long valueOf = stageInstanceForChannel != null ? Long.valueOf(stageInstanceForChannel.c()) : null;
|
|
GuildScheduledEvent activeEventForChannel = this.stream.getGuildScheduledEvents$app_productionBetaRelease().getActiveEventForChannel(Long.valueOf(channel.f()), Long.valueOf(channel.h()));
|
|
Long valueOf2 = activeEventForChannel != null ? Long.valueOf(activeEventForChannel.g()) : null;
|
|
LinkedHashMap linkedHashMap = new LinkedHashMap();
|
|
VoicePropsTracker voicePropsTracker = this.voicePropsTracker;
|
|
if (voicePropsTracker != null) {
|
|
voicePropsTracker.getProps(linkedHashMap);
|
|
}
|
|
this.voicePropsTracker = null;
|
|
AnalyticsTracker analyticsTracker = AnalyticsTracker.INSTANCE;
|
|
Map<Long, VoiceState> map = (Map) a.s0(channel, this.stream.getVoiceStates$app_productionBetaRelease().get());
|
|
if (map == null) {
|
|
map = h0.emptyMap();
|
|
}
|
|
Long l2 = this.joinedChannelTimestamp;
|
|
if (l2 != null) {
|
|
l = Long.valueOf(this.clock.currentTimeMillis() - l2.longValue());
|
|
}
|
|
analyticsTracker.voiceChannelLeave(id2, str, channel, map, str2, linkedHashMap, l, valueOf, valueOf2);
|
|
}
|
|
}
|
|
|
|
private final void loge(String str, Throwable th, Map<String, String> map) {
|
|
this.logger.e(this.loggingTag, str, th, map);
|
|
}
|
|
|
|
/* JADX DEBUG: Multi-variable search result rejected for r1v0, resolved type: com.discord.stores.StoreRtcConnection */
|
|
/* JADX WARN: Multi-variable type inference failed */
|
|
public static /* synthetic */ void loge$default(StoreRtcConnection storeRtcConnection, String str, Throwable th, Map map, int i, Object obj) {
|
|
if ((i & 2) != 0) {
|
|
th = null;
|
|
}
|
|
if ((i & 4) != 0) {
|
|
map = null;
|
|
}
|
|
storeRtcConnection.loge(str, th, map);
|
|
}
|
|
|
|
private final void logi(String str, Throwable th) {
|
|
this.logger.i(this.loggingTag, str, th);
|
|
}
|
|
|
|
public static /* synthetic */ void logi$default(StoreRtcConnection storeRtcConnection, String str, Throwable th, int i, Object obj) {
|
|
if ((i & 2) != 0) {
|
|
th = null;
|
|
}
|
|
storeRtcConnection.logi(str, th);
|
|
}
|
|
|
|
private final void logw(String str) {
|
|
Logger.w$default(this.logger, this.loggingTag, str, null, 4, null);
|
|
}
|
|
|
|
@StoreThread
|
|
private final void onVoiceStateUpdated() {
|
|
String str;
|
|
if (this.hasSelectedVoiceChannel) {
|
|
StringBuilder O = a.O("Voice state update: ");
|
|
O.append(this.currentVoiceState);
|
|
recordBreadcrumb(O.toString());
|
|
}
|
|
StoreGatewayConnection gatewaySocket = StoreStream.Companion.getGatewaySocket();
|
|
Long guildId = this.currentVoiceState.getGuildId();
|
|
Long channelId = this.currentVoiceState.getChannelId();
|
|
boolean selfMute = this.currentVoiceState.getSelfMute();
|
|
boolean selfDeaf = this.currentVoiceState.getSelfDeaf();
|
|
boolean selfVideo = this.currentVoiceState.getSelfVideo();
|
|
Long channelId2 = this.currentVoiceState.getChannelId();
|
|
if (channelId2 != null) {
|
|
channelId2.longValue();
|
|
str = this.storeRtcRegion.getPreferredRegion();
|
|
} else {
|
|
str = null;
|
|
}
|
|
gatewaySocket.voiceStateUpdate(guildId, channelId, selfMute, selfDeaf, selfVideo, str, this.storeRtcRegion.shouldIncludePreferredRegion(this.currentVoiceState.getGuildId()));
|
|
}
|
|
|
|
private final void recordBreadcrumb(String str) {
|
|
this.logger.recordBreadcrumb(str, this.loggingTag);
|
|
}
|
|
|
|
@StoreThread
|
|
private final void updateMetadata() {
|
|
RtcConnection rtcConnection = this.rtcConnection;
|
|
RtcConnection.Metadata i = rtcConnection != null ? rtcConnection.i() : null;
|
|
this.rtcConnectionMetadata = i;
|
|
this.rtcConnectionMetadataSubject.onNext(i);
|
|
}
|
|
|
|
@Override // com.discord.utilities.debug.DebugPrintable
|
|
public void debugPrint(DebugPrintBuilder debugPrintBuilder) {
|
|
m.checkNotNullParameter(debugPrintBuilder, "dp");
|
|
debugPrintBuilder.appendKeyValue("sessionId", this.sessionId);
|
|
debugPrintBuilder.appendKeyValue("rtcConnection", (DebugPrintable) this.rtcConnection);
|
|
}
|
|
|
|
public final void finalize() {
|
|
this.dpc.remove(this.debugDisplayId);
|
|
}
|
|
|
|
public final long getConnectedGuildId() {
|
|
Long l;
|
|
RtcConnection rtcConnection = this.rtcConnection;
|
|
if (rtcConnection == null || (l = rtcConnection.N) == null) {
|
|
return 0;
|
|
}
|
|
return l.longValue();
|
|
}
|
|
|
|
public final Observable<RtcConnection.StateChange> getConnectionState() {
|
|
return this.connectionState;
|
|
}
|
|
|
|
public final ListenerCollection<Listener> getListeners() {
|
|
return this.listeners;
|
|
}
|
|
|
|
public final Observable<RtcConnection.Quality> getQuality() {
|
|
return this.quality;
|
|
}
|
|
|
|
public final RtcConnection getRtcConnection$app_productionBetaRelease() {
|
|
return this.rtcConnection;
|
|
}
|
|
|
|
@StoreThread
|
|
public final RtcConnection.Metadata getRtcConnectionMetadata() {
|
|
return this.rtcConnectionMetadata;
|
|
}
|
|
|
|
public final Observable<List<SpeakingUserUpdate>> getSpeakingUpdates() {
|
|
return this.speakingUpdates;
|
|
}
|
|
|
|
@StoreThread
|
|
public final void handleConnectionOpen(ModelPayload modelPayload) {
|
|
m.checkNotNullParameter(modelPayload, "payload");
|
|
this.sessionId = modelPayload.getSessionId();
|
|
RtcConnection rtcConnection = this.rtcConnection;
|
|
if (rtcConnection != null) {
|
|
String sessionId = modelPayload.getSessionId();
|
|
m.checkNotNullExpressionValue(sessionId, "payload.sessionId");
|
|
m.checkNotNullParameter(sessionId, "<set-?>");
|
|
rtcConnection.P = sessionId;
|
|
}
|
|
}
|
|
|
|
@StoreThread
|
|
public final void handleConnectionReady(boolean z2) {
|
|
if (z2) {
|
|
Channel channel = this.selectedVoiceChannel;
|
|
handleVoiceChannelSelected(Long.valueOf(channel != null ? channel.h() : 0));
|
|
}
|
|
}
|
|
|
|
/* JADX WARNING: Removed duplicated region for block: B:27:0x007e */
|
|
/* JADX WARNING: Removed duplicated region for block: B:28:0x0088 */
|
|
/* JADX WARNING: Removed duplicated region for block: B:31:0x0098 */
|
|
/* JADX WARNING: Removed duplicated region for block: B:32:0x00ad */
|
|
@StoreThread
|
|
public final void handleVoiceChannelSelected(Long l) {
|
|
Long l2;
|
|
Channel channel = this.selectedVoiceChannel;
|
|
if (!m.areEqual(l, channel != null ? Long.valueOf(channel.h()) : null)) {
|
|
Channel channel2 = this.selectedVoiceChannel;
|
|
if (channel2 != null) {
|
|
logChannelLeave(channel2);
|
|
}
|
|
this.joinedChannelTimestamp = null;
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.append("Channel ID changed, ");
|
|
sb.append(l);
|
|
sb.append(" != ");
|
|
Channel channel3 = this.selectedVoiceChannel;
|
|
sb.append(channel3 != null ? Long.valueOf(channel3.h()) : null);
|
|
destroyRtcConnection(sb.toString());
|
|
}
|
|
Channel findChannelByIdInternal$app_productionBetaRelease = l != null ? this.stream.getChannels$app_productionBetaRelease().findChannelByIdInternal$app_productionBetaRelease(l.longValue()) : null;
|
|
this.selectedVoiceChannel = findChannelByIdInternal$app_productionBetaRelease;
|
|
OutgoingPayload.VoiceStateUpdate voiceStateUpdate = this.currentVoiceState;
|
|
if (findChannelByIdInternal$app_productionBetaRelease != null) {
|
|
Long valueOf = Long.valueOf(findChannelByIdInternal$app_productionBetaRelease.f());
|
|
if (valueOf.longValue() > 0) {
|
|
l2 = valueOf;
|
|
this.currentVoiceState = OutgoingPayload.VoiceStateUpdate.copy$default(voiceStateUpdate, l2, findChannelByIdInternal$app_productionBetaRelease == null ? Long.valueOf(findChannelByIdInternal$app_productionBetaRelease.h()) : null, false, false, false, null, 60, null);
|
|
if (findChannelByIdInternal$app_productionBetaRelease == null) {
|
|
this.hasSelectedVoiceChannel = true;
|
|
createRtcConnection();
|
|
this.joinedChannelTimestamp = Long.valueOf(this.clock.currentTimeMillis());
|
|
logChannelJoin(findChannelByIdInternal$app_productionBetaRelease);
|
|
} else {
|
|
this.voiceServer = null;
|
|
}
|
|
onVoiceStateUpdated();
|
|
}
|
|
}
|
|
l2 = null;
|
|
this.currentVoiceState = OutgoingPayload.VoiceStateUpdate.copy$default(voiceStateUpdate, l2, findChannelByIdInternal$app_productionBetaRelease == null ? Long.valueOf(findChannelByIdInternal$app_productionBetaRelease.h()) : null, false, false, false, null, 60, null);
|
|
if (findChannelByIdInternal$app_productionBetaRelease == null) {
|
|
}
|
|
onVoiceStateUpdated();
|
|
}
|
|
|
|
@StoreThread
|
|
public final void handleVoiceServerUpdate(VoiceServer voiceServer) {
|
|
m.checkNotNullParameter(voiceServer, "voiceServer");
|
|
recordBreadcrumb("handling voice server update: " + voiceServer);
|
|
this.voiceServer = voiceServer;
|
|
checkForVoiceServerUpdate();
|
|
}
|
|
|
|
@StoreThread
|
|
public final void handleVoiceStateUpdate(VoiceState voiceState) {
|
|
m.checkNotNullParameter(voiceState, "voiceState");
|
|
VoicePropsTracker voicePropsTracker = this.voicePropsTracker;
|
|
if (voicePropsTracker != null) {
|
|
voicePropsTracker.handleVoiceStateUpdate(voiceState);
|
|
}
|
|
}
|
|
|
|
@StoreThread
|
|
public final void init(Context context, NetworkMonitor networkMonitor) {
|
|
m.checkNotNullParameter(context, "context");
|
|
m.checkNotNullParameter(networkMonitor, "networkMonitor");
|
|
this.context = context;
|
|
this.networkMonitor = networkMonitor;
|
|
StoreStream.Companion companion = StoreStream.Companion;
|
|
ObservableExtensionsKt.appSubscribe$default(companion.getMediaSettings().isSelfMuted(), StoreRtcConnection.class, (Context) null, (Function1) null, (Function1) null, (Function0) null, (Function0) null, new StoreRtcConnection$init$1(this), 62, (Object) null);
|
|
ObservableExtensionsKt.appSubscribe$default(companion.getMediaSettings().isSelfDeafened(), StoreRtcConnection.class, (Context) null, (Function1) null, (Function1) null, (Function0) null, (Function0) null, new StoreRtcConnection$init$2(this), 62, (Object) null);
|
|
Observable<R> F = companion.getMediaEngine().getSelectedVideoInputDevice().F(StoreRtcConnection$init$3.INSTANCE);
|
|
m.checkNotNullExpressionValue(F, "StoreStream\n .get…viceDescription != null }");
|
|
ObservableExtensionsKt.appSubscribe$default(F, StoreRtcConnection.class, (Context) null, (Function1) null, (Function1) null, (Function0) null, (Function0) null, new StoreRtcConnection$init$4(this), 62, (Object) null);
|
|
ObservableExtensionsKt.appSubscribe$default(this.stream.getMediaSettings$app_productionBetaRelease().getUsersVolume(), StoreRtcConnection.class, (Context) null, (Function1) null, (Function1) null, (Function0) null, (Function0) null, new StoreRtcConnection$init$5(this), 62, (Object) null);
|
|
ObservableExtensionsKt.appSubscribe$default(this.stream.getMediaSettings$app_productionBetaRelease().getUsersMuted(), StoreRtcConnection.class, (Context) null, (Function1) null, (Function1) null, (Function0) null, (Function0) null, new StoreRtcConnection$init$6(this), 62, (Object) null);
|
|
ObservableExtensionsKt.appSubscribe$default(this.stream.getMediaSettings$app_productionBetaRelease().getUsersOffScreen(), StoreRtcConnection.class, (Context) null, (Function1) null, (Function1) null, (Function0) null, (Function0) null, new StoreRtcConnection$init$7(this), 62, (Object) null);
|
|
}
|
|
|
|
public final Observable<RtcConnection.Metadata> observeRtcConnectionMetadata() {
|
|
BehaviorSubject<RtcConnection.Metadata> behaviorSubject = this.rtcConnectionMetadataSubject;
|
|
m.checkNotNullExpressionValue(behaviorSubject, "rtcConnectionMetadataSubject");
|
|
return behaviorSubject;
|
|
}
|
|
|
|
@Override // com.discord.rtcconnection.RtcConnection.b, com.discord.rtcconnection.RtcConnection.c
|
|
public void onAnalyticsEvent(RtcConnection.AnalyticsEvent analyticsEvent, Map<String, Object> map) {
|
|
m.checkNotNullParameter(analyticsEvent, "event");
|
|
m.checkNotNullParameter(map, "properties");
|
|
int ordinal = analyticsEvent.ordinal();
|
|
if (ordinal == 0) {
|
|
this.storeAnalytics.trackVoiceConnectionSuccess(map);
|
|
} else if (ordinal == 1) {
|
|
this.storeAnalytics.trackVoiceConnectionFailure(map);
|
|
} else if (ordinal == 2) {
|
|
this.storeAnalytics.trackVoiceDisconnect(map);
|
|
} else if (ordinal == 3) {
|
|
this.dispatcher.schedule(new StoreRtcConnection$onAnalyticsEvent$1(this, map));
|
|
} else if (ordinal == 4) {
|
|
this.storeAnalytics.trackMediaSessionJoined(map);
|
|
}
|
|
}
|
|
|
|
@Override // com.discord.rtcconnection.RtcConnection.b, com.discord.rtcconnection.RtcConnection.c
|
|
public void onFatalClose() {
|
|
this.stream.getVoiceChannelSelected$app_productionBetaRelease().clear();
|
|
}
|
|
|
|
@Override // com.discord.rtcconnection.RtcConnection.b
|
|
public void onFirstFrameReceived(long j) {
|
|
this.listenerSubject.notify(new StoreRtcConnection$onFirstFrameReceived$1(j));
|
|
}
|
|
|
|
@Override // com.discord.rtcconnection.RtcConnection.b
|
|
public void onFirstFrameSent() {
|
|
this.listenerSubject.notify(StoreRtcConnection$onFirstFrameSent$1.INSTANCE);
|
|
}
|
|
|
|
@Override // com.discord.rtcconnection.RtcConnection.b, com.discord.rtcconnection.RtcConnection.c
|
|
public void onMediaEngineConnectionConnected(RtcConnection rtcConnection) {
|
|
m.checkNotNullParameter(rtcConnection, "connection");
|
|
this.dispatcher.schedule(new StoreRtcConnection$onMediaEngineConnectionConnected$1(this, rtcConnection));
|
|
}
|
|
|
|
@Override // com.discord.rtcconnection.RtcConnection.b, com.discord.rtcconnection.RtcConnection.c
|
|
public void onMediaSessionIdReceived() {
|
|
this.dispatcher.schedule(new StoreRtcConnection$onMediaSessionIdReceived$1(this));
|
|
}
|
|
|
|
@Override // com.discord.rtcconnection.RtcConnection.b, com.discord.rtcconnection.RtcConnection.c
|
|
public void onQualityUpdate(RtcConnection.Quality quality) {
|
|
m.checkNotNullParameter(quality, "quality");
|
|
this.qualitySubject.onNext(quality);
|
|
}
|
|
|
|
@Override // com.discord.rtcconnection.RtcConnection.b, com.discord.rtcconnection.RtcConnection.c
|
|
public void onSpeaking(long j, boolean z2) {
|
|
PublishSubject<SpeakingUserUpdate> publishSubject = this.speakingUsersSubject;
|
|
publishSubject.j.onNext(new SpeakingUserUpdate(j, z2));
|
|
this.dispatcher.schedule(new StoreRtcConnection$onSpeaking$1(this, j, z2));
|
|
}
|
|
|
|
@Override // com.discord.rtcconnection.RtcConnection.b, com.discord.rtcconnection.RtcConnection.c
|
|
public void onStateChange(RtcConnection.StateChange stateChange) {
|
|
m.checkNotNullParameter(stateChange, "stateChange");
|
|
recordBreadcrumb("connection state change: " + stateChange);
|
|
this.connectionStateSubject.j.onNext(stateChange);
|
|
if (m.areEqual(stateChange.a, RtcConnection.State.f.a)) {
|
|
this.listenerSubject.notify(StoreRtcConnection$onStateChange$1.INSTANCE);
|
|
}
|
|
}
|
|
|
|
@Override // com.discord.rtcconnection.RtcConnection.b, com.discord.rtcconnection.RtcConnection.c
|
|
public void onUserCreated(RtcConnection rtcConnection, long j) {
|
|
m.checkNotNullParameter(rtcConnection, "connection");
|
|
applyVoiceConfiguration(rtcConnection, Long.valueOf(j));
|
|
}
|
|
|
|
@Override // com.discord.rtcconnection.RtcConnection.b, com.discord.rtcconnection.RtcConnection.c
|
|
public void onVideoMetadata(VideoMetadata videoMetadata) {
|
|
m.checkNotNullParameter(videoMetadata, "metadata");
|
|
this.dispatcher.schedule(new StoreRtcConnection$onVideoMetadata$1(this, videoMetadata));
|
|
}
|
|
|
|
@Override // com.discord.rtcconnection.RtcConnection.b, com.discord.rtcconnection.RtcConnection.c
|
|
public void onVideoStream(long j, Integer num, int i, int i2, int i3) {
|
|
this.dispatcher.schedule(new StoreRtcConnection$onVideoStream$1(this, j, num, i, i2, i3));
|
|
}
|
|
}
|