Update to RingRTC v2.15.0

Also adds audio processing option for internal users.
This commit is contained in:
Jim Gustafson
2021-12-01 06:37:14 -08:00
committed by Greyson Parrelli
parent deddb4f77d
commit 83d3e56dcf
14 changed files with 52 additions and 12 deletions

View File

@@ -8,6 +8,7 @@ import android.widget.Toast
import androidx.lifecycle.ViewModelProvider
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import org.signal.core.util.concurrent.SignalExecutors
import org.signal.ringrtc.CallManager
import org.thoughtcrime.securesms.BuildConfig
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.settings.DSLConfiguration
@@ -321,6 +322,19 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter
)
}
sectionHeaderPref(R.string.preferences__internal_audio)
radioListPref(
title = DSLSettingsText.from(R.string.preferences__internal_audio_processing_method),
listItems = CallManager.AudioProcessingMethod.values().map { it.name }.toTypedArray(),
selected = CallManager.AudioProcessingMethod.values().indexOf(state.audioProcessingMethod),
onSelected = {
viewModel.setInternalAudioProcessingMethod(CallManager.AudioProcessingMethod.values()[it])
}
)
dividerPref()
if (FeatureFlags.donorBadges() && SignalStore.donationsValues().getSubscriber() != null) {
sectionHeaderPref(R.string.preferences__internal_badges)

View File

@@ -1,5 +1,6 @@
package org.thoughtcrime.securesms.components.settings.app.internal
import org.signal.ringrtc.CallManager
import org.thoughtcrime.securesms.emoji.EmojiFiles
data class InternalSettingsState(
@@ -13,6 +14,7 @@ data class InternalSettingsState(
val disableAutoMigrationNotification: Boolean,
val forceCensorship: Boolean,
val callingServer: String,
val audioProcessingMethod: CallManager.AudioProcessingMethod,
val useBuiltInEmojiSet: Boolean,
val emojiVersion: EmojiFiles.Version?,
val removeSenderKeyMinimium: Boolean,

View File

@@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.components.settings.app.internal
import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import org.signal.ringrtc.CallManager
import org.thoughtcrime.securesms.keyvalue.InternalValues
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.util.livedata.Store
@@ -90,6 +91,11 @@ class InternalSettingsViewModel(private val repository: InternalSettingsReposito
refresh()
}
fun setInternalAudioProcessingMethod(method: CallManager.AudioProcessingMethod) {
preferenceDataStore.putInt(InternalValues.AUDIO_PROCESSING_METHOD, method.ordinal)
refresh()
}
private fun refresh() {
store.update { getState().copy(emojiVersion = it.emojiVersion) }
}
@@ -105,6 +111,7 @@ class InternalSettingsViewModel(private val repository: InternalSettingsReposito
disableAutoMigrationNotification = SignalStore.internalValues().disableGv1AutoMigrateNotification(),
forceCensorship = SignalStore.internalValues().forcedCensorship(),
callingServer = SignalStore.internalValues().groupCallingServer(),
audioProcessingMethod = SignalStore.internalValues().audioProcessingMethod(),
useBuiltInEmojiSet = SignalStore.internalValues().forceBuiltInEmoji(),
emojiVersion = null,
removeSenderKeyMinimium = SignalStore.internalValues().removeSenderKeyMinimum(),

View File

@@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.keyvalue;
import androidx.annotation.NonNull;
import org.signal.ringrtc.CallManager;
import org.thoughtcrime.securesms.BuildConfig;
import org.thoughtcrime.securesms.util.FeatureFlags;
@@ -23,6 +24,7 @@ public final class InternalValues extends SignalStoreValues {
public static final String REMOVE_SENDER_KEY_MINIMUM = "internal.remove_sender_key_minimum";
public static final String DELAY_RESENDS = "internal.delay_resends";
public static final String CALLING_SERVER = "internal.calling_server";
public static final String AUDIO_PROCESSING_METHOD = "internal.audio_processing_method";
public static final String SHAKE_TO_REPORT = "internal.shake_to_report";
public static final String DISABLE_STORAGE_SERVICE = "internal.disable_storage_service";
@@ -153,4 +155,16 @@ public final class InternalValues extends SignalStoreValues {
}
return internalServer != null ? internalServer : BuildConfig.SIGNAL_SFU_URL;
}
/**
* The selected audio processing method to use (for AEC/NS).
* <p>
* The user must be an internal user otherwise the default method will be returned. For
* evaluation, internal users will use software processing by default unless the setting
* is changed in storage.
*/
public synchronized CallManager.AudioProcessingMethod audioProcessingMethod() {
return FeatureFlags.internalUser() ? CallManager.AudioProcessingMethod.values()[getInteger(AUDIO_PROCESSING_METHOD, CallManager.AudioProcessingMethod.ForceSoftware.ordinal())]
: CallManager.AudioProcessingMethod.Default;
}
}

View File

@@ -45,7 +45,7 @@ class GroupNetworkUnavailableActionProcessor extends WebRtcActionProcessor {
byte[] groupId = currentState.getCallInfoState().getCallRecipient().requireGroupId().getDecodedId();
GroupCall groupCall = webRtcInteractor.getCallManager().createGroupCall(groupId,
SignalStore.internalValues().groupCallingServer(),
currentState.getVideoState().getLockableEglBase().require(),
SignalStore.internalValues().audioProcessingMethod(),
webRtcInteractor.getGroupCallObserver());
return currentState.builder()

View File

@@ -44,7 +44,7 @@ public class GroupPreJoinActionProcessor extends GroupActionProcessor {
byte[] groupId = currentState.getCallInfoState().getCallRecipient().requireGroupId().getDecodedId();
GroupCall groupCall = webRtcInteractor.getCallManager().createGroupCall(groupId,
SignalStore.internalValues().groupCallingServer(),
currentState.getVideoState().getLockableEglBase().require(),
SignalStore.internalValues().audioProcessingMethod(),
webRtcInteractor.getGroupCallObserver());
try {

View File

@@ -68,6 +68,7 @@ public class IncomingCallActionProcessor extends DeviceAwareActionProcessor {
webRtcInteractor.getCallManager().proceed(activePeer.getCallId(),
context,
videoState.getLockableEglBase().require(),
SignalStore.internalValues().audioProcessingMethod(),
videoState.requireLocalSink(),
callParticipant.getVideoSink(),
videoState.requireCamera(),

View File

@@ -169,7 +169,7 @@ public final class IncomingGroupCallActionProcessor extends DeviceAwareActionPro
byte[] groupId = currentState.getCallInfoState().getCallRecipient().requireGroupId().getDecodedId();
GroupCall groupCall = webRtcInteractor.getCallManager().createGroupCall(groupId,
SignalStore.internalValues().groupCallingServer(),
currentState.getVideoState().getLockableEglBase().require(),
SignalStore.internalValues().audioProcessingMethod(),
webRtcInteractor.getGroupCallObserver());
try {

View File

@@ -14,6 +14,7 @@ import org.thoughtcrime.securesms.crypto.IdentityKeyUtil;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.events.CallParticipant;
import org.thoughtcrime.securesms.events.WebRtcViewModel;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientUtil;
import org.thoughtcrime.securesms.ringrtc.RemotePeer;
@@ -105,6 +106,7 @@ public class OutgoingCallActionProcessor extends DeviceAwareActionProcessor {
webRtcInteractor.getCallManager().proceed(activePeer.getCallId(),
context,
videoState.getLockableEglBase().require(),
SignalStore.internalValues().audioProcessingMethod(),
videoState.requireLocalSink(),
callParticipant.getVideoSink(),
videoState.requireCamera(),
@@ -149,7 +151,7 @@ public class OutgoingCallActionProcessor extends DeviceAwareActionProcessor {
byte[] remoteIdentityKey = WebRtcUtil.getPublicKeyBytes(receivedAnswerMetadata.getRemoteIdentityKey());
byte[] localIdentityKey = WebRtcUtil.getPublicKeyBytes(IdentityKeyUtil.getIdentityKey(context).serialize());
webRtcInteractor.getCallManager().receivedAnswer(callMetadata.getCallId(), callMetadata.getRemoteDevice(), answerMetadata.getOpaque(), receivedAnswerMetadata.isMultiRing(), remoteIdentityKey, localIdentityKey);
webRtcInteractor.getCallManager().receivedAnswer(callMetadata.getCallId(), callMetadata.getRemoteDevice(), answerMetadata.getOpaque(), remoteIdentityKey, localIdentityKey);
} catch (CallException | InvalidKeyException e) {
return callFailure(currentState, "receivedAnswer() failed: ", e);
}

View File

@@ -472,7 +472,6 @@ public final class SignalCallManager implements CallManager.Observer, GroupCall.
return p.handleReceivedOfferWhileActive(s, remotePeer);
case ENDED_LOCAL_HANGUP:
case ENDED_APP_DROPPED_CALL:
case IGNORE_CALLS_FROM_NON_MULTIRING_CALLERS:
Log.i(TAG, "Ignoring event: " + event);
break;
default:
@@ -562,17 +561,17 @@ public final class SignalCallManager implements CallManager.Observer, GroupCall.
}
@Override
public void onSendHangup(@NonNull CallId callId, @Nullable Remote remote, @NonNull Integer remoteDevice, @NonNull Boolean broadcast, @NonNull CallManager.HangupType hangupType, @NonNull Integer deviceId, @NonNull Boolean useLegacyHangupMessage) {
public void onSendHangup(@NonNull CallId callId, @Nullable Remote remote, @NonNull Integer remoteDevice, @NonNull Boolean broadcast, @NonNull CallManager.HangupType hangupType, @NonNull Integer deviceId) {
if (!(remote instanceof RemotePeer)) {
return;
}
RemotePeer remotePeer = (RemotePeer) remote;
Log.i(TAG, "onSendHangup: id: " + remotePeer.getCallId().format(remoteDevice) + " type: " + hangupType.name() + " isLegacy: " + useLegacyHangupMessage);
Log.i(TAG, "onSendHangup: id: " + remotePeer.getCallId().format(remoteDevice) + " type: " + hangupType.name());
WebRtcData.CallMetadata callMetadata = new WebRtcData.CallMetadata(remotePeer, remoteDevice);
WebRtcData.HangupMetadata hangupMetadata = new WebRtcData.HangupMetadata(WebRtcUtil.getHangupTypeFromCallHangupType(hangupType), useLegacyHangupMessage, deviceId);
WebRtcData.HangupMetadata hangupMetadata = new WebRtcData.HangupMetadata(WebRtcUtil.getHangupTypeFromCallHangupType(hangupType), false, deviceId);
process((s, p) -> p.handleSendHangup(s, callMetadata, hangupMetadata, broadcast));
}

View File

@@ -213,7 +213,6 @@ public abstract class WebRtcActionProcessor {
messageAgeSec,
WebRtcUtil.getCallMediaTypeFromOfferType(offerMetadata.getOfferType()),
1,
receivedOfferMetadata.isMultiRing(),
true,
remoteIdentityKey,
localIdentityKey);

View File

@@ -2594,6 +2594,8 @@
<string name="preferences__internal_calling" translatable="false">Group call server</string>
<string name="preferences__internal_calling_default" translatable="false">Default</string>
<string name="preferences__internal_calling_s_server" translatable="false">%1$s server</string>
<string name="preferences__internal_audio" translatable="false">Audio options</string>
<string name="preferences__internal_audio_processing_method" translatable="false">Audio processing method</string>
<string name="preferences__internal_badges" translatable="false">Badges</string>
<string name="preferences__internal_badges_enqueue_redemption" translatable="false">Enqueue redemption.</string>

View File

@@ -585,8 +585,8 @@ dependencyVerification {
['org.signal:argon2:13.1',
'0f686ccff0d4842bfcc74d92e8dc780a5f159b9376e37a1189fabbcdac458bef'],
['org.signal:ringrtc-android:2.14.3',
'e17d64b0ffcf2b533a9d43a1fc339dbcd153423a38996b8b32c25cd5dfdfab5f'],
['org.signal:ringrtc-android:2.15.0',
'c2ed27ff1f325c5365ececb60064d4ad68e1eb2a31c2dc21728b91b8c206727c'],
['org.slf4j:slf4j-api:1.7.24',
'baf3c7fe15fefeaf9e5b000d94547379dc48370f22a8797e239c127e7d7756ec'],

View File

@@ -73,7 +73,7 @@ dependencyResolutionManagement {
alias('signal-client-android').to('org.whispersystems', 'signal-client-android').versionRef('signal-client')
alias('signal-aesgcmprovider').to('org.signal:aesgcmprovider:0.0.3')
alias('signal-argon2').to('org.signal:argon2:13.1')
alias('signal-ringrtc').to('org.signal:ringrtc-android:2.14.3')
alias('signal-ringrtc').to('org.signal:ringrtc-android:2.15.0')
alias('signal-android-database-sqlcipher').to('org.signal:android-database-sqlcipher:4.4.3-S8')
// Third Party