Procházet zdrojové kódy

replace resolution and crop icons and preserve state in lifecycle

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
Andy Scherzinger před 3 roky
rodič
revize
dd9501590b

+ 45 - 29
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));
-                });
-
-                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(
+                        res -> binding.toggleCrop.setIcon(ContextCompat.getDrawable(this, res)));
+                viewModel.isCropEnabled()
+                    .observe(
                         this,
-                        viewModel.getCameraSelector(),
-                        getImageCapture(crop, lowres),
-                        getPreview(crop));
-                });
+                        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());
+
+                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(
+                                    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());

+ 39 - 0
app/src/main/java/com/nextcloud/talk/models/TakePictureViewModel.java

@@ -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);
+    }
 }

+ 0 - 10
app/src/main/res/drawable/ic_2mp_24dp.xml

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

+ 10 - 0
app/src/main/res/drawable/ic_crop_16_9.xml

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

+ 0 - 10
app/src/main/res/drawable/ic_crop_16_9_24dp.xml

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

+ 10 - 0
app/src/main/res/drawable/ic_crop_4_3.xml

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

+ 10 - 0
app/src/main/res/drawable/ic_high_quality.xml

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

+ 10 - 0
app/src/main/res/drawable/ic_low_quality.xml

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

+ 2 - 2
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"