From 93f68952f8bdbad50bbc34eedc77f0f8088d1148 Mon Sep 17 00:00:00 2001 From: Kyle Corry Date: Tue, 31 Oct 2023 17:09:22 -0400 Subject: [PATCH] Add toggle for camera on AR view --- .../trail_sense/shared/views/CameraView.kt | 10 +++++- .../tools/augmented_reality/ARBeaconLayer.kt | 2 +- .../AugmentedRealityFragment.kt | 35 ++++++++++++++++--- .../augmented_reality/AugmentedRealityView.kt | 5 +-- app/src/main/res/drawable/ic_camera_off.xml | 10 ++++++ .../res/layout/fragment_augmented_reality.xml | 14 +++++++- 6 files changed, 67 insertions(+), 9 deletions(-) create mode 100644 app/src/main/res/drawable/ic_camera_off.xml diff --git a/app/src/main/java/com/kylecorry/trail_sense/shared/views/CameraView.kt b/app/src/main/java/com/kylecorry/trail_sense/shared/views/CameraView.kt index ebe12b164..37c064951 100644 --- a/app/src/main/java/com/kylecorry/trail_sense/shared/views/CameraView.kt +++ b/app/src/main/java/com/kylecorry/trail_sense/shared/views/CameraView.kt @@ -13,6 +13,7 @@ import android.widget.FrameLayout import android.widget.ImageButton import android.widget.SeekBar import androidx.camera.view.PreviewView +import androidx.core.view.drawToBitmap import androidx.core.view.isVisible import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner @@ -34,10 +35,14 @@ class CameraView(context: Context, attrs: AttributeSet?) : FrameLayout(context, var camera: ICamera? = null + private var lastFov: Pair? = null + val fov: Pair get() { val defaultFOV = 45f - return camera?.getZoomedFOV() ?: (defaultFOV to defaultFOV) + val fieldOfView = camera?.getZoomedFOV() ?: lastFov ?: (defaultFOV to defaultFOV * 4f / 3f) + lastFov = fieldOfView + return fieldOfView } private val preview: PreviewView @@ -85,6 +90,8 @@ class CameraView(context: Context, attrs: AttributeSet?) : FrameLayout(context, isStarted = true } + alpha = 1f + camera?.stop(this::onCameraUpdate) imageListener = onImage camera = Camera( @@ -103,6 +110,7 @@ class CameraView(context: Context, attrs: AttributeSet?) : FrameLayout(context, fun stop() { camera?.stop(this::onCameraUpdate) camera = null + alpha = 0f synchronized(startLock) { isStarted = false } diff --git a/app/src/main/java/com/kylecorry/trail_sense/tools/augmented_reality/ARBeaconLayer.kt b/app/src/main/java/com/kylecorry/trail_sense/tools/augmented_reality/ARBeaconLayer.kt index d718f4c46..4673b5d24 100644 --- a/app/src/main/java/com/kylecorry/trail_sense/tools/augmented_reality/ARBeaconLayer.kt +++ b/app/src/main/java/com/kylecorry/trail_sense/tools/augmented_reality/ARBeaconLayer.kt @@ -88,7 +88,7 @@ class ARBeaconLayer( it to distance }.sortedByDescending { it.second } - // TODO: Avoid recreating markers every time + // TODO: Avoid recreating markers every time - it will help if this didn't filter nearby beacons // if (!areBeaconsUpToDate) { layer.setMarkers(visible.flatMap { val beacon = it.first diff --git a/app/src/main/java/com/kylecorry/trail_sense/tools/augmented_reality/AugmentedRealityFragment.kt b/app/src/main/java/com/kylecorry/trail_sense/tools/augmented_reality/AugmentedRealityFragment.kt index 0fbc7e07c..a5d69852e 100644 --- a/app/src/main/java/com/kylecorry/trail_sense/tools/augmented_reality/AugmentedRealityFragment.kt +++ b/app/src/main/java/com/kylecorry/trail_sense/tools/augmented_reality/AugmentedRealityFragment.kt @@ -59,6 +59,8 @@ class AugmentedRealityFragment : BoundFragment( private val horizonLayer = ARHorizonLayer() private val northLayer = ARNorthLayer() + private var isCameraEnabled = true + private val compassSyncTimer = CoroutineTimer { binding.linearCompass.azimuth = Bearing(binding.arView.azimuth) } @@ -78,6 +80,14 @@ class AugmentedRealityFragment : BoundFragment( binding.arView.setLayers(listOf(northLayer, horizonLayer, sunLayer, moonLayer, beaconLayer)) + binding.cameraToggle.setOnClickListener { + if (isCameraEnabled) { + stopCamera() + } else { + startCamera() + } + } + scheduleUpdates(INTERVAL_1_FPS) } @@ -85,21 +95,38 @@ class AugmentedRealityFragment : BoundFragment( super.onResume() binding.arView.start() + if (isCameraEnabled) { + startCamera() + } + updateAstronomyLayers() - // TODO: Move this to the AR view + compassSyncTimer.interval(INTERVAL_60_FPS) + } + + // TODO: Move this to the AR view + private fun startCamera() { + isCameraEnabled = true + binding.cameraToggle.setImageResource(R.drawable.ic_camera) + binding.arView.backgroundFillColor = Color.TRANSPARENT requestCamera { if (it) { binding.camera.start( readFrames = false, shouldStabilizePreview = false ) } else { + isCameraEnabled = false + binding.cameraToggle.setImageResource(R.drawable.ic_camera_off) + binding.arView.backgroundFillColor = Color.BLACK alertNoCameraPermission() } } + } - updateAstronomyLayers() - - compassSyncTimer.interval(INTERVAL_60_FPS) + private fun stopCamera(){ + binding.cameraToggle.setImageResource(R.drawable.ic_camera_off) + isCameraEnabled = false + binding.arView.backgroundFillColor = Color.BLACK + binding.camera.stop() } override fun onPause() { diff --git a/app/src/main/java/com/kylecorry/trail_sense/tools/augmented_reality/AugmentedRealityView.kt b/app/src/main/java/com/kylecorry/trail_sense/tools/augmented_reality/AugmentedRealityView.kt index 5586a3184..708721581 100644 --- a/app/src/main/java/com/kylecorry/trail_sense/tools/augmented_reality/AugmentedRealityView.kt +++ b/app/src/main/java/com/kylecorry/trail_sense/tools/augmented_reality/AugmentedRealityView.kt @@ -33,7 +33,6 @@ import kotlin.math.asin import kotlin.math.atan2 import kotlin.math.cos import kotlin.math.sin -import kotlin.math.sqrt // TODO: Notify location change // TODO: This needs a parent view that has the camera, this, and any buttons (like the freeform button) @@ -51,6 +50,8 @@ class AugmentedRealityView : CanvasView { var focusText: String? = null + var backgroundFillColor: Int = Color.TRANSPARENT + private var orientation = Quaternion.zero private var inverseOrientation = Quaternion.zero @@ -223,7 +224,7 @@ class AugmentedRealityView : CanvasView { override fun draw() { updateOrientation() - clear() + background(backgroundFillColor) layers.forEach { it.draw(this, this) diff --git a/app/src/main/res/drawable/ic_camera_off.xml b/app/src/main/res/drawable/ic_camera_off.xml new file mode 100644 index 000000000..1b6f00929 --- /dev/null +++ b/app/src/main/res/drawable/ic_camera_off.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_augmented_reality.xml b/app/src/main/res/layout/fragment_augmented_reality.xml index f7285e817..d8d63cb17 100644 --- a/app/src/main/res/layout/fragment_augmented_reality.xml +++ b/app/src/main/res/layout/fragment_augmented_reality.xml @@ -1,5 +1,6 @@ @@ -21,12 +22,23 @@ android:layout_height="match_parent" android:layout_gravity="center" /> + + + + android:layout_marginBottom="@dimen/default_bottom_margin" /> \ No newline at end of file