replace resolution and crop icons and preserve state in lifecycle

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
This commit is contained in:
Andy Scherzinger 2021-11-09 23:23:54 +01:00
parent c3a37222b3
commit dd9501590b
No known key found for this signature in database
GPG Key ID: 6CADC7E3523C308B
9 changed files with 125 additions and 50 deletions

View File

@ -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));
viewModel.getCropToggleButtonImageResource()
.observe(
this,
res -> binding.toggleCrop.setIcon(ContextCompat.getDrawable(this, res)));
viewModel.isCropEnabled()
.observe(
this,
enabled -> {
cameraProvider.unbindAll();
camera = cameraProvider.bindToLifecycle(
this,
viewModel.getCameraSelector(),
getImageCapture(crop, lowres),
getPreview(crop));
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));
viewModel.getLowResolutionToggleButtonImageResource()
.observe(
this,
res -> binding.toggleLowres.setIcon(ContextCompat.getDrawable(this, res)));
viewModel.isLowResolutionEnabled()
.observe(
this,
enabled -> {
cameraProvider.unbindAll();
camera = cameraProvider.bindToLifecycle(
this,
viewModel.getCameraSelector(),
getImageCapture(crop, lowres),
getPreview(crop));
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());

View File

@ -42,6 +42,12 @@ public class TakePictureViewModel extends ViewModel {
@NonNull
private final MutableLiveData<Boolean> torchEnabled = new MutableLiveData<>(Boolean.FALSE);
@NonNull
private final MutableLiveData<Boolean> lowResolutionEnabled = new MutableLiveData<>(Boolean.FALSE);
@NonNull
private final MutableLiveData<Boolean> 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<Boolean> isTorchEnabled() {
return this.torchEnabled;
}
public LiveData<Boolean> isLowResolutionEnabled() {
return this.lowResolutionEnabled;
}
public LiveData<Boolean> isCropEnabled() {
return this.cropEnabled;
}
public LiveData<Integer> getTorchToggleButtonImageResource() {
return Transformations.map(isTorchEnabled(), enabled -> enabled
? R.drawable.ic_baseline_flash_off_24
: R.drawable.ic_baseline_flash_on_24);
}
public LiveData<Integer> getLowResolutionToggleButtonImageResource() {
return Transformations.map(isLowResolutionEnabled(), enabled -> enabled
? R.drawable.ic_high_quality
: R.drawable.ic_low_quality);
}
public LiveData<Integer> getCropToggleButtonImageResource() {
return Transformations.map(isCropEnabled(), enabled -> enabled
? R.drawable.ic_crop_4_3
: R.drawable.ic_crop_16_9);
}
}

View File

@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#757575" >
<path
android:pathData="M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,18.5h-1.5L10.5,14h-1v3L8,17v-3L7,14v4.5L5.5,18.5v-5c0,-0.55 0.45,-1 1,-1L11,12.5c0.55,0 1,0.45 1,1v5zM15.5,18.5L14,18.5v-6h3.5c0.55,0 1,0.45 1,1L18.5,16c0,0.55 -0.45,1 -1,1h-2v1.5zM13.5,9h-2v1h3v1.5L10,11.5L10,9c0,-0.55 0.45,-1 1,-1h2L13,7h-3L10,5.5h3.5c0.55,0 1,0.45 1,1L14.5,8c0,0.55 -0.45,1 -1,1zM15.5,14L17,14v1.5h-1.5z"
android:fillColor="@android:color/white"/>
</vector>

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF000000"
android:pathData="M21,16L21,17C21,18.1 20.1,19 19,19L5,19C3.9,19 3,18.1 3,17L3,16L5,16L5,17L19,17L19,16L21,16ZM3,8L3,7C3,5.9 3.9,5 5,5L19,5C20.1,5 21,5.9 21,7L21,8L19,8L19,7L5,7L5,8L3,8ZM21,14.014C21,14.564 20.55,15.014 20,15.014L16.5,15.014L16.5,13.514L19.5,13.514L19.5,12.514L17.5,12.514C16.95,12.514 16.5,12.064 16.5,11.514L16.5,10.014C16.5,9.464 16.95,9.014 17.5,9.014L20,9.014C20.55,9.014 21,9.464 21,10.014L21,14.014ZM6,15L4.5,15L4.5,10.5L3,10.5L3,9L6,9L6,15ZM8,15C7.45,15 7,14.55 7,14L7,10C7,9.45 7.45,9 8,9L11.5,9L11.5,10.5L8.5,10.5L8.5,11.5L10.5,11.5C11.05,11.5 11.5,11.95 11.5,12.5L11.5,14C11.5,14.55 11.05,15 10.5,15L8,15ZM14.75,12.722L13.25,12.722L13.25,14.223L14.75,14.223L14.75,12.722ZM9.995,12.456L8.495,12.456L8.495,13.956L9.995,13.956L9.995,12.456ZM19.508,9.984L18.008,9.984L18.008,11.484L19.508,11.484L19.508,9.984ZM14.75,9.722L13.25,9.722L13.25,11.223L14.75,11.223L14.75,9.722Z"
android:fillType="nonZero"/>
</vector>

View File

@ -1,10 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="#757575">
<path
android:pathData="M19,6L5,6c-1.1,0 -2,0.9 -2,2v8c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,8c0,-1.1 -0.9,-2 -2,-2zM19,16L5,16L5,8h14v8z"
android:fillColor="@android:color/white"/>
</vector>

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF000000"
android:pathData="M21,16L21,17C21,18.1 20.1,19 19,19L5,19C3.9,19 3,18.1 3,17L3,16L5,16L5,17L19,17L19,16L21,16ZM19,14L19,10C19,9.45 18.55,9 18,9L14.5,9L14.5,10.5L17.5,10.5L17.5,11.5L15.5,11.5L15.5,12.5L17.5,12.5L17.5,13.5L14.5,13.5L14.5,15L18,15C18.55,15 19,14.55 19,14ZM9.5,9L9.5,15L8,15L8,13.5L5,13.5L5,9L6.5,9L6.5,12L8,12L8,9L9.5,9ZM12.75,12.723L12.75,14.223L11.25,14.223L11.25,12.723L12.75,12.723ZM12.75,9.723L12.75,11.223L11.25,11.223L11.25,9.723L12.75,9.723ZM3,8L3,7C3,5.9 3.9,5 5,5L19,5C20.1,5 21,5.9 21,7L21,8L19,8L19,7L5,7L5,8L3,8Z"
android:fillType="nonZero"/>
</vector>

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M19,4L5,4c-1.11,0 -2,0.9 -2,2v12c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,6c0,-1.1 -0.9,-2 -2,-2zM11,15L9.5,15v-2h-2v2L6,15L6,9h1.5v2.5h2L9.5,9L11,9v6zM18,14c0,0.55 -0.45,1 -1,1h-0.75v1.5h-1.5L14.75,15L14,15c-0.55,0 -1,-0.45 -1,-1v-4c0,-0.55 0.45,-1 1,-1h3c0.55,0 1,0.45 1,1v4zM14.5,13.5h2v-3h-2v3z"/>
</vector>

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF000000"
android:pathData="M19,4L5,4C3.89,4 3,4.9 3,6L3,18C3,19.1 3.89,20 5,20L19,20C20.1,20 21,19.1 21,18L21,6C21,4.9 20.1,4 19,4ZM18,14C18,14.55 17.55,15 17,15L16.25,15L16.25,16.5L14.75,16.5L14.75,15L14,15C13.45,15 13,14.55 13,14L13,10C13,9.45 13.45,9 14,9L17,9C17.55,9 18,9.45 18,10L18,14ZM7.5,13.5L10.509,13.496L10.508,14.997L6,15L6,9L7.5,9L7.5,13.5ZM14.5,13.5L16.5,13.5L16.5,10.5L14.5,10.5L14.5,13.5Z"
android:fillType="nonZero"/>
</vector>

View File

@ -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"