diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/Preview.kt b/app/src/main/kotlin/com/simplemobiletools/camera/Preview.kt index 31029940..bc19cae6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/Preview.kt +++ b/app/src/main/kotlin/com/simplemobiletools/camera/Preview.kt @@ -12,16 +12,21 @@ import android.net.Uri import android.os.Environment import android.os.Handler import android.util.Log -import android.view.* +import android.view.ScaleGestureDetector +import android.view.SurfaceHolder +import android.view.SurfaceView +import android.view.ViewGroup import com.simplemobiletools.camera.activities.MainActivity -import com.simplemobiletools.commons.extensions.scanPaths +import com.simplemobiletools.camera.extensions.config +import com.simplemobiletools.commons.extensions.needsStupidWritePermissions +import com.simplemobiletools.commons.extensions.scanPath import com.simplemobiletools.commons.extensions.toast import java.io.File import java.io.IOException import java.io.Serializable import java.util.* -class Preview : ViewGroup, SurfaceHolder.Callback, View.OnTouchListener, View.OnClickListener, MediaScannerConnection.OnScanCompletedListener { +class Preview : ViewGroup, SurfaceHolder.Callback, MediaScannerConnection.OnScanCompletedListener { companion object { val PHOTO_PREVIEW_LENGTH = 1000 private val TAG = Preview::class.java.simpleName @@ -32,31 +37,31 @@ class Preview : ViewGroup, SurfaceHolder.Callback, View.OnTouchListener, View.On lateinit var mActivity: MainActivity lateinit var mCallback: PreviewListener lateinit var mScreenSize: Point + lateinit var config: Config private var mCamera: Camera? = null private var mSupportedPreviewSizes: List? = null private var mPreviewSize: Camera.Size? = null private var mParameters: Camera.Parameters? = null private var mRecorder: MediaRecorder? = null - private var mCurrVideoPath: String? = null private var mTargetUri: Uri? = null private var mScaleGestureDetector: ScaleGestureDetector? = null private var mZoomRatios: List? = null - private var mConfig: Config? = null - private var mCanTakePicture: Boolean = false - private var mIsFlashEnabled: Boolean = false - private var mIsRecording: Boolean = false - private var mIsVideoMode: Boolean = false - private var mIsSurfaceCreated: Boolean = false - private var mSwitchToVideoAsap: Boolean = false - private var mSetupPreviewAfterMeasure: Boolean = false - private val mForceAspectRatio: Boolean = false - private var mWasZooming: Boolean = false - private var mLastClickX: Int = 0 - private var mLastClickY: Int = 0 - private var mInitVideoRotation: Int = 0 - private var mCurrCameraId: Int = 0 - private var mMaxZoom: Int = 0 + private var mCurrVideoPath = "" + private var mCanTakePicture = false + private var mIsFlashEnabled = false + private var mIsRecording = false + private var mIsVideoMode = false + private var mIsSurfaceCreated = false + private var mSwitchToVideoAsap = false + private var mSetupPreviewAfterMeasure = false + private val mForceAspectRatio = false + private var mWasZooming = false + private var mLastClickX = 0 + private var mLastClickY = 0 + private var mInitVideoRotation = 0 + private var mCurrCameraId = 0 + private var mMaxZoom = 0 } constructor(context: Context) : super(context) @@ -69,15 +74,31 @@ class Preview : ViewGroup, SurfaceHolder.Callback, View.OnTouchListener, View.On mSurfaceHolder.addCallback(this) mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS) mCanTakePicture = false - mSurfaceView.setOnTouchListener(this) - mSurfaceView.setOnClickListener(this) mIsFlashEnabled = false mIsVideoMode = false mIsSurfaceCreated = false mSetupPreviewAfterMeasure = false mCurrVideoPath = "" - mScreenSize = Utils.getScreenSize(mActivity) + config = activity.config + mScreenSize = Utils.getScreenSize(activity) initGestureDetector() + + mSurfaceView.setOnTouchListener { view, event -> + mLastClickX = event.x.toInt() + mLastClickY = event.y.toInt() + + if (mMaxZoom > 0) + mScaleGestureDetector!!.onTouchEvent(event) + false + } + + mSurfaceView.setOnClickListener { + if (!mWasZooming) + focusArea(false) + + mWasZooming = false + mSurfaceView.isSoundEffectsEnabled = true + } } fun trySwitchToVideo() { @@ -95,7 +116,7 @@ class Preview : ViewGroup, SurfaceHolder.Callback, View.OnTouchListener, View.On newCamera = Camera.open(cameraId) mCallback.setIsCameraAvailable(true) } catch (e: Exception) { - Utils.showToast(mActivity, R.string.camera_open_error) + mActivity.toast(R.string.camera_open_error) Log.e(TAG, "setCamera open " + e.message) mCallback.setIsCameraAvailable(false) return false @@ -132,7 +153,6 @@ class Preview : ViewGroup, SurfaceHolder.Callback, View.OnTouchListener, View.On Log.e(TAG, "setCamera setPreviewDisplay " + e.message) return false } - } mCallback.setFlashAvailable(Utils.hasFlash(mCamera)) @@ -207,7 +227,7 @@ class Preview : ViewGroup, SurfaceHolder.Callback, View.OnTouchListener, View.On mParameters.setPictureSize(maxSize.width, maxSize.height);*/ mParameters!!.setRotation(rotation % 360) - if (mConfig!!.isSoundEnabled) { + if (config.isSoundEnabled) { val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager val volume = audioManager.getStreamVolume(AudioManager.STREAM_SYSTEM) if (volume != 0) { @@ -227,7 +247,7 @@ class Preview : ViewGroup, SurfaceHolder.Callback, View.OnTouchListener, View.On } private val takePictureCallback = Camera.PictureCallback { data, cam -> - if (mConfig!!.isShowPreviewEnabled) { + if (config.isShowPreviewEnabled) { Handler().postDelayed({ resumePreview() }, PHOTO_PREVIEW_LENGTH.toLong()) } else { resumePreview() @@ -237,21 +257,17 @@ class Preview : ViewGroup, SurfaceHolder.Callback, View.OnTouchListener, View.On } private fun resumePreview() { - if (mCamera != null) { - mCamera!!.startPreview() - } - + mCamera?.startPreview() mCanTakePicture = true } - val supportedVideoSizes: List - get() { - if (mParameters!!.supportedVideoSizes != null) { - return mParameters!!.supportedVideoSizes - } else { - return mParameters!!.supportedPreviewSizes - } + fun getSupportedVideoSizes(): List { + return if (mParameters!!.supportedVideoSizes != null) { + mParameters!!.supportedVideoSizes + } else { + mParameters!!.supportedPreviewSizes } + } private fun focusArea(takePictureAfter: Boolean) { if (mCamera == null) @@ -297,22 +313,16 @@ class Preview : ViewGroup, SurfaceHolder.Callback, View.OnTouchListener, View.On fun releaseCamera() { stopRecording() - - if (mCamera != null) { - mCamera!!.stopPreview() - mCamera!!.release() - mCamera = null - } - + mCamera?.stopPreview() + mCamera?.release() + mCamera = null cleanupRecorder() } override fun surfaceCreated(holder: SurfaceHolder) { mIsSurfaceCreated = true try { - if (mCamera != null) { - mCamera!!.setPreviewDisplay(mSurfaceHolder) - } + mCamera?.setPreviewDisplay(mSurfaceHolder) if (mSwitchToVideoAsap) initRecorder() @@ -332,10 +342,7 @@ class Preview : ViewGroup, SurfaceHolder.Callback, View.OnTouchListener, View.On override fun surfaceDestroyed(holder: SurfaceHolder) { mIsSurfaceCreated = false - if (mCamera != null) { - mCamera!!.stopPreview() - } - + mCamera?.stopPreview() cleanupRecorder() } @@ -414,23 +421,12 @@ class Preview : ViewGroup, SurfaceHolder.Callback, View.OnTouchListener, View.On if (mSetupPreviewAfterMeasure) { mSetupPreviewAfterMeasure = false - if (mCamera != null) - mCamera!!.stopPreview() - + mCamera?.stopPreview() setupPreview() } } } - override fun onTouch(v: View, event: MotionEvent): Boolean { - mLastClickX = event.x.toInt() - mLastClickY = event.y.toInt() - - if (mMaxZoom > 0) - mScaleGestureDetector!!.onTouchEvent(event) - return false - } - fun enableFlash() { mParameters!!.flashMode = Camera.Parameters.FLASH_MODE_TORCH mCamera!!.parameters = mParameters @@ -481,7 +477,7 @@ class Preview : ViewGroup, SurfaceHolder.Callback, View.OnTouchListener, View.On mRecorder!!.setAudioSource(MediaRecorder.AudioSource.DEFAULT) mCurrVideoPath = Utils.getOutputMediaFile(mActivity, false) - if (mCurrVideoPath!!.isEmpty()) { + if (mCurrVideoPath.isEmpty()) { mActivity.toast(R.string.video_creating_error) return false } @@ -492,10 +488,10 @@ class Preview : ViewGroup, SurfaceHolder.Callback, View.OnTouchListener, View.On cpHigh.videoFrameHeight = videoSize.height; mRecorder.setProfile(cpHigh);*/ - if (Utils.needsStupidWritePermissions(context, mCurrVideoPath!!)) { - if (mConfig!!.treeUri.isEmpty()) { + if (mActivity.needsStupidWritePermissions(mCurrVideoPath)) { + if (config.treeUri.isEmpty()) { mActivity.toast(R.string.save_error_internal_storage) - mConfig!!.savePhotosFolder = Environment.getExternalStorageDirectory().toString() + config.savePhotosFolder = Environment.getExternalStorageDirectory().toString() releaseCamera() return false } @@ -569,11 +565,10 @@ class Preview : ViewGroup, SurfaceHolder.Callback, View.OnTouchListener, View.On try { toggleShutterSound(true) mRecorder!!.stop() - val paths = arrayListOf(mCurrVideoPath!!) - mActivity.scanPaths(paths) {} + mActivity.scanPath(mCurrVideoPath) {} } catch (e: RuntimeException) { toggleShutterSound(false) - File(mCurrVideoPath!!).delete() + File(mCurrVideoPath).delete() mActivity.toast(R.string.video_saving_error) Log.e(TAG, "stopRecording " + e.message) mRecorder = null @@ -586,26 +581,18 @@ class Preview : ViewGroup, SurfaceHolder.Callback, View.OnTouchListener, View.On mRecorder = null mIsRecording = false - val file = File(mCurrVideoPath!!) + val file = File(mCurrVideoPath) if (file.exists() && file.length() == 0L) { file.delete() } } private fun toggleShutterSound(mute: Boolean?) { - if (!mConfig!!.isSoundEnabled) { + if (!config.isSoundEnabled) { (mActivity.getSystemService(Context.AUDIO_SERVICE) as AudioManager).setStreamMute(AudioManager.STREAM_SYSTEM, mute!!) } } - override fun onClick(v: View) { - if (!mWasZooming) - focusArea(false) - - mWasZooming = false - mSurfaceView.isSoundEffectsEnabled = true - } - override fun onScanCompleted(path: String, uri: Uri) { mCallback.videoSaved(uri) toggleShutterSound(false) diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/Utils.kt b/app/src/main/kotlin/com/simplemobiletools/camera/Utils.kt index f0a2caca..5aaf5584 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/Utils.kt +++ b/app/src/main/kotlin/com/simplemobiletools/camera/Utils.kt @@ -9,8 +9,6 @@ import android.graphics.Point import android.hardware.Camera import android.support.v4.content.ContextCompat import android.view.Surface -import com.simplemobiletools.commons.extensions.getFileDocument -import com.simplemobiletools.commons.extensions.needsStupidWritePermissions import com.simplemobiletools.commons.extensions.toast import java.io.File import java.text.SimpleDateFormat @@ -102,10 +100,6 @@ class Utils { fun hasAudioPermission(cxt: Context) = ContextCompat.checkSelfPermission(cxt, Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED - fun needsStupidWritePermissions(context: Context, path: String) = context.needsStupidWritePermissions(path) - - fun getFileDocument(context: Context, path: String, treeUri: String) = context.getFileDocument(path, treeUri) - fun getRotationDegrees(activity: Activity): Int { return when (activity.windowManager.defaultDisplay.rotation) { Surface.ROTATION_0 -> 0