mirror of
https://github.com/signalapp/Signal-Android.git
synced 2025-12-24 21:15:48 +00:00
Update to RingRTC v2.15.0
Also adds audio processing option for internal users.
This commit is contained in:
committed by
Greyson Parrelli
parent
deddb4f77d
commit
83d3e56dcf
@@ -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)
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -213,7 +213,6 @@ public abstract class WebRtcActionProcessor {
|
||||
messageAgeSec,
|
||||
WebRtcUtil.getCallMediaTypeFromOfferType(offerMetadata.getOfferType()),
|
||||
1,
|
||||
receivedOfferMetadata.isMultiRing(),
|
||||
true,
|
||||
remoteIdentityKey,
|
||||
localIdentityKey);
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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'],
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user