play ringback sound on android 6/7
This commit is contained in:
parent
6ecc481eca
commit
20e1f54277
|
@ -16,6 +16,7 @@ import android.content.IntentFilter;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.media.AudioDeviceInfo;
|
import android.media.AudioDeviceInfo;
|
||||||
import android.media.AudioManager;
|
import android.media.AudioManager;
|
||||||
|
import android.media.ToneGenerator;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
@ -25,11 +26,14 @@ import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
import eu.siacs.conversations.Config;
|
import eu.siacs.conversations.Config;
|
||||||
import eu.siacs.conversations.utils.AppRTCUtils;
|
import eu.siacs.conversations.utils.AppRTCUtils;
|
||||||
|
import eu.siacs.conversations.xmpp.jingle.JingleConnectionManager;
|
||||||
|
|
||||||
import org.webrtc.ThreadUtils;
|
import org.webrtc.ThreadUtils;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ScheduledFuture;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
/** AppRTCAudioManager manages all audio related parts of the AppRTC demo. */
|
/** AppRTCAudioManager manages all audio related parts of the AppRTC demo. */
|
||||||
public class AppRTCAudioManager {
|
public class AppRTCAudioManager {
|
||||||
|
@ -66,6 +70,7 @@ public class AppRTCAudioManager {
|
||||||
private final BroadcastReceiver wiredHeadsetReceiver;
|
private final BroadcastReceiver wiredHeadsetReceiver;
|
||||||
// Callback method for changes in audio focus.
|
// Callback method for changes in audio focus.
|
||||||
@Nullable private AudioManager.OnAudioFocusChangeListener audioFocusChangeListener;
|
@Nullable private AudioManager.OnAudioFocusChangeListener audioFocusChangeListener;
|
||||||
|
private ScheduledFuture<?> ringBackFuture;
|
||||||
|
|
||||||
public AppRTCAudioManager(final Context context) {
|
public AppRTCAudioManager(final Context context) {
|
||||||
apprtcContext = context;
|
apprtcContext = context;
|
||||||
|
@ -454,6 +459,29 @@ public class AppRTCAudioManager {
|
||||||
ContextCompat.getMainExecutor(apprtcContext).execute(runnable);
|
ContextCompat.getMainExecutor(apprtcContext).execute(runnable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void startRingBack() {
|
||||||
|
this.ringBackFuture =
|
||||||
|
JingleConnectionManager.SCHEDULED_EXECUTOR_SERVICE.scheduleAtFixedRate(
|
||||||
|
() -> {
|
||||||
|
final var toneGenerator =
|
||||||
|
new ToneGenerator(
|
||||||
|
AudioManager.STREAM_MUSIC,
|
||||||
|
CallIntegration.DEFAULT_VOLUME);
|
||||||
|
toneGenerator.startTone(ToneGenerator.TONE_CDMA_DIAL_TONE_LITE, 750);
|
||||||
|
},
|
||||||
|
0,
|
||||||
|
3,
|
||||||
|
TimeUnit.SECONDS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stopRingBack() {
|
||||||
|
final var future = this.ringBackFuture;
|
||||||
|
if (future == null || future.isDone()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
future.cancel(true);
|
||||||
|
}
|
||||||
|
|
||||||
/** AudioManager state. */
|
/** AudioManager state. */
|
||||||
public enum AudioManagerState {
|
public enum AudioManagerState {
|
||||||
UNINITIALIZED,
|
UNINITIALIZED,
|
||||||
|
|
|
@ -34,7 +34,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
public class CallIntegration extends Connection {
|
public class CallIntegration extends Connection {
|
||||||
|
|
||||||
private static final int DEFAULT_VOLUME = 80;
|
public static final int DEFAULT_VOLUME = 80;
|
||||||
|
|
||||||
private final Context context;
|
private final Context context;
|
||||||
|
|
||||||
|
@ -309,7 +309,13 @@ public class CallIntegration extends Connection {
|
||||||
@Override
|
@Override
|
||||||
public void onStateChanged(final int state) {
|
public void onStateChanged(final int state) {
|
||||||
Log.d(Config.LOGTAG, "onStateChanged(" + state + ")");
|
Log.d(Config.LOGTAG, "onStateChanged(" + state + ")");
|
||||||
// TODO devices before selfManaged() will likely have to play their own ringback sound
|
if (notSelfManaged()) {
|
||||||
|
if (state == STATE_DIALING) {
|
||||||
|
requireAppRtcAudioManager().startRingBack();
|
||||||
|
} else {
|
||||||
|
requireAppRtcAudioManager().stopRingBack();
|
||||||
|
}
|
||||||
|
}
|
||||||
if (state == STATE_ACTIVE) {
|
if (state == STATE_ACTIVE) {
|
||||||
playConnectedSound();
|
playConnectedSound();
|
||||||
} else if (state == STATE_DISCONNECTED) {
|
} else if (state == STATE_DISCONNECTED) {
|
||||||
|
|
Loading…
Reference in a new issue