create an interface for some shared Preview functions

This commit is contained in:
tibbi
2018-05-28 19:30:31 +02:00
parent 3bc54c2e5f
commit 0d71a4492b
3 changed files with 71 additions and 28 deletions

View File

@ -20,6 +20,7 @@ import com.simplemobiletools.camera.extensions.getMyCamera
import com.simplemobiletools.camera.extensions.navBarHeight import com.simplemobiletools.camera.extensions.navBarHeight
import com.simplemobiletools.camera.helpers.* import com.simplemobiletools.camera.helpers.*
import com.simplemobiletools.camera.interfaces.MyCamera import com.simplemobiletools.camera.interfaces.MyCamera
import com.simplemobiletools.camera.interfaces.MyPreview
import com.simplemobiletools.camera.views.FocusCircleView import com.simplemobiletools.camera.views.FocusCircleView
import com.simplemobiletools.camera.views.PreviewCameraOne import com.simplemobiletools.camera.views.PreviewCameraOne
import com.simplemobiletools.camera.views.PreviewCameraOne.PreviewListener import com.simplemobiletools.camera.views.PreviewCameraOne.PreviewListener
@ -37,7 +38,7 @@ class MainActivity : SimpleActivity(), PreviewListener, PhotoProcessor.MediaSave
private lateinit var mFadeHandler: Handler private lateinit var mFadeHandler: Handler
private lateinit var mCameraImpl: MyCamera private lateinit var mCameraImpl: MyCamera
private var mPreview: PreviewCameraOne? = null private var mPreview: MyPreview? = null
private var mPreviewUri: Uri? = null private var mPreviewUri: Uri? = null
private var mIsInPhotoMode = false private var mIsInPhotoMode = false
private var mIsCameraAvailable = false private var mIsCameraAvailable = false
@ -190,7 +191,7 @@ class MainActivity : SimpleActivity(), PreviewListener, PhotoProcessor.MediaSave
(btn_holder.layoutParams as RelativeLayout.LayoutParams).setMargins(0, 0, 0, (navBarHeight + resources.getDimension(R.dimen.activity_margin)).toInt()) (btn_holder.layoutParams as RelativeLayout.LayoutParams).setMargins(0, 0, 0, (navBarHeight + resources.getDimension(R.dimen.activity_margin)).toInt())
mPreview = PreviewCameraOne(this, camera_surface_view, this) mPreview = PreviewCameraOne(this, camera_surface_view, this)
view_holder.addView(mPreview) view_holder.addView(mPreview as ViewGroup)
val imageDrawable = if (config.lastUsedCamera == mCameraImpl.getBackCameraId()) R.drawable.ic_camera_front else R.drawable.ic_camera_rear val imageDrawable = if (config.lastUsedCamera == mCameraImpl.getBackCameraId()) R.drawable.ic_camera_front else R.drawable.ic_camera_rear
toggle_camera.setImageResource(imageDrawable) toggle_camera.setImageResource(imageDrawable)
@ -312,7 +313,7 @@ class MainActivity : SimpleActivity(), PreviewListener, PhotoProcessor.MediaSave
} }
if (mIsVideoCaptureIntent) { if (mIsVideoCaptureIntent) {
mPreview?.trySwitchToVideo() mPreview?.tryInitVideoMode()
} }
mPreview?.setFlashlightState(FLASH_OFF) mPreview?.setFlashlightState(FLASH_OFF)
@ -339,7 +340,7 @@ class MainActivity : SimpleActivity(), PreviewListener, PhotoProcessor.MediaSave
} }
private fun tryInitVideoMode() { private fun tryInitVideoMode() {
if (mPreview?.initRecorder() == true) { if (mPreview?.initVideoMode() == true) {
initVideoButtons() initVideoButtons()
} else { } else {
if (!mIsVideoCaptureIntent) { if (!mIsVideoCaptureIntent) {
@ -443,7 +444,7 @@ class MainActivity : SimpleActivity(), PreviewListener, PhotoProcessor.MediaSave
private fun resumeCameraItems() { private fun resumeCameraItems() {
showToggleCameraIfNeeded() showToggleCameraIfNeeded()
if (mPreview?.setCamera() == true) { if (mPreview?.resumeCamera() == true) {
hideNavigationBarIcons() hideNavigationBarIcons()
mPreview?.checkFlashlight() mPreview?.checkFlashlight()

View File

@ -0,0 +1,39 @@
package com.simplemobiletools.camera.interfaces
import android.net.Uri
interface MyPreview {
fun setTargetUri(uri: Uri)
fun setIsImageCaptureIntent(isImageCaptureIntent: Boolean)
fun setFlashlightState(state: Int)
fun setCamera(cameraId: Int): Boolean
fun getCameraState(): Int
fun releaseCamera()
fun showChangeResolutionDialog()
fun toggleFrontBackCamera()
fun toggleFlashlight()
fun tryTakePicture()
fun toggleRecording(): Boolean
fun tryInitVideoMode()
fun initPhotoMode()
fun initVideoMode(): Boolean
fun checkFlashlight()
fun deviceOrientationChanged()
fun resumeCamera(): Boolean
}

View File

@ -25,13 +25,14 @@ import com.simplemobiletools.camera.dialogs.ChangeResolutionDialog
import com.simplemobiletools.camera.extensions.* import com.simplemobiletools.camera.extensions.*
import com.simplemobiletools.camera.helpers.* import com.simplemobiletools.camera.helpers.*
import com.simplemobiletools.camera.implementations.MyCameraOneImpl import com.simplemobiletools.camera.implementations.MyCameraOneImpl
import com.simplemobiletools.camera.interfaces.MyPreview
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.isJellyBean1Plus import com.simplemobiletools.commons.helpers.isJellyBean1Plus
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
import java.util.* import java.util.*
class PreviewCameraOne : ViewGroup, SurfaceHolder.Callback { class PreviewCameraOne : ViewGroup, SurfaceHolder.Callback, MyPreview {
private val FOCUS_AREA_SIZE = 100 private val FOCUS_AREA_SIZE = 100
private val PHOTO_PREVIEW_LENGTH = 500L private val PHOTO_PREVIEW_LENGTH = 500L
private val REFOCUS_PERIOD = 3000L private val REFOCUS_PERIOD = 3000L
@ -112,15 +113,17 @@ class PreviewCameraOne : ViewGroup, SurfaceHolder.Callback {
} }
} }
fun trySwitchToVideo() { override fun tryInitVideoMode() {
if (mIsSurfaceCreated) { if (mIsSurfaceCreated) {
initRecorder() initVideoMode()
} else { } else {
mSwitchToVideoAsap = true mSwitchToVideoAsap = true
} }
} }
fun setCamera(cameraId: Int = mCurrCameraId): Boolean { override fun resumeCamera() = setCamera(mCurrCameraId)
override fun setCamera(cameraId: Int): Boolean {
mCurrCameraId = cameraId mCurrCameraId = cameraId
val newCamera: Camera val newCamera: Camera
try { try {
@ -139,7 +142,7 @@ class PreviewCameraOne : ViewGroup, SurfaceHolder.Callback {
releaseCamera() releaseCamera()
mCamera = newCamera mCamera = newCamera
if (initCamera() && mIsInVideoMode) { if (initCamera() && mIsInVideoMode) {
initRecorder() initVideoMode()
} }
if (!mWasCameraPreviewSet && mIsSurfaceCreated) { if (!mWasCameraPreviewSet && mIsSurfaceCreated) {
@ -189,7 +192,7 @@ class PreviewCameraOne : ViewGroup, SurfaceHolder.Callback {
return true return true
} }
fun toggleFrontBackCamera() { override fun toggleFrontBackCamera() {
mCurrCameraId = if (mCurrCameraId == mCameraImpl!!.getBackCameraId()) { mCurrCameraId = if (mCurrCameraId == mCameraImpl!!.getBackCameraId()) {
mCameraImpl!!.getFrontCameraId() mCameraImpl!!.getFrontCameraId()
} else { } else {
@ -207,7 +210,7 @@ class PreviewCameraOne : ViewGroup, SurfaceHolder.Callback {
} }
} }
fun getCameraState() = mCameraState override fun getCameraState() = mCameraState
private fun refreshPreview() { private fun refreshPreview() {
mIsSixteenToNine = getSelectedResolution().isSixteenToNine() mIsSixteenToNine = getSelectedResolution().isSixteenToNine()
@ -304,7 +307,7 @@ class PreviewCameraOne : ViewGroup, SurfaceHolder.Callback {
}) })
} }
fun tryTakePicture() { override fun tryTakePicture() {
if (mConfig.focusBeforeCapture) { if (mConfig.focusBeforeCapture) {
focusArea(true) focusArea(true)
} else { } else {
@ -483,7 +486,7 @@ class PreviewCameraOne : ViewGroup, SurfaceHolder.Callback {
}, REFOCUS_PERIOD) }, REFOCUS_PERIOD)
} }
fun showChangeResolutionDialog() { override fun showChangeResolutionDialog() {
if (mCamera != null) { if (mCamera != null) {
val oldResolution = getSelectedResolution() val oldResolution = getSelectedResolution()
ChangeResolutionDialog(mActivity!!, mConfig, mCamera!!) { ChangeResolutionDialog(mActivity!!, mConfig, mCamera!!) {
@ -494,7 +497,7 @@ class PreviewCameraOne : ViewGroup, SurfaceHolder.Callback {
} }
} }
fun releaseCamera() { override fun releaseCamera() {
stopRecording() stopRecording()
mCamera?.stopPreview() mCamera?.stopPreview()
mCamera?.release() mCamera?.release()
@ -509,7 +512,7 @@ class PreviewCameraOne : ViewGroup, SurfaceHolder.Callback {
mCamera?.setPreviewDisplay(mSurfaceHolder) mCamera?.setPreviewDisplay(mSurfaceHolder)
if (mSwitchToVideoAsap) if (mSwitchToVideoAsap)
initRecorder() initVideoMode()
} catch (e: IOException) { } catch (e: IOException) {
mActivity!!.showErrorToast(e) mActivity!!.showErrorToast(e)
} }
@ -519,7 +522,7 @@ class PreviewCameraOne : ViewGroup, SurfaceHolder.Callback {
mIsSurfaceCreated = true mIsSurfaceCreated = true
if (mIsInVideoMode) { if (mIsInVideoMode) {
initRecorder() initVideoMode()
} }
} }
@ -617,17 +620,17 @@ class PreviewCameraOne : ViewGroup, SurfaceHolder.Callback {
} }
} }
fun setFlashlightState(state: Int) { override fun setFlashlightState(state: Int) {
mFlashlightState = state mFlashlightState = state
checkFlashlight() checkFlashlight()
} }
fun toggleFlashlight() { override fun toggleFlashlight() {
val newState = ++mFlashlightState % if (!mIsInVideoMode) 3 else 2 val newState = ++mFlashlightState % if (!mIsInVideoMode) 3 else 2
setFlashlightState(newState) setFlashlightState(newState)
} }
fun checkFlashlight() { override fun checkFlashlight() {
when (mFlashlightState) { when (mFlashlightState) {
FLASH_OFF -> disableFlash() FLASH_OFF -> disableFlash()
FLASH_ON -> enableFlash() FLASH_ON -> enableFlash()
@ -660,7 +663,7 @@ class PreviewCameraOne : ViewGroup, SurfaceHolder.Callback {
}, 1000) }, 1000)
} }
fun initPhotoMode() { override fun initPhotoMode() {
stopRecording() stopRecording()
cleanupRecorder() cleanupRecorder()
mIsRecording = false mIsRecording = false
@ -669,7 +672,7 @@ class PreviewCameraOne : ViewGroup, SurfaceHolder.Callback {
} }
// VIDEO RECORDING // VIDEO RECORDING
fun initRecorder(): Boolean { override fun initVideoMode(): Boolean {
if (mCamera == null || mRecorder != null || !mIsSurfaceCreated) { if (mCamera == null || mRecorder != null || !mIsSurfaceCreated) {
return false return false
} }
@ -773,18 +776,18 @@ class PreviewCameraOne : ViewGroup, SurfaceHolder.Callback {
} }
} }
fun setTargetUri(uri: Uri) { override fun setTargetUri(uri: Uri) {
mTargetUri = uri mTargetUri = uri
} }
fun setIsImageCaptureIntent(isImageCaptureIntent: Boolean) { override fun setIsImageCaptureIntent(isImageCaptureIntent: Boolean) {
mIsImageCaptureIntent = isImageCaptureIntent mIsImageCaptureIntent = isImageCaptureIntent
} }
fun toggleRecording(): Boolean { override fun toggleRecording(): Boolean {
if (mIsRecording) { if (mIsRecording) {
stopRecording() stopRecording()
initRecorder() initVideoMode()
} else { } else {
startRecording() startRecording()
} }
@ -797,10 +800,10 @@ class PreviewCameraOne : ViewGroup, SurfaceHolder.Callback {
return (deviceRot + previewRot) % 360 return (deviceRot + previewRot) % 360
} }
fun deviceOrientationChanged() { override fun deviceOrientationChanged() {
if (mIsInVideoMode && !mIsRecording) { if (mIsInVideoMode && !mIsRecording) {
mRecorder = null mRecorder = null
initRecorder() initVideoMode()
} }
} }