Change summary
src/main/java/eu/siacs/conversations/services/CallIntegration.java | 32
src/main/java/eu/siacs/conversations/services/CallIntegrationConnectionService.java | 4
src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java | 2
3 files changed, 27 insertions(+), 11 deletions(-)
Detailed changes
@@ -1,6 +1,7 @@
package eu.siacs.conversations.services;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.media.AudioManager;
import android.media.ToneGenerator;
import android.net.Uri;
@@ -50,7 +51,12 @@ public class CallIntegration extends Connection {
public CallIntegration(final Context context) {
this.context = context.getApplicationContext();
if (selfManaged()) {
- setConnectionProperties(Connection.PROPERTY_SELF_MANAGED);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ setConnectionProperties(Connection.PROPERTY_SELF_MANAGED);
+ } else {
+ throw new AssertionError(
+ "Trying to set connection properties on unsupported version");
+ }
this.appRTCAudioManager = null;
} else {
this.appRTCAudioManager = new AppRTCAudioManager(context);
@@ -151,7 +157,11 @@ public class CallIntegration extends Connection {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
setAudioDeviceUpsideDownCake(audioDevice);
} else if (selfManaged()) {
- setAudioDeviceOreo(audioDevice);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ setAudioDeviceOreo(audioDevice);
+ } else {
+ throw new AssertionError("Trying to set audio devices on unsupported version");
+ }
} else {
setAudioDeviceFallback(audioDevice);
}
@@ -309,7 +319,7 @@ public class CallIntegration extends Connection {
@Override
public void onStateChanged(final int state) {
Log.d(Config.LOGTAG, "onStateChanged(" + state + ")");
- if (notSelfManaged()) {
+ if (notSelfManaged(context)) {
if (state == STATE_DIALING) {
requireAppRtcAudioManager().startRingBack();
} else {
@@ -432,18 +442,24 @@ public class CallIntegration extends Connection {
callback.onAudioDeviceChanged(selectedAudioDevice, availableAudioDevices);
}
- public static boolean selfManaged() {
- return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
+ private boolean selfManaged() {
+ return selfManaged(context);
}
- public static boolean notSelfManaged() {
- return Build.VERSION.SDK_INT < Build.VERSION_CODES.O;
+ public static boolean selfManaged(final Context context) {
+ final var packageManager = context.getPackageManager();
+ return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
+ && packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
+ }
+
+ public static boolean notSelfManaged(final Context context) {
+ return !selfManaged(context);
}
public void setInitialAudioDevice(final AudioDevice audioDevice) {
Log.d(Config.LOGTAG, "setInitialAudioDevice(" + audioDevice + ")");
this.initialAudioDevice = audioDevice;
- if (CallIntegration.selfManaged()) {
+ if (selfManaged()) {
// once the 'CallIntegration' gets added to the system we receive calls to update audio
// state
return;
@@ -314,7 +314,7 @@ public class CallIntegrationConnectionService extends ConnectionService {
final Account account,
final Jid with,
final Set<Media> media) {
- if (CallIntegration.selfManaged()) {
+ if (CallIntegration.selfManaged(service)) {
final var extras = new Bundle();
extras.putParcelable(
TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, getHandle(service, account));
@@ -349,7 +349,7 @@ public class CallIntegrationConnectionService extends ConnectionService {
public static void addNewIncomingCall(
final Context context, final AbstractJingleConnection.Id id) {
- if (CallIntegration.notSelfManaged()) {
+ if (CallIntegration.notSelfManaged(context)) {
Log.d(
Config.LOGTAG,
"not adding incoming call to TelecomManager on Android "
@@ -1692,7 +1692,7 @@ public class JingleRtpConnection extends AbstractJingleConnection
ringingTimeoutFuture =
jingleConnectionManager.schedule(
this::ringingTimeout, BUSY_TIME_OUT, TimeUnit.SECONDS);
- if (CallIntegration.selfManaged()) {
+ if (CallIntegration.selfManaged(xmppConnectionService)) {
return;
}
xmppConnectionService.getNotificationService().startRinging(id, getMedia());