From dd9501590b58ff4450252608604cbdb3239c9547 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 9 Nov 2021 23:23:54 +0100 Subject: [PATCH] replace resolution and crop icons and preserve state in lifecycle Signed-off-by: Andy Scherzinger --- .../talk/activities/TakePhotoActivity.java | 72 +++++++++++-------- .../talk/models/TakePictureViewModel.java | 39 ++++++++++ app/src/main/res/drawable/ic_2mp_24dp.xml | 10 --- app/src/main/res/drawable/ic_crop_16_9.xml | 10 +++ .../main/res/drawable/ic_crop_16_9_24dp.xml | 10 --- app/src/main/res/drawable/ic_crop_4_3.xml | 10 +++ app/src/main/res/drawable/ic_high_quality.xml | 10 +++ app/src/main/res/drawable/ic_low_quality.xml | 10 +++ .../main/res/layout/activity_take_picture.xml | 4 +- 9 files changed, 125 insertions(+), 50 deletions(-) delete mode 100644 app/src/main/res/drawable/ic_2mp_24dp.xml create mode 100644 app/src/main/res/drawable/ic_crop_16_9.xml delete mode 100644 app/src/main/res/drawable/ic_crop_16_9_24dp.xml create mode 100644 app/src/main/res/drawable/ic_crop_4_3.xml create mode 100644 app/src/main/res/drawable/ic_high_quality.xml create mode 100644 app/src/main/res/drawable/ic_low_quality.xml diff --git a/app/src/main/java/com/nextcloud/talk/activities/TakePhotoActivity.java b/app/src/main/java/com/nextcloud/talk/activities/TakePhotoActivity.java index af2da8c30..f91bb15b8 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/TakePhotoActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/TakePhotoActivity.java @@ -53,6 +53,7 @@ import java.util.concurrent.ExecutionException; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.content.res.AppCompatResources; import androidx.camera.core.AspectRatio; import androidx.camera.core.Camera; import androidx.camera.core.ImageCapture; @@ -79,7 +80,6 @@ public class TakePhotoActivity extends AppCompatActivity { private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss", Locale.ROOT); private Camera camera; - private boolean crop = false, lowres = false; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { @@ -98,8 +98,9 @@ public class TakePhotoActivity extends AppCompatActivity { camera = cameraProvider.bindToLifecycle( this, viewModel.getCameraSelector(), - getImageCapture(false, false), - getPreview(false)); + getImageCapture( + viewModel.isCropEnabled().getValue(), viewModel.isLowResolutionEnabled().getValue()), + getPreview(viewModel.isCropEnabled().getValue())); viewModel.getTorchToggleButtonImageResource() .observe( @@ -108,32 +109,46 @@ public class TakePhotoActivity extends AppCompatActivity { viewModel.isTorchEnabled() .observe( this, - enabled -> camera.getCameraControl().enableTorch(enabled)); + enabled -> camera.getCameraControl().enableTorch(viewModel.isTorchEnabled().getValue())); binding.toggleTorch.setOnClickListener((v) -> viewModel.toggleTorchEnabled()); - binding.toggleCrop.setOnClickListener((v) -> { - crop = !crop; - binding.toggleCrop.setBackgroundColor(crop ? getResources().getColor(R.color.colorPrimary) : - getResources().getColor(R.color.camera_bg_tint)); - cameraProvider.unbindAll(); - camera = cameraProvider.bindToLifecycle( + viewModel.getCropToggleButtonImageResource() + .observe( this, - viewModel.getCameraSelector(), - getImageCapture(crop, lowres), - getPreview(crop)); - }); + res -> binding.toggleCrop.setIcon(ContextCompat.getDrawable(this, res))); + viewModel.isCropEnabled() + .observe( + this, + enabled -> { + cameraProvider.unbindAll(); + camera = cameraProvider.bindToLifecycle( + this, + viewModel.getCameraSelector(), + getImageCapture( + viewModel.isCropEnabled().getValue(), viewModel.isLowResolutionEnabled().getValue()), + getPreview(viewModel.isCropEnabled().getValue())); + camera.getCameraControl().enableTorch(viewModel.isTorchEnabled().getValue()); + }); + binding.toggleCrop.setOnClickListener((v) -> viewModel.toggleCropEnabled()); - binding.toggleLowres.setOnClickListener((v) -> { - lowres = !lowres; - binding.toggleLowres.setBackgroundColor(lowres ? getResources().getColor(R.color.colorPrimary) : - getResources().getColor(R.color.camera_bg_tint)); - cameraProvider.unbindAll(); - camera = cameraProvider.bindToLifecycle( + viewModel.getLowResolutionToggleButtonImageResource() + .observe( this, - viewModel.getCameraSelector(), - getImageCapture(crop, lowres), - getPreview(crop)); - }); + res -> binding.toggleLowres.setIcon(ContextCompat.getDrawable(this, res))); + viewModel.isLowResolutionEnabled() + .observe( + this, + enabled -> { + cameraProvider.unbindAll(); + camera = cameraProvider.bindToLifecycle( + this, + viewModel.getCameraSelector(), + getImageCapture( + viewModel.isCropEnabled().getValue(), viewModel.isLowResolutionEnabled().getValue()), + getPreview(viewModel.isCropEnabled().getValue())); + camera.getCameraControl().enableTorch(viewModel.isTorchEnabled().getValue()); + }); + binding.toggleLowres.setOnClickListener((v) -> viewModel.toggleLowResolutionEnabled()); binding.switchCamera.setOnClickListener((v) -> { viewModel.toggleCameraSelector(); @@ -141,8 +156,9 @@ public class TakePhotoActivity extends AppCompatActivity { camera = cameraProvider.bindToLifecycle( this, viewModel.getCameraSelector(), - getImageCapture(crop, lowres), - getPreview(crop)); + getImageCapture( + viewModel.isCropEnabled().getValue(), viewModel.isLowResolutionEnabled().getValue()), + getPreview(viewModel.isCropEnabled().getValue())); }); binding.retake.setOnClickListener((v) -> { Uri uri = (Uri) binding.photoPreview.getTag(); @@ -230,7 +246,7 @@ public class TakePhotoActivity extends AppCompatActivity { binding.photoPreview.setVisibility(View.VISIBLE); } - private ImageCapture getImageCapture(boolean crop, boolean lowres) { + private ImageCapture getImageCapture(Boolean crop, Boolean lowres) { final ImageCapture imageCapture; if (lowres) imageCapture = new ImageCapture.Builder() .setTargetResolution(new Size(crop ? 1080 : 1440, 1920)).build(); @@ -340,7 +356,7 @@ public class TakePhotoActivity extends AppCompatActivity { return rotate; } - private Preview getPreview(boolean crop) { + private Preview getPreview(Boolean crop) { Preview preview = new Preview.Builder() .setTargetAspectRatio(crop ? AspectRatio.RATIO_16_9 : AspectRatio.RATIO_4_3).build(); preview.setSurfaceProvider(binding.preview.getSurfaceProvider()); diff --git a/app/src/main/java/com/nextcloud/talk/models/TakePictureViewModel.java b/app/src/main/java/com/nextcloud/talk/models/TakePictureViewModel.java index 87ceb5614..44d12e8ce 100644 --- a/app/src/main/java/com/nextcloud/talk/models/TakePictureViewModel.java +++ b/app/src/main/java/com/nextcloud/talk/models/TakePictureViewModel.java @@ -42,6 +42,12 @@ public class TakePictureViewModel extends ViewModel { @NonNull private final MutableLiveData torchEnabled = new MutableLiveData<>(Boolean.FALSE); + @NonNull + private final MutableLiveData lowResolutionEnabled = new MutableLiveData<>(Boolean.FALSE); + + @NonNull + private final MutableLiveData cropEnabled = new MutableLiveData<>(Boolean.FALSE); + @NonNull public CameraSelector getCameraSelector() { return this.cameraSelector; @@ -50,6 +56,9 @@ public class TakePictureViewModel extends ViewModel { public void toggleCameraSelector() { if (this.cameraSelector == DEFAULT_BACK_CAMERA) { this.cameraSelector = DEFAULT_FRONT_CAMERA; + if (this.torchEnabled.getValue()) { + toggleTorchEnabled(); + } } else { this.cameraSelector = DEFAULT_BACK_CAMERA; } @@ -60,13 +69,43 @@ public class TakePictureViewModel extends ViewModel { this.torchEnabled.postValue(!this.torchEnabled.getValue()); } + public void toggleLowResolutionEnabled() { + //noinspection ConstantConditions + this.lowResolutionEnabled.postValue(!this.lowResolutionEnabled.getValue()); + } + + public void toggleCropEnabled() { + //noinspection ConstantConditions + this.cropEnabled.postValue(!this.cropEnabled.getValue()); + } + public LiveData isTorchEnabled() { return this.torchEnabled; } + public LiveData isLowResolutionEnabled() { + return this.lowResolutionEnabled; + } + + public LiveData isCropEnabled() { + return this.cropEnabled; + } + public LiveData getTorchToggleButtonImageResource() { return Transformations.map(isTorchEnabled(), enabled -> enabled ? R.drawable.ic_baseline_flash_off_24 : R.drawable.ic_baseline_flash_on_24); } + + public LiveData getLowResolutionToggleButtonImageResource() { + return Transformations.map(isLowResolutionEnabled(), enabled -> enabled + ? R.drawable.ic_high_quality + : R.drawable.ic_low_quality); + } + + public LiveData getCropToggleButtonImageResource() { + return Transformations.map(isCropEnabled(), enabled -> enabled + ? R.drawable.ic_crop_4_3 + : R.drawable.ic_crop_16_9); + } } diff --git a/app/src/main/res/drawable/ic_2mp_24dp.xml b/app/src/main/res/drawable/ic_2mp_24dp.xml deleted file mode 100644 index e2d85094a..000000000 --- a/app/src/main/res/drawable/ic_2mp_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_crop_16_9.xml b/app/src/main/res/drawable/ic_crop_16_9.xml new file mode 100644 index 000000000..8895db377 --- /dev/null +++ b/app/src/main/res/drawable/ic_crop_16_9.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_crop_16_9_24dp.xml b/app/src/main/res/drawable/ic_crop_16_9_24dp.xml deleted file mode 100644 index 92fc1a646..000000000 --- a/app/src/main/res/drawable/ic_crop_16_9_24dp.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_crop_4_3.xml b/app/src/main/res/drawable/ic_crop_4_3.xml new file mode 100644 index 000000000..2095a2f83 --- /dev/null +++ b/app/src/main/res/drawable/ic_crop_4_3.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_high_quality.xml b/app/src/main/res/drawable/ic_high_quality.xml new file mode 100644 index 000000000..2138222d7 --- /dev/null +++ b/app/src/main/res/drawable/ic_high_quality.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_low_quality.xml b/app/src/main/res/drawable/ic_low_quality.xml new file mode 100644 index 000000000..b93b41933 --- /dev/null +++ b/app/src/main/res/drawable/ic_low_quality.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/activity_take_picture.xml b/app/src/main/res/layout/activity_take_picture.xml index f9cec0165..93cb15595 100644 --- a/app/src/main/res/layout/activity_take_picture.xml +++ b/app/src/main/res/layout/activity_take_picture.xml @@ -63,7 +63,7 @@ app:backgroundTint="#99121212" app:cornerRadius="@dimen/button_corner_radius" app:elevation="0dp" - app:icon="@drawable/ic_crop_16_9_24dp" + app:icon="@drawable/ic_crop_16_9" app:iconGravity="textStart" app:iconPadding="0dp" app:iconSize="24dp" @@ -93,7 +93,7 @@ app:backgroundTint="#99121212" app:cornerRadius="@dimen/button_corner_radius" app:elevation="0dp" - app:icon="@drawable/ic_2mp_24dp" + app:icon="@drawable/ic_low_quality" app:iconGravity="textStart" app:iconPadding="0dp" app:iconSize="24dp"