adding some crashfixes

This commit is contained in:
tibbi 2023-01-15 21:26:54 +01:00
parent dee6247321
commit c1c9c49f04
5 changed files with 40 additions and 25 deletions

View File

@ -895,9 +895,10 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera
private fun resetViewsOnTimerFinish() { private fun resetViewsOnTimerFinish() {
arrayOf(top_options, toggle_camera, last_photo_video_preview, camera_mode_holder).forEach { arrayOf(top_options, toggle_camera, last_photo_video_preview, camera_mode_holder).forEach {
it.fadeIn() it?.fadeIn()
it.beVisible() it?.beVisible()
} }
timer_text.beGone() timer_text.beGone()
shutter.setImageState(intArrayOf(-R.attr.state_timer_cancel), true) shutter.setImageState(intArrayOf(-R.attr.state_timer_cancel), true)
} }

View File

@ -11,10 +11,7 @@ import com.simplemobiletools.camera.models.CameraSelectorImageQualities
import com.simplemobiletools.camera.models.MySize import com.simplemobiletools.camera.models.MySize
import com.simplemobiletools.commons.extensions.showErrorToast import com.simplemobiletools.commons.extensions.showErrorToast
class ImageQualityManager( class ImageQualityManager(private val activity: AppCompatActivity) {
private val activity: AppCompatActivity,
) {
companion object { companion object {
private val CAMERA_LENS = arrayOf(CameraCharacteristics.LENS_FACING_FRONT, CameraCharacteristics.LENS_FACING_BACK) private val CAMERA_LENS = arrayOf(CameraCharacteristics.LENS_FACING_FRONT, CameraCharacteristics.LENS_FACING_BACK)
} }
@ -59,7 +56,7 @@ class ImageQualityManager(
} }
fun getSupportedResolutions(cameraSelector: CameraSelector): List<MySize> { fun getSupportedResolutions(cameraSelector: CameraSelector): List<MySize> {
val fullScreenSize = getFullScreenResolution(cameraSelector) val fullScreenSize = getFullScreenResolution(cameraSelector) ?: return ArrayList()
return listOf(fullScreenSize) + imageQualities.filter { it.camSelector == cameraSelector } return listOf(fullScreenSize) + imageQualities.filter { it.camSelector == cameraSelector }
.flatMap { it.qualities } .flatMap { it.qualities }
.sortedByDescending { it.pixels } .sortedByDescending { it.pixels }
@ -68,11 +65,11 @@ class ImageQualityManager(
.filter { it.isSupported(fullScreenSize.isSixteenToNine()) } .filter { it.isSupported(fullScreenSize.isSixteenToNine()) }
} }
private fun getFullScreenResolution(cameraSelector: CameraSelector): MySize { private fun getFullScreenResolution(cameraSelector: CameraSelector): MySize? {
return imageQualities.filter { it.camSelector == cameraSelector } return imageQualities.filter { it.camSelector == cameraSelector }
.flatMap { it.qualities } .flatMap { it.qualities }
.sortedByDescending { it.width } .sortedByDescending { it.width }
.first { it.isSupported(false) } .firstOrNull { it.isSupported(false) }
.copy(isFullScreen = true) ?.copy(isFullScreen = true)
} }
} }

View File

@ -40,7 +40,7 @@ class MediaActionSound(private val context: Context) {
} }
private class SoundState( private class SoundState(
val mediaSound: MediaSound, val mediaSound: MediaSound?,
// 0 is an invalid sample ID. // 0 is an invalid sample ID.
var loadId: Int = 0, var loadId: Int = 0,
var streamId: Int = 0, var streamId: Int = 0,
@ -99,7 +99,11 @@ class MediaActionSound(private val context: Context) {
private fun loadSound(sound: SoundState): Int { private fun loadSound(sound: SoundState): Int {
var id = 0 var id = 0
when (val mediaSound = sound.mediaSound) { if (sound.mediaSound == null) {
return 0
}
when (val mediaSound = sound.mediaSound!!) {
is MediaSound.ManufacturerSound -> { is MediaSound.ManufacturerSound -> {
for (soundDir in SOUND_DIRS) { for (soundDir in SOUND_DIRS) {
val soundPath = soundDir + mediaSound.fileName val soundPath = soundDir + mediaSound.fileName
@ -167,7 +171,7 @@ class MediaActionSound(private val context: Context) {
} }
private fun playWithSoundPool(sound: SoundState) { private fun playWithSoundPool(sound: SoundState) {
if (playCompletionRunnable != null) { if (playCompletionRunnable != null && sound.mediaSound != null) {
val duration = getSoundDuration(sound.mediaSound) val duration = getSoundDuration(sound.mediaSound)
playTimeHandler.postDelayed(playCompletionRunnable!!, duration) playTimeHandler.postDelayed(playCompletionRunnable!!, duration)
} }

View File

@ -10,6 +10,7 @@ import android.util.Rational
import android.util.Size import android.util.Size
import android.view.* import android.view.*
import android.view.GestureDetector.SimpleOnGestureListener import android.view.GestureDetector.SimpleOnGestureListener
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.camera.core.* import androidx.camera.core.*
import androidx.camera.core.ImageCapture.* import androidx.camera.core.ImageCapture.*
@ -29,8 +30,10 @@ import com.simplemobiletools.camera.R
import com.simplemobiletools.camera.extensions.* import com.simplemobiletools.camera.extensions.*
import com.simplemobiletools.camera.helpers.* import com.simplemobiletools.camera.helpers.*
import com.simplemobiletools.camera.interfaces.MyPreview import com.simplemobiletools.camera.interfaces.MyPreview
import com.simplemobiletools.camera.models.*
import com.simplemobiletools.camera.models.CaptureMode import com.simplemobiletools.camera.models.CaptureMode
import com.simplemobiletools.camera.models.MediaOutput
import com.simplemobiletools.camera.models.MySize
import com.simplemobiletools.camera.models.ResolutionOption
import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.commons.helpers.ensureBackgroundThread
@ -461,14 +464,19 @@ class CameraXPreview(
} }
override fun tryTakePicture() { override fun tryTakePicture() {
val imageCapture = imageCapture ?: throw IllegalStateException("Camera initialization failed.") if (imageCapture == null) {
activity.toast(R.string.camera_open_error)
return
}
val imageCapture = imageCapture
val metadata = Metadata().apply { val metadata = Metadata().apply {
isReversedHorizontal = isFrontCameraInUse() && config.flipPhotos isReversedHorizontal = isFrontCameraInUse() && config.flipPhotos
} }
val mediaOutput = mediaOutputHelper.getImageMediaOutput() val mediaOutput = mediaOutputHelper.getImageMediaOutput()
imageCapture.takePicture(mainExecutor, object : OnImageCapturedCallback() { imageCapture!!.takePicture(mainExecutor, object : OnImageCapturedCallback() {
override fun onCaptureSuccess(image: ImageProxy) { override fun onCaptureSuccess(image: ImageProxy) {
listener.shutterAnimation() listener.shutterAnimation()
playShutterSoundIfEnabled() playShutterSoundIfEnabled()
@ -555,20 +563,25 @@ class CameraXPreview(
@SuppressLint("MissingPermission", "NewApi") @SuppressLint("MissingPermission", "NewApi")
private fun startRecording() { private fun startRecording() {
val videoCapture = videoCapture ?: throw IllegalStateException("Camera initialization failed.") if (videoCapture == null) {
activity.toast(R.string.camera_open_error)
return
}
val videoCapture = videoCapture
val recording = when (val mediaOutput = mediaOutputHelper.getVideoMediaOutput()) { val recording = when (val mediaOutput = mediaOutputHelper.getVideoMediaOutput()) {
is MediaOutput.FileDescriptorMediaOutput -> { is MediaOutput.FileDescriptorMediaOutput -> {
FileDescriptorOutputOptions.Builder(mediaOutput.fileDescriptor).build() FileDescriptorOutputOptions.Builder(mediaOutput.fileDescriptor).build()
.let { videoCapture.output.prepareRecording(activity, it) } .let { videoCapture!!.output.prepareRecording(activity, it) }
} }
is MediaOutput.FileMediaOutput -> { is MediaOutput.FileMediaOutput -> {
FileOutputOptions.Builder(mediaOutput.file).build() FileOutputOptions.Builder(mediaOutput.file).build()
.let { videoCapture.output.prepareRecording(activity, it) } .let { videoCapture!!.output.prepareRecording(activity, it) }
} }
is MediaOutput.MediaStoreOutput -> { is MediaOutput.MediaStoreOutput -> {
MediaStoreOutputOptions.Builder(contentResolver, mediaOutput.contentUri).setContentValues(mediaOutput.contentValues).build() MediaStoreOutputOptions.Builder(contentResolver, mediaOutput.contentUri).setContentValues(mediaOutput.contentValues).build()
.let { videoCapture.output.prepareRecording(activity, it) } .let { videoCapture!!.output.prepareRecording(activity, it) }
} }
} }

View File

@ -3,14 +3,14 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
tools:ignore="AppCompatResource"> tools:ignore="AppCompatResource">
<item
android:id="@+id/more_apps_from_us"
android:icon="@drawable/ic_google_play_vector"
android:title="@string/more_apps_from_us"
app:showAsAction="ifRoom" />
<item <item
android:id="@+id/about" android:id="@+id/about"
android:icon="@drawable/ic_info_vector" android:icon="@drawable/ic_info_vector"
android:title="@string/about" android:title="@string/about"
app:showAsAction="ifRoom" /> app:showAsAction="ifRoom" />
<item
android:id="@+id/more_apps_from_us"
android:icon="@drawable/ic_google_play_vector"
android:title="@string/more_apps_from_us"
app:showAsAction="ifRoom" />
</menu> </menu>