diff --git a/app/build.gradle b/app/build.gradle index fff38a256..794c7925b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -202,7 +202,7 @@ dependencies { implementation 'com.github.HITGIF:TextFieldBoxes:1.4.5' implementation 'eu.davidea:flexible-adapter:5.1.0' implementation 'eu.davidea:flexible-adapter-ui:1.0.0' - implementation 'org.webrtc:google-webrtc:1.0.23295' + implementation 'org.webrtc:google-webrtc:1.0.32006' implementation "org.jetbrains.kotlin:kotlin-stdlib:${kotlinVersion}" implementation 'com.yarolegovich:lovely-dialog:1.1.0' implementation 'com.yarolegovich:lovelyinput:1.0.9' @@ -210,6 +210,7 @@ dependencies { implementation 'me.zhanghai.android.effortlesspermissions:library:1.1.0' implementation 'org.apache.commons:commons-lang3:3.9' implementation 'com.github.wooplr:Spotlight:1.3' + implementation 'com.google.code.findbugs:jsr305:2.0.1' implementation('com.github.mario:chatkit:c6a61767291ddb212a2f4f792a2b6aaf295e69a5', { exclude group: 'com.facebook.fresco' }) diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/UserItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/UserItem.java index e4de0f499..1859bc684 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/UserItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/UserItem.java @@ -40,7 +40,7 @@ import com.nextcloud.talk.utils.DisplayUtils; import java.util.List; import java.util.regex.Pattern; -import javax.annotation.Nullable; +import androidx.annotation.Nullable; import androidx.emoji.widget.EmojiTextView; import butterknife.BindView; diff --git a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt index 255f69f26..bf897e11d 100644 --- a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt +++ b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.kt @@ -25,10 +25,9 @@ import android.os.Build import android.os.Build.VERSION.SDK_INT import android.os.Build.VERSION_CODES.P import android.util.Log +import androidx.appcompat.app.AppCompatDelegate import androidx.emoji.bundled.BundledEmojiCompatConfig import androidx.emoji.text.EmojiCompat - -import androidx.appcompat.app.AppCompatDelegate import androidx.lifecycle.LifecycleObserver import androidx.multidex.MultiDex import androidx.multidex.MultiDexApplication @@ -66,7 +65,6 @@ import com.nextcloud.talk.utils.preferences.AppPreferences import com.nextcloud.talk.webrtc.MagicWebRTCUtils import com.vanniktech.emoji.EmojiManager import com.vanniktech.emoji.googlecompat.GoogleCompatEmojiProvider - import de.cotech.hw.SecurityKeyManager import de.cotech.hw.SecurityKeyManagerConfig import okhttp3.OkHttpClient @@ -74,11 +72,10 @@ import org.conscrypt.Conscrypt import org.webrtc.PeerConnectionFactory import org.webrtc.voiceengine.WebRtcAudioManager import org.webrtc.voiceengine.WebRtcAudioUtils - -import javax.inject.Inject -import javax.inject.Singleton import java.security.Security import java.util.concurrent.TimeUnit +import javax.inject.Inject +import javax.inject.Singleton @AutoComponent(modules = [BusModule::class, ContextModule::class, DatabaseModule::class, RestModule::class, UserModule::class, ArbitraryStorageModule::class]) @Singleton @@ -108,9 +105,7 @@ class NextcloudTalkApplication : MultiDexApplication(), LifecycleObserver { WebRtcAudioManager.setBlacklistDeviceForOpenSLESUsage(true) } - PeerConnectionFactory.initialize(PeerConnectionFactory.InitializationOptions.builder(this) - .setEnableVideoHwAcceleration(MagicWebRTCUtils.shouldEnableVideoHardwareAcceleration()) .createInitializationOptions()) } catch (e: UnsatisfiedLinkError) { Log.w(TAG, e) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/CallController.java b/app/src/main/java/com/nextcloud/talk/controllers/CallController.java index 75e962bdd..490c95178 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/CallController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/CallController.java @@ -107,6 +107,8 @@ import org.webrtc.Camera1Enumerator; import org.webrtc.Camera2Enumerator; import org.webrtc.CameraEnumerator; import org.webrtc.CameraVideoCapturer; +import org.webrtc.DefaultVideoDecoderFactory; +import org.webrtc.DefaultVideoEncoderFactory; import org.webrtc.EglBase; import org.webrtc.IceCandidate; import org.webrtc.Logging; @@ -116,6 +118,7 @@ import org.webrtc.PeerConnection; import org.webrtc.PeerConnectionFactory; import org.webrtc.RendererCommon; import org.webrtc.SessionDescription; +import org.webrtc.SurfaceTextureHelper; import org.webrtc.SurfaceViewRenderer; import org.webrtc.VideoCapturer; import org.webrtc.VideoSource; @@ -358,10 +361,15 @@ public class CallController extends BaseController { //Create a new PeerConnectionFactory instance. PeerConnectionFactory.Options options = new PeerConnectionFactory.Options(); - peerConnectionFactory = PeerConnectionFactory.builder().createPeerConnectionFactory(); + DefaultVideoEncoderFactory defaultVideoEncoderFactory = new DefaultVideoEncoderFactory( + rootEglBase.getEglBaseContext(),true,true); + DefaultVideoDecoderFactory defaultVideoDecoderFactory = new DefaultVideoDecoderFactory(rootEglBase.getEglBaseContext()); - peerConnectionFactory.setVideoHwAccelerationOptions(rootEglBase.getEglBaseContext(), - rootEglBase.getEglBaseContext()); + peerConnectionFactory = PeerConnectionFactory.builder() + .setOptions(options) + .setVideoEncoderFactory(defaultVideoEncoderFactory) + .setVideoDecoderFactory(defaultVideoDecoderFactory) + .createPeerConnectionFactory(); //Create MediaConstraints - Will be useful for specifying video and audio constraints. audioConstraints = new MediaConstraints(); @@ -584,13 +592,14 @@ public class CallController extends BaseController { //Create a VideoSource instance if (videoCapturer != null) { - videoSource = peerConnectionFactory.createVideoSource(videoCapturer); - localVideoTrack = peerConnectionFactory.createVideoTrack("NCv0", videoSource); - localMediaStream.addTrack(localVideoTrack); - localVideoTrack.setEnabled(false); - localVideoTrack.addSink(pipVideoView); + SurfaceTextureHelper surfaceTextureHelper = SurfaceTextureHelper.create("CaptureThread", rootEglBase.getEglBaseContext()); + videoSource = peerConnectionFactory.createVideoSource(false); + videoCapturer.initialize(surfaceTextureHelper, getApplicationContext(), videoSource.getCapturerObserver()); } - + localVideoTrack = peerConnectionFactory.createVideoTrack("NCv0", videoSource); + localMediaStream.addTrack(localVideoTrack); + localVideoTrack.setEnabled(false); + localVideoTrack.addSink(pipVideoView); } private void microphoneInitialization() { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/CallNotificationController.java b/app/src/main/java/com/nextcloud/talk/controllers/CallNotificationController.java index 486418bc2..51c7339da 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/CallNotificationController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/CallNotificationController.java @@ -45,6 +45,7 @@ import android.widget.RelativeLayout; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.constraintlayout.widget.ConstraintLayout; import com.bluelinelabs.conductor.RouterTransaction; @@ -89,7 +90,6 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import javax.annotation.Nullable; import javax.inject.Inject; import autodagger.AutoInjector; diff --git a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java index f7ade0a90..76159e641 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/ApiUtils.java @@ -23,6 +23,7 @@ import android.net.Uri; import android.text.TextUtils; import androidx.annotation.DimenRes; +import androidx.annotation.Nullable; import com.nextcloud.talk.BuildConfig; import com.nextcloud.talk.R; @@ -32,8 +33,6 @@ import com.nextcloud.talk.models.RetrofitBucket; import java.util.HashMap; import java.util.Map; -import javax.annotation.Nullable; - import okhttp3.Credentials; public class ApiUtils { diff --git a/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java b/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java index cd57ab347..8e4fabf98 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java @@ -56,6 +56,7 @@ import androidx.annotation.ColorInt; import androidx.annotation.ColorRes; import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.XmlRes; import androidx.appcompat.widget.AppCompatDrawableManager; import androidx.core.content.ContextCompat; @@ -96,9 +97,6 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - public class DisplayUtils { private static final String TAG = "DisplayUtils"; @@ -107,7 +105,7 @@ public class DisplayUtils { SpannableString spannableString = new SpannableString(string); spannableString.setSpan(new ClickableSpan() { @Override - public void onClick(@Nonnull View widget) { + public void onClick(@NonNull View widget) { Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); NextcloudTalkApplication.Companion.getSharedApplication().getApplicationContext().startActivity(browserIntent); @@ -181,12 +179,12 @@ public class DisplayUtils { } @Override - public void onFinalImageSet(String id, @javax.annotation.Nullable Object imageInfo, @javax.annotation.Nullable Animatable animatable) { + public void onFinalImageSet(String id, @androidx.annotation.Nullable Object imageInfo, @androidx.annotation.Nullable Animatable animatable) { updateViewSize((ImageInfo) imageInfo, draweeView); } @Override - public void onIntermediateImageSet(String id, @javax.annotation.Nullable Object imageInfo) { + public void onIntermediateImageSet(String id, @androidx.annotation.Nullable Object imageInfo) { updateViewSize((ImageInfo) imageInfo, draweeView); }