diff --git a/ring-android/app/src/main/java/cx/ring/service/DRingService.java b/ring-android/app/src/main/java/cx/ring/service/DRingService.java index 54c1714a224ae08fe17c706fd967df62ffc614e0..d0e2a5c06edaa01a9d06591468262c978089d197 100644 --- a/ring-android/app/src/main/java/cx/ring/service/DRingService.java +++ b/ring-android/app/src/main/java/cx/ring/service/DRingService.java @@ -30,7 +30,6 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.database.ContentObserver; -import android.hardware.usb.UsbManager; import android.net.ConnectivityManager; import android.os.Build; import android.os.Bundle; @@ -62,7 +61,6 @@ import cx.ring.client.ConversationActivity; import cx.ring.facades.ConversationFacade; import cx.ring.model.Codec; import cx.ring.model.Settings; -import cx.ring.model.SipCall; import cx.ring.model.Uri; import cx.ring.services.AccountService; import cx.ring.services.CallService; @@ -534,11 +532,6 @@ public class DRingService extends Service { updateConnectivityState(); break; } - case UsbManager.ACTION_USB_DEVICE_ATTACHED: - case UsbManager.ACTION_USB_DEVICE_DETACHED: { - mHardwareService.initVideo(); - break; - } case PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED: { mConnectivityChecker.run(); mHandler.postDelayed(mConnectivityChecker, 100); @@ -546,7 +539,6 @@ public class DRingService extends Service { } } }; - @Override public void onCreate() { Log.i(TAG, "onCreated"); @@ -565,8 +557,6 @@ public class DRingService extends Service { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { intentFilter.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED); } - intentFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); - intentFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); registerReceiver(receiver, intentFilter); updateConnectivityState(); @@ -585,6 +575,7 @@ public class DRingService extends Service { unregisterReceiver(receiver); getContentResolver().unregisterContentObserver(contactContentObserver); + mHardwareService.unregisterCameraDetectionCallback(); mDisposableBag.clear(); isRunning = false; } diff --git a/ring-android/app/src/main/java/cx/ring/services/CameraService.java b/ring-android/app/src/main/java/cx/ring/services/CameraService.java index 817d22b05e09cc83e29bafb7dea17949cd082249..555852b03c65e4e353d54c79ad6b1f6e06e7009f 100644 --- a/ring-android/app/src/main/java/cx/ring/services/CameraService.java +++ b/ring-android/app/src/main/java/cx/ring/services/CameraService.java @@ -94,6 +94,21 @@ public class CameraService { private MediaProjection currentMediaProjection; private VirtualDisplay virtualDisplay; private MediaCodec currentCodec; + private final CameraManager.AvailabilityCallback availabilityCallback = new CameraManager.AvailabilityCallback() { + @Override + public void onCameraAvailable(@NonNull String cameraId) { + init() + .onErrorComplete() + .subscribe(); + } + + @Override + public void onCameraUnavailable(@NonNull String cameraId) { + init() + .onErrorComplete() + .subscribe(); + } + }; CameraService(@NonNull Context c) { manager = (CameraManager) c.getSystemService(Context.CAMERA_SERVICE); @@ -368,6 +383,7 @@ public class CameraService { }) .ignoreElement() .doOnError(e -> Log.e(TAG, "Error initializing video device", e)) + .doOnComplete(() -> manager.registerAvailabilityCallback(availabilityCallback, getVideoHandler())) .onErrorComplete(); } @@ -938,4 +954,9 @@ public class CameraService { (long) rhs.getWidth() * rhs.getHeight()); } } + + public void unregisterCameraDetectionCallback() { + if (manager != null && availabilityCallback != null) + manager.unregisterAvailabilityCallback(availabilityCallback); + } } diff --git a/ring-android/app/src/main/java/cx/ring/services/HardwareServiceImpl.java b/ring-android/app/src/main/java/cx/ring/services/HardwareServiceImpl.java index 7cddda0d6a7e9f085a1b990453ba98c1cf5987ea..04fd494c276271c2cf89beeafb9645e962a2ebbd 100644 --- a/ring-android/app/src/main/java/cx/ring/services/HardwareServiceImpl.java +++ b/ring-android/app/src/main/java/cx/ring/services/HardwareServiceImpl.java @@ -24,6 +24,7 @@ import android.bluetooth.BluetoothHeadset; import android.content.Context; import android.content.pm.PackageManager; import android.graphics.Point; +import android.hardware.camera2.CameraManager; import android.media.AudioDeviceInfo; import android.media.AudioManager; import android.media.MediaRecorder; @@ -33,10 +34,11 @@ import android.view.SurfaceHolder; import android.view.TextureView; import android.view.WindowManager; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.media.AudioAttributesCompat; -import androidx.media.AudioManagerCompat; import androidx.media.AudioFocusRequestCompat; +import androidx.media.AudioManagerCompat; import java.io.File; import java.lang.ref.WeakReference; @@ -741,4 +743,9 @@ public class HardwareServiceImpl extends HardwareService implements AudioManager int w, h; long window = 0; } + + @Override + public void unregisterCameraDetectionCallback() { + cameraService.unregisterCameraDetectionCallback(); + } } diff --git a/ring-android/libringclient/src/main/java/cx/ring/services/HardwareService.java b/ring-android/libringclient/src/main/java/cx/ring/services/HardwareService.java index 117fb31e68ab20f4b8e10bf20b680bb8a480a083..de47bef2ea1df98bcd6b3025fa6552e53b0a45b7 100644 --- a/ring-android/libringclient/src/main/java/cx/ring/services/HardwareService.java +++ b/ring-android/libringclient/src/main/java/cx/ring/services/HardwareService.java @@ -161,6 +161,8 @@ public abstract class HardwareService { public abstract boolean shouldPlaySpeaker(); + public abstract void unregisterCameraDetectionCallback(); + public void connectivityChanged(boolean isConnected) { Log.i(TAG, "connectivityChange() " + isConnected); connectivityEvents.onNext(isConnected);