mirror of
https://github.com/SimpleMobileTools/Simple-Camera.git
synced 2025-02-16 11:20:55 +01:00
commit
45e2ba1908
@ -27,6 +27,8 @@ import com.google.android.material.tabs.TabLayout
|
|||||||
import com.simplemobiletools.camera.BuildConfig
|
import com.simplemobiletools.camera.BuildConfig
|
||||||
import com.simplemobiletools.camera.R
|
import com.simplemobiletools.camera.R
|
||||||
import com.simplemobiletools.camera.extensions.config
|
import com.simplemobiletools.camera.extensions.config
|
||||||
|
import com.simplemobiletools.camera.extensions.fadeIn
|
||||||
|
import com.simplemobiletools.camera.extensions.fadeOut
|
||||||
import com.simplemobiletools.camera.extensions.toFlashModeId
|
import com.simplemobiletools.camera.extensions.toFlashModeId
|
||||||
import com.simplemobiletools.camera.helpers.*
|
import com.simplemobiletools.camera.helpers.*
|
||||||
import com.simplemobiletools.camera.implementations.CameraXInitializer
|
import com.simplemobiletools.camera.implementations.CameraXInitializer
|
||||||
@ -37,10 +39,16 @@ import com.simplemobiletools.camera.views.FocusCircleView
|
|||||||
import com.simplemobiletools.commons.extensions.*
|
import com.simplemobiletools.commons.extensions.*
|
||||||
import com.simplemobiletools.commons.helpers.*
|
import com.simplemobiletools.commons.helpers.*
|
||||||
import com.simplemobiletools.commons.models.Release
|
import com.simplemobiletools.commons.models.Release
|
||||||
import kotlinx.android.synthetic.main.activity_main.*
|
|
||||||
import kotlinx.android.synthetic.main.layout_flash.*
|
|
||||||
import kotlinx.android.synthetic.main.layout_top.*
|
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
|
import kotlinx.android.synthetic.main.activity_main.*
|
||||||
|
import kotlinx.android.synthetic.main.layout_flash.flash_auto
|
||||||
|
import kotlinx.android.synthetic.main.layout_flash.flash_off
|
||||||
|
import kotlinx.android.synthetic.main.layout_flash.flash_on
|
||||||
|
import kotlinx.android.synthetic.main.layout_flash.flash_toggle_group
|
||||||
|
import kotlinx.android.synthetic.main.layout_top.change_resolution
|
||||||
|
import kotlinx.android.synthetic.main.layout_top.default_icons
|
||||||
|
import kotlinx.android.synthetic.main.layout_top.settings
|
||||||
|
import kotlinx.android.synthetic.main.layout_top.toggle_flash
|
||||||
|
|
||||||
class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, CameraXPreviewListener {
|
class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, CameraXPreviewListener {
|
||||||
private companion object {
|
private companion object {
|
||||||
@ -74,7 +82,6 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
|
|||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
appLaunched(BuildConfig.APPLICATION_ID)
|
appLaunched(BuildConfig.APPLICATION_ID)
|
||||||
requestWindowFeature(Window.FEATURE_NO_TITLE)
|
requestWindowFeature(Window.FEATURE_NO_TITLE)
|
||||||
WindowCompat.setDecorFitsSystemWindows(window, false)
|
|
||||||
|
|
||||||
initVariables()
|
initVariables()
|
||||||
tryInitCamera()
|
tryInitCamera()
|
||||||
@ -243,9 +250,9 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
|
|||||||
if (isTiramisuPlus()) {
|
if (isTiramisuPlus()) {
|
||||||
handlePermission(PERMISSION_READ_MEDIA_IMAGES) { grantedReadImages ->
|
handlePermission(PERMISSION_READ_MEDIA_IMAGES) { grantedReadImages ->
|
||||||
if (grantedReadImages) {
|
if (grantedReadImages) {
|
||||||
handlePermission(PERMISSION_READ_MEDIA_VIDEO) { grantedReadVideos ->
|
handlePermission(PERMISSION_READ_MEDIA_VIDEO, callback)
|
||||||
callback.invoke(grantedReadVideos)
|
} else {
|
||||||
}
|
callback.invoke(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -290,6 +297,7 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
|
|||||||
defaultScene = Scene(top_options, default_icons)
|
defaultScene = Scene(top_options, default_icons)
|
||||||
flashModeScene = Scene(top_options, flash_toggle_group)
|
flashModeScene = Scene(top_options, flash_toggle_group)
|
||||||
|
|
||||||
|
WindowCompat.setDecorFitsSystemWindows(window, false)
|
||||||
ViewCompat.setOnApplyWindowInsetsListener(view_holder) { _, windowInsets ->
|
ViewCompat.setOnApplyWindowInsetsListener(view_holder) { _, windowInsets ->
|
||||||
val safeInsetBottom = windowInsets.displayCutout?.safeInsetBottom ?: 0
|
val safeInsetBottom = windowInsets.displayCutout?.safeInsetBottom ?: 0
|
||||||
val safeInsetTop = windowInsets.displayCutout?.safeInsetTop ?: 0
|
val safeInsetTop = windowInsets.displayCutout?.safeInsetTop ?: 0
|
||||||
@ -524,11 +532,6 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun showTimer() {
|
|
||||||
video_rec_curr_timer.beVisible()
|
|
||||||
setupTimer()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun hideTimer() {
|
private fun hideTimer() {
|
||||||
video_rec_curr_timer.text = 0.getFormattedDuration()
|
video_rec_curr_timer.text = 0.getFormattedDuration()
|
||||||
video_rec_curr_timer.beGone()
|
video_rec_curr_timer.beGone()
|
||||||
@ -536,15 +539,6 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
|
|||||||
mTimerHandler.removeCallbacksAndMessages(null)
|
mTimerHandler.removeCallbacksAndMessages(null)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setupTimer() {
|
|
||||||
runOnUiThread(object : Runnable {
|
|
||||||
override fun run() {
|
|
||||||
video_rec_curr_timer.text = mCurrVideoRecTimer++.getFormattedDuration()
|
|
||||||
mTimerHandler.postDelayed(this, 1000L)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun resumeCameraItems() {
|
private fun resumeCameraItems() {
|
||||||
if (!mIsInPhotoMode) {
|
if (!mIsInPhotoMode) {
|
||||||
initVideoButtons()
|
initVideoButtons()
|
||||||
@ -557,7 +551,7 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
|
|||||||
|
|
||||||
private fun hasPhotoModePermissions(): Boolean {
|
private fun hasPhotoModePermissions(): Boolean {
|
||||||
return if (isTiramisuPlus()) {
|
return if (isTiramisuPlus()) {
|
||||||
hasPermission(PERMISSION_READ_MEDIA_IMAGES) && hasPermission(PERMISSION_CAMERA)
|
hasPermission(PERMISSION_READ_MEDIA_IMAGES) && hasPermission(PERMISSION_READ_MEDIA_VIDEO) && hasPermission(PERMISSION_CAMERA)
|
||||||
} else {
|
} else {
|
||||||
hasPermission(PERMISSION_WRITE_STORAGE) && hasPermission(PERMISSION_CAMERA)
|
hasPermission(PERMISSION_WRITE_STORAGE) && hasPermission(PERMISSION_CAMERA)
|
||||||
}
|
}
|
||||||
@ -681,21 +675,28 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
|
|||||||
|
|
||||||
override fun onVideoRecordingStarted() {
|
override fun onVideoRecordingStarted() {
|
||||||
camera_mode_tab.beInvisible()
|
camera_mode_tab.beInvisible()
|
||||||
shutter.isSelected = true
|
video_rec_curr_timer.beVisible()
|
||||||
toggle_camera.beInvisible()
|
|
||||||
|
toggle_camera.fadeOut()
|
||||||
|
last_photo_video_preview.fadeOut()
|
||||||
|
|
||||||
change_resolution.isEnabled = false
|
change_resolution.isEnabled = false
|
||||||
settings.isEnabled = false
|
settings.isEnabled = false
|
||||||
video_rec_curr_timer.beVisible()
|
shutter.isSelected = true
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onVideoRecordingStopped() {
|
override fun onVideoRecordingStopped() {
|
||||||
camera_mode_tab.beVisible()
|
camera_mode_tab.beVisible()
|
||||||
shutter.isSelected = false
|
|
||||||
|
toggle_camera.fadeIn()
|
||||||
|
last_photo_video_preview.fadeIn()
|
||||||
|
|
||||||
video_rec_curr_timer.text = 0.getFormattedDuration()
|
video_rec_curr_timer.text = 0.getFormattedDuration()
|
||||||
video_rec_curr_timer.beGone()
|
video_rec_curr_timer.beGone()
|
||||||
|
|
||||||
|
shutter.isSelected = false
|
||||||
change_resolution.isEnabled = true
|
change_resolution.isEnabled = true
|
||||||
settings.isEnabled = true
|
settings.isEnabled = true
|
||||||
toggle_camera.beVisible()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onVideoDurationChanged(durationNanos: Long) {
|
override fun onVideoDurationChanged(durationNanos: Long) {
|
||||||
@ -820,33 +821,6 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
|
|||||||
button.iconTint = ColorStateList(states, iconColors)
|
button.iconTint = ColorStateList(states, iconColors)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setRecordingState(isRecording: Boolean) {
|
|
||||||
runOnUiThread {
|
|
||||||
if (isRecording) {
|
|
||||||
shutter.isSelected = true
|
|
||||||
toggle_camera.beInvisible()
|
|
||||||
showTimer()
|
|
||||||
} else {
|
|
||||||
shutter.isSelected = false
|
|
||||||
hideTimer()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun videoSaved(uri: Uri) {
|
|
||||||
setupPreviewImage(false)
|
|
||||||
if (isVideoCaptureIntent()) {
|
|
||||||
Intent().apply {
|
|
||||||
data = uri
|
|
||||||
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
|
|
||||||
setResult(Activity.RESULT_OK, this)
|
|
||||||
}
|
|
||||||
finish()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun drawFocusCircle(x: Float, y: Float) = mFocusCircleView.drawFocusCircle(x, y)
|
|
||||||
|
|
||||||
override fun mediaSaved(path: String) {
|
override fun mediaSaved(path: String) {
|
||||||
rescanPaths(arrayListOf(path)) {
|
rescanPaths(arrayListOf(path)) {
|
||||||
setupPreviewImage(true)
|
setupPreviewImage(true)
|
||||||
|
@ -0,0 +1,12 @@
|
|||||||
|
package com.simplemobiletools.camera.extensions
|
||||||
|
|
||||||
|
import android.view.View
|
||||||
|
import com.simplemobiletools.commons.helpers.SHORT_ANIMATION_DURATION
|
||||||
|
|
||||||
|
fun View.fadeIn() {
|
||||||
|
animate().alpha(1f).setDuration(SHORT_ANIMATION_DURATION).withStartAction { isClickable = true }.start()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun View.fadeOut() {
|
||||||
|
animate().alpha(0f).setDuration(SHORT_ANIMATION_DURATION).withEndAction { isClickable = false }.start()
|
||||||
|
}
|
@ -6,8 +6,7 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:animateLayoutChanges="true"
|
android:animateLayoutChanges="true"
|
||||||
android:background="@android:color/black"
|
android:background="@android:color/black">
|
||||||
android:fitsSystemWindows="true">
|
|
||||||
|
|
||||||
<androidx.camera.view.PreviewView
|
<androidx.camera.view.PreviewView
|
||||||
android:id="@+id/preview_view"
|
android:id="@+id/preview_view"
|
||||||
@ -111,8 +110,8 @@
|
|||||||
android:contentDescription="@string/shutter"
|
android:contentDescription="@string/shutter"
|
||||||
android:src="@drawable/ic_shutter_animated"
|
android:src="@drawable/ic_shutter_animated"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toStartOf="@id/last_photo_video_preview"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toEndOf="@id/toggle_camera"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintVertical_bias="1" />
|
app:layout_constraintVertical_bias="1" />
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
|
Loading…
x
Reference in New Issue
Block a user