Skip to content

Commit d7c3630

Browse files
author
izaak
committed
Move to a mode for toggling portrait
1 parent 72d86c0 commit d7c3630

File tree

5 files changed

+27
-24
lines changed

5 files changed

+27
-24
lines changed

app/src/main/java/co/stonephone/stonecamera/StoneCameraApp.kt

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ package co.stonephone.stonecamera
55

66
import android.annotation.SuppressLint
77
import android.graphics.Rect
8-
import android.util.Log
98
import androidx.annotation.OptIn
109
import androidx.camera.camera2.interop.ExperimentalCamera2Interop
1110
import androidx.camera.lifecycle.ProcessCameraProvider
@@ -21,16 +20,10 @@ import androidx.compose.foundation.layout.fillMaxWidth
2120
import androidx.compose.foundation.layout.height
2221
import androidx.compose.foundation.layout.offset
2322
import androidx.compose.foundation.layout.padding
24-
import androidx.compose.foundation.layout.size
2523
import androidx.compose.foundation.layout.systemBars
2624
import androidx.compose.foundation.layout.width
2725
import androidx.compose.foundation.layout.windowInsetsPadding
28-
import androidx.compose.foundation.shape.CircleShape
29-
import androidx.compose.material.icons.Icons
30-
import androidx.compose.material.icons.filled.FlipCameraAndroid
3126
import androidx.compose.material3.ExperimentalMaterial3Api
32-
import androidx.compose.material3.Icon
33-
import androidx.compose.material3.IconButton
3427
import androidx.compose.material3.MaterialTheme
3528
import androidx.compose.material3.Text
3629
import androidx.compose.runtime.Composable
@@ -58,8 +51,8 @@ import co.stonephone.stonecamera.plugins.SettingLocation
5851
import co.stonephone.stonecamera.plugins.SettingsTrayPlugin
5952
import co.stonephone.stonecamera.plugins.ShutterFlashPlugin
6053
import co.stonephone.stonecamera.plugins.TapToFocusPlugin
61-
import co.stonephone.stonecamera.plugins.VolumeControlsPlugin
6254
import co.stonephone.stonecamera.plugins.VideoModePlugin
55+
import co.stonephone.stonecamera.plugins.VolumeControlsPlugin
6356
import co.stonephone.stonecamera.plugins.ZoomBarPlugin
6457
import co.stonephone.stonecamera.plugins.ZoomBasePlugin
6558
import co.stonephone.stonecamera.ui.RenderPluginSetting
@@ -71,7 +64,6 @@ import co.stonephone.stonecamera.utils.getAllCamerasInfo
7164
// Order here is important, they are loaded and initialised in the order they are listed
7265
// ZoomBar depends on ZoomBase, etc.
7366
val PLUGINS = listOf(
74-
PortraitModePlugin(),
7567
QRScannerPlugin(),
7668
ZoomBasePlugin(),
7769
ZoomBarPlugin(),
@@ -83,6 +75,7 @@ val PLUGINS = listOf(
8375
ShutterFlashPlugin(),
8476
VolumeControlsPlugin(),
8577
PhotoModePlugin(),
78+
PortraitModePlugin(),
8679
VideoModePlugin(),
8780
SettingsTrayPlugin()
8881
// DebugPlugin()

app/src/main/java/co/stonephone/stonecamera/StoneCameraViewModel.kt

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,23 @@ import android.net.Uri
1111
import android.util.Log
1212
import android.view.MotionEvent
1313
import androidx.annotation.OptIn
14-
import androidx.camera.core.*
14+
import androidx.camera.core.Camera
15+
import androidx.camera.core.CameraSelector
16+
import androidx.camera.core.ExperimentalGetImage
17+
import androidx.camera.core.ImageAnalysis
18+
import androidx.camera.core.ImageCapture
19+
import androidx.camera.core.Preview
1520
import androidx.camera.lifecycle.ProcessCameraProvider
1621
import androidx.camera.video.Quality
1722
import androidx.camera.video.QualitySelector
1823
import androidx.camera.video.Recorder
1924
import androidx.camera.video.Recording
2025
import androidx.camera.video.VideoCapture
2126
import androidx.camera.view.PreviewView
22-
import androidx.compose.runtime.*
27+
import androidx.compose.runtime.getValue
28+
import androidx.compose.runtime.mutableStateMapOf
29+
import androidx.compose.runtime.mutableStateOf
30+
import androidx.compose.runtime.setValue
2331
import androidx.compose.runtime.snapshots.SnapshotStateMap
2432
import androidx.lifecycle.LifecycleOwner
2533
import androidx.lifecycle.ViewModel
@@ -139,7 +147,6 @@ class StoneCameraViewModel(
139147
recreateUseCases()
140148
}
141149

142-
143150
//--------------------------------------------------------------------------------
144151
// Public methods to manipulate the above states
145152
//--------------------------------------------------------------------------------

app/src/main/java/co/stonephone/stonecamera/plugins/IPlugin.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import kotlinx.coroutines.CompletableDeferred
1212

1313
// PluginUseCase Enum ("photo", "analysis", "video")
1414
enum class PluginUseCase {
15-
PHOTO, PORTRAIT, ANALYSIS, VIDEO
15+
PHOTO, ANALYSIS, VIDEO
1616
}
1717

1818
// Plugin interface definition

app/src/main/java/co/stonephone/stonecamera/plugins/PhotoMode.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,15 @@ import androidx.compose.ui.unit.dp
2323
import co.stonephone.stonecamera.StoneCameraViewModel
2424
import co.stonephone.stonecamera.ui.ResponsiveOrientation
2525

26-
class PhotoModePlugin : IPlugin {
26+
open class PhotoModePlugin : IPlugin {
2727
override val id: String = "photoMode"
2828
override val name: String = "Photo Mode"
2929

3030
private lateinit var viewModel: StoneCameraViewModel
3131

3232
// Should Analysis be added by QRScanner instead? Probably doesn't matter for now
3333
override val modeUseCases: List<PluginUseCase>
34-
get() = listOf(PluginUseCase.PHOTO, PluginUseCase.PORTRAIT, PluginUseCase.ANALYSIS, PluginUseCase.VIDEO)
34+
get() = listOf(PluginUseCase.PHOTO, PluginUseCase.ANALYSIS, PluginUseCase.VIDEO)
3535

3636
override val modeLabel
3737
get() = "photo"

app/src/main/java/co/stonephone/stonecamera/plugins/Portrait.kt renamed to app/src/main/java/co/stonephone/stonecamera/plugins/PortraitMode.kt

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ import android.content.ContentResolver
44
import android.graphics.Bitmap
55
import android.graphics.BitmapFactory
66
import android.graphics.Matrix
7-
import android.media.ExifInterface
87
import android.net.Uri
98
import android.util.Log
109
import androidx.camera.core.ImageCapture
10+
import androidx.exifinterface.media.ExifInterface
1111
import co.stonephone.stonecamera.MyApplication
1212
import co.stonephone.stonecamera.StoneCameraViewModel
1313
import com.google.mediapipe.framework.image.BitmapImageBuilder
@@ -21,17 +21,20 @@ import kotlinx.coroutines.CoroutineScope
2121
import kotlinx.coroutines.Dispatchers
2222
import kotlinx.coroutines.launch
2323
import java.nio.ByteBuffer
24-
import java.util.Objects
2524
import kotlin.math.max
2625
import kotlin.math.min
2726

28-
class PortraitModePlugin : IPlugin {
29-
override val id: String = "portraitModePlugin"
27+
class PortraitModePlugin : PhotoModePlugin() {
28+
override val id: String = "portraitMode"
3029
override val name: String = "Portrait Mode"
3130

3231
private val logTag: String = "PortraitMode"
3332

34-
private var imagesegmenter: ImageSegmenter? = null
33+
override val modeLabel
34+
get() = "portrait"
35+
36+
private var imageSegmenter: ImageSegmenter? = null
37+
private lateinit var viewModel: StoneCameraViewModel
3538

3639
init {
3740
setupImageSegmenter()
@@ -45,9 +48,9 @@ class PortraitModePlugin : IPlugin {
4548
stoneCameraViewModel: StoneCameraViewModel,
4649
outputFileResults: ImageCapture.OutputFileResults
4750
) {
48-
val portraitModeSetting = stoneCameraViewModel.getSetting<String>("portraitMode") ?: "OFF"
4951

50-
if (Objects.equals(portraitModeSetting, "OFF")) {
52+
//TODO: This kind of check should probably be built into the plugin interface, something reusable
53+
if (viewModel.selectedMode == modeLabel) {
5154
return
5255
}
5356

@@ -60,7 +63,7 @@ class PortraitModePlugin : IPlugin {
6063
val rotation: Int = getOriginalImageRotation(contentResolver, originalImageUri)
6164

6265
val segmentationResults: ImageSegmenterResult =
63-
imagesegmenter?.segment(BitmapImageBuilder(originalImage).build())
66+
imageSegmenter?.segment(BitmapImageBuilder(originalImage).build())
6467
?: return@launch
6568

6669
// TODO try and use the confidence mask. Will give floats in range 0 => 1. Apply blur on a percent of the confidence.
@@ -278,7 +281,7 @@ class PortraitModePlugin : IPlugin {
278281
.setOutputConfidenceMasks(true)
279282

280283
val options = optionsBuilder.build()
281-
imagesegmenter = ImageSegmenter.createFromOptions(MyApplication.getAppContext(), options)
284+
imageSegmenter = ImageSegmenter.createFromOptions(MyApplication.getAppContext(), options)
282285
} catch (e: IllegalStateException) {
283286
Log.e(logTag, "Image segmenter failed to load model with error: " + e.message)
284287
} catch (e: RuntimeException) {

0 commit comments

Comments
 (0)