diff --git a/android/build.gradle b/android/build.gradle index f55e0ecc5286..e1d0781b63ea 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -20,7 +20,7 @@ ext { kotlinVersion = "1.9.24" buildToolsVersion = "34.0.0" compileSdkVersion = 34 - minSdkVersion = 24 + minSdkVersion = 26 targetSdkVersion = 34 supportLibVersion = "28.0.0" ndkVersion = "26.1.10909125" diff --git a/android/sdk/src/main/java/org/jitsi/meet/sdk/AudioDeviceHandlerConnectionService.java b/android/sdk/src/main/java/org/jitsi/meet/sdk/AudioDeviceHandlerConnectionService.java index 5d76ba021197..9b5bb1f90ff0 100644 --- a/android/sdk/src/main/java/org/jitsi/meet/sdk/AudioDeviceHandlerConnectionService.java +++ b/android/sdk/src/main/java/org/jitsi/meet/sdk/AudioDeviceHandlerConnectionService.java @@ -18,7 +18,6 @@ import android.content.Context; import android.media.AudioManager; -import android.os.Build; import android.telecom.CallAudioState; import androidx.annotation.RequiresApi; @@ -34,7 +33,6 @@ * {@link AudioModeModule.AudioDeviceHandlerInterface} module implementing device handling for * Android versions >= O when ConnectionService is enabled. */ -@RequiresApi(Build.VERSION_CODES.O) class AudioDeviceHandlerConnectionService implements AudioModeModule.AudioDeviceHandlerInterface, RNConnectionService.CallAudioStateListener { diff --git a/android/sdk/src/main/java/org/jitsi/meet/sdk/AudioDeviceHandlerGeneric.java b/android/sdk/src/main/java/org/jitsi/meet/sdk/AudioDeviceHandlerGeneric.java index 87bc981b9d19..000cf92cbea4 100644 --- a/android/sdk/src/main/java/org/jitsi/meet/sdk/AudioDeviceHandlerGeneric.java +++ b/android/sdk/src/main/java/org/jitsi/meet/sdk/AudioDeviceHandlerGeneric.java @@ -20,7 +20,6 @@ import android.media.AudioDeviceInfo; import android.media.AudioFocusRequest; import android.media.AudioManager; -import android.os.Build; import java.util.HashSet; import java.util.Set; @@ -227,22 +226,17 @@ public boolean setMode(int mode) { audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION); audioManager.setMicrophoneMute(false); - int gotFocus; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - gotFocus = audioManager.requestAudioFocus(new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN) - .setAudioAttributes( - new AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION) - .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH) - .build() - ) - .setAcceptsDelayedFocusGain(true) - .setOnAudioFocusChangeListener(this) - .build() - ); - } else { - gotFocus = audioManager.requestAudioFocus(this, AudioManager.STREAM_VOICE_CALL, AudioManager.AUDIOFOCUS_GAIN); - } + int gotFocus = audioManager.requestAudioFocus(new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN) + .setAudioAttributes( + new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION) + .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH) + .build() + ) + .setAcceptsDelayedFocusGain(true) + .setOnAudioFocusChangeListener(this) + .build() + ); if (gotFocus == AudioManager.AUDIOFOCUS_REQUEST_FAILED) { JitsiMeetLogger.w(TAG + " Audio focus request failed"); diff --git a/android/sdk/src/main/java/org/jitsi/meet/sdk/AudioModeModule.java b/android/sdk/src/main/java/org/jitsi/meet/sdk/AudioModeModule.java index 368dc57265a6..3888c5d9bc90 100644 --- a/android/sdk/src/main/java/org/jitsi/meet/sdk/AudioModeModule.java +++ b/android/sdk/src/main/java/org/jitsi/meet/sdk/AudioModeModule.java @@ -20,7 +20,6 @@ import android.app.Activity; import android.content.Context; import android.media.AudioManager; -import android.os.Build; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Promise; @@ -58,7 +57,6 @@ * Before a call has started and after it has ended the * {@code AudioModeModule.DEFAULT} mode should be used. */ -@SuppressLint("AnnotateVersionCheck") @ReactModule(name = AudioModeModule.NAME) class AudioModeModule extends ReactContextBaseJavaModule { public static final String NAME = "AudioMode"; @@ -84,11 +82,10 @@ class AudioModeModule extends ReactContextBaseJavaModule { /** * Whether or not the ConnectionService is used for selecting audio devices. */ - private static final boolean supportsConnectionService = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O; - private static boolean useConnectionService_ = supportsConnectionService; + private static boolean useConnectionService_ = true; static boolean useConnectionService() { - return supportsConnectionService && useConnectionService_; + return useConnectionService_; } /** diff --git a/android/sdk/src/main/java/org/jitsi/meet/sdk/ConnectionService.java b/android/sdk/src/main/java/org/jitsi/meet/sdk/ConnectionService.java index e8e7e270e18d..d66e1d879798 100644 --- a/android/sdk/src/main/java/org/jitsi/meet/sdk/ConnectionService.java +++ b/android/sdk/src/main/java/org/jitsi/meet/sdk/ConnectionService.java @@ -37,7 +37,6 @@ * * @author Pawel Domas */ -@RequiresApi(api = Build.VERSION_CODES.O) public class ConnectionService extends android.telecom.ConnectionService { /** diff --git a/android/sdk/src/main/java/org/jitsi/meet/sdk/JitsiMeetOngoingConferenceService.java b/android/sdk/src/main/java/org/jitsi/meet/sdk/JitsiMeetOngoingConferenceService.java index f106d076194a..f2ed6c6f0847 100644 --- a/android/sdk/src/main/java/org/jitsi/meet/sdk/JitsiMeetOngoingConferenceService.java +++ b/android/sdk/src/main/java/org/jitsi/meet/sdk/JitsiMeetOngoingConferenceService.java @@ -83,11 +83,7 @@ private static void doLaunch(Context context, HashMap extraData) ComponentName componentName; try { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - componentName = context.startForegroundService(intent); - } else { - componentName = context.startService(intent); - } + componentName = context.startForegroundService(intent); } catch (RuntimeException e) { // Avoid crashing due to ForegroundServiceStartNotAllowedException (API level 31). // See: https://developer.android.com/guide/components/foreground-services#background-start-restrictions diff --git a/android/sdk/src/main/java/org/jitsi/meet/sdk/OngoingNotification.java b/android/sdk/src/main/java/org/jitsi/meet/sdk/OngoingNotification.java index 145e64bc5f18..63484f9bf7e7 100644 --- a/android/sdk/src/main/java/org/jitsi/meet/sdk/OngoingNotification.java +++ b/android/sdk/src/main/java/org/jitsi/meet/sdk/OngoingNotification.java @@ -29,8 +29,6 @@ import androidx.annotation.StringRes; import androidx.core.app.NotificationCompat; -import android.os.Build; - /** * Helper class for creating the ongoing notification which is used with @@ -45,10 +43,6 @@ class OngoingNotification { static final String ONGOING_CONFERENCE_CHANNEL_ID = "JitsiOngoingConferenceChannel"; static void createNotificationChannel(Activity context) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { - return; - } - if (context == null) { JitsiMeetLogger.w(TAG + " Cannot create notification channel: no current context"); return; diff --git a/android/sdk/src/main/java/org/jitsi/meet/sdk/PictureInPictureModule.java b/android/sdk/src/main/java/org/jitsi/meet/sdk/PictureInPictureModule.java index a60e5e78e36a..4a958469a690 100644 --- a/android/sdk/src/main/java/org/jitsi/meet/sdk/PictureInPictureModule.java +++ b/android/sdk/src/main/java/org/jitsi/meet/sdk/PictureInPictureModule.java @@ -20,7 +20,6 @@ import android.app.Activity; import android.app.ActivityManager; import android.app.PictureInPictureParams; -import android.os.Build; import android.util.Rational; import com.facebook.react.bridge.Promise; @@ -53,7 +52,7 @@ public PictureInPictureModule(ReactApplicationContext reactContext) { // Android Go devices don't support PiP. There doesn't seem to be a better way to detect it than // to use ActivityManager.isLowRamDevice(). // https://stackoverflow.com/questions/58340558/how-to-detect-android-go - isSupported = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && !am.isLowRamDevice(); + isSupported = !am.isLowRamDevice(); } /** @@ -82,7 +81,6 @@ public Map getConstants() { * including when the activity is not visible (paused or stopped), if the * screen is locked or if the user has an activity pinned. */ - @TargetApi(Build.VERSION_CODES.O) public void enterPictureInPicture() { if (!isEnabled) { return; diff --git a/android/sdk/src/main/java/org/jitsi/meet/sdk/RNConnectionService.java b/android/sdk/src/main/java/org/jitsi/meet/sdk/RNConnectionService.java index 58e48b394883..24451e77fe5d 100644 --- a/android/sdk/src/main/java/org/jitsi/meet/sdk/RNConnectionService.java +++ b/android/sdk/src/main/java/org/jitsi/meet/sdk/RNConnectionService.java @@ -3,7 +3,6 @@ import android.annotation.SuppressLint; import android.content.Context; import android.net.Uri; -import android.os.Build; import android.os.Bundle; import android.telecom.DisconnectCause; import android.telecom.PhoneAccount; @@ -32,7 +31,6 @@ * * @author Pawel Domas */ -@RequiresApi(api = Build.VERSION_CODES.O) @ReactModule(name = RNConnectionService.NAME) class RNConnectionService extends ReactContextBaseJavaModule { @@ -53,7 +51,6 @@ class RNConnectionService extends ReactContextBaseJavaModule { * @param audioRoute the new audio route to be set. See * {@link android.telecom.CallAudioState} constants prefixed with "ROUTE_". */ - @RequiresApi(api = Build.VERSION_CODES.O) static void setAudioRoute(int audioRoute) { for (ConnectionService.ConnectionImpl c : ConnectionService.getConnections()) { diff --git a/react-native-sdk/README.md b/react-native-sdk/README.md index faba639b6d45..78071c4140e4 100644 --- a/react-native-sdk/README.md +++ b/react-native-sdk/README.md @@ -69,7 +69,7 @@ cd ios && pod install && cd .. ## Android -- In your build.gradle have at least `minSdkVersion = 24` +- In your build.gradle have at least `minSdkVersion = 26` - In `android/app/src/debug/AndroidManifest.xml` and `android/app/src/main/AndroidManifest.xml`, under the `` tag, include ```xml