Set brightness to 66% when taking a selfie.

main
Alex Hart 2022-11-16 16:51:54 -04:00
rodzic 586339575f
commit 3469e8d0e0
4 zmienionych plików z 49 dodań i 15 usunięć

Wyświetl plik

@ -120,6 +120,10 @@ class Camera1Controller {
}); });
} }
boolean isCameraFacingFront() {
return cameraId == Camera.CameraInfo.CAMERA_FACING_FRONT;
}
int flip() { int flip() {
Log.d(TAG, "flip()"); Log.d(TAG, "flip()");
SurfaceTexture surfaceTexture = previewSurface; SurfaceTexture surfaceTexture = previewSurface;

Wyświetl plik

@ -11,6 +11,7 @@ import android.graphics.Point;
import android.graphics.PointF; import android.graphics.PointF;
import android.graphics.SurfaceTexture; import android.graphics.SurfaceTexture;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.hardware.Camera;
import android.os.Bundle; import android.os.Bundle;
import android.view.Display; import android.view.Display;
import android.view.GestureDetector; import android.view.GestureDetector;
@ -123,7 +124,7 @@ public class Camera1Fragment extends LoggingFragment implements CameraFragment,
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
requireActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); requireActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
cameraScreenBrightnessController = new CameraScreenBrightnessController(requireActivity().getWindow()); cameraScreenBrightnessController = new CameraScreenBrightnessController(requireActivity().getWindow(), () -> camera.isCameraFacingFront());
getViewLifecycleOwner().getLifecycle().addObserver(cameraScreenBrightnessController); getViewLifecycleOwner().getLifecycle().addObserver(cameraScreenBrightnessController);
rotationListener = new RotationListener(requireContext()); rotationListener = new RotationListener(requireContext());
@ -336,6 +337,7 @@ public class Camera1Fragment extends LoggingFragment implements CameraFragment,
animation.setDuration(200); animation.setDuration(200);
animation.setInterpolator(new DecelerateInterpolator()); animation.setInterpolator(new DecelerateInterpolator());
flipButton.startAnimation(animation); flipButton.startAnimation(animation);
cameraScreenBrightnessController.onCameraDirectionChanged(newCameraId == Camera.CameraInfo.CAMERA_FACING_FRONT);
}); });
} else { } else {
flipButton.setVisibility(View.GONE); flipButton.setVisibility(View.GONE);

Wyświetl plik

@ -6,30 +6,53 @@ import androidx.lifecycle.LifecycleOwner
/** /**
* Modifies screen brightness to increase to a max of 66% if lower than that for optimal picture * Modifies screen brightness to increase to a max of 66% if lower than that for optimal picture
* taking conditions. * taking conditions. This brightness is only applied when the front-facing camera is selected.
*/ */
class CameraScreenBrightnessController(private val window: Window) : DefaultLifecycleObserver { class CameraScreenBrightnessController(private val window: Window, private val cameraDirectionProvider: CameraDirectionProvider) : DefaultLifecycleObserver {
companion object { companion object {
private const val MIN_CAMERA_BRIGHTNESS = 0.66f private const val FRONT_CAMERA_BRIGHTNESS = 0.66f
} }
private var originalBrightness: Float = 0f private val originalBrightness: Float by lazy { window.attributes.screenBrightness }
override fun onResume(owner: LifecycleOwner) { override fun onResume(owner: LifecycleOwner) {
val originalBrightness = window.attributes.screenBrightness onCameraDirectionChanged(cameraDirectionProvider.isFrontFacingCameraSelected())
if (originalBrightness < MIN_CAMERA_BRIGHTNESS) { }
override fun onPause(owner: LifecycleOwner) {
disableBrightness()
}
/**
* Because setting camera direction is an asynchronous action, we cannot rely on
* the `CameraDirectionProvider` at this point.
*/
fun onCameraDirectionChanged(isFrontFacing: Boolean) {
if (isFrontFacing) {
enableBrightness()
} else {
disableBrightness()
}
}
private fun enableBrightness() {
if (originalBrightness < FRONT_CAMERA_BRIGHTNESS) {
window.attributes = window.attributes.apply { window.attributes = window.attributes.apply {
screenBrightness = MIN_CAMERA_BRIGHTNESS screenBrightness = FRONT_CAMERA_BRIGHTNESS
} }
} }
} }
override fun onPause(owner: LifecycleOwner) { private fun disableBrightness() {
if (originalBrightness > 0f && window.attributes.screenBrightness == MIN_CAMERA_BRIGHTNESS) { if (window.attributes.screenBrightness == FRONT_CAMERA_BRIGHTNESS) {
window.attributes = window.attributes.apply { window.attributes = window.attributes.apply {
screenBrightness = originalBrightness screenBrightness = originalBrightness
} }
} }
} }
interface CameraDirectionProvider {
fun isFrontFacingCameraSelected(): Boolean
}
} }

Wyświetl plik

@ -136,8 +136,10 @@ public class CameraXFragment extends LoggingFragment implements CameraFragment {
@SuppressLint("MissingPermission") @SuppressLint("MissingPermission")
@Override @Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
cameraScreenBrightnessController = new CameraScreenBrightnessController(requireActivity().getWindow()); cameraScreenBrightnessController = new CameraScreenBrightnessController(
getViewLifecycleOwner().getLifecycle().addObserver(cameraScreenBrightnessController); requireActivity().getWindow(),
() -> cameraController.getCameraSelector() == CameraSelector.DEFAULT_FRONT_CAMERA
);
ViewGroup cameraParent = view.findViewById(R.id.camerax_camera_parent); ViewGroup cameraParent = view.findViewById(R.id.camerax_camera_parent);
@ -508,12 +510,14 @@ public class CameraXFragment extends LoggingFragment implements CameraFragment {
return; return;
} }
getViewLifecycleOwner().getLifecycle().addObserver(cameraScreenBrightnessController);
if (cameraController.hasCamera(CameraSelector.DEFAULT_FRONT_CAMERA) && cameraController.hasCamera(CameraSelector.DEFAULT_BACK_CAMERA)) { if (cameraController.hasCamera(CameraSelector.DEFAULT_FRONT_CAMERA) && cameraController.hasCamera(CameraSelector.DEFAULT_BACK_CAMERA)) {
flipButton.setVisibility(View.VISIBLE); flipButton.setVisibility(View.VISIBLE);
flipButton.setOnClickListener(v -> { flipButton.setOnClickListener(v -> {
cameraController.setCameraSelector(cameraController.getCameraSelector() == CameraSelector.DEFAULT_FRONT_CAMERA CameraSelector cameraSelector = cameraController.getCameraSelector() == CameraSelector.DEFAULT_FRONT_CAMERA
? CameraSelector.DEFAULT_BACK_CAMERA ? CameraSelector.DEFAULT_BACK_CAMERA
: CameraSelector.DEFAULT_FRONT_CAMERA); : CameraSelector.DEFAULT_FRONT_CAMERA;
cameraController.setCameraSelector(cameraSelector);
TextSecurePreferences.setDirectCaptureCameraId(getContext(), CameraXUtil.toCameraDirectionInt(cameraController.getCameraSelector())); TextSecurePreferences.setDirectCaptureCameraId(getContext(), CameraXUtil.toCameraDirectionInt(cameraController.getCameraSelector()));
Animation animation = new RotateAnimation(0, -180, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f); Animation animation = new RotateAnimation(0, -180, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f);
@ -522,6 +526,7 @@ public class CameraXFragment extends LoggingFragment implements CameraFragment {
flipButton.startAnimation(animation); flipButton.startAnimation(animation);
flashButton.setAutoFlashEnabled(cameraController.getImageCaptureFlashMode() >= ImageCapture.FLASH_MODE_AUTO); flashButton.setAutoFlashEnabled(cameraController.getImageCaptureFlashMode() >= ImageCapture.FLASH_MODE_AUTO);
flashButton.setFlash(cameraController.getImageCaptureFlashMode()); flashButton.setFlash(cameraController.getImageCaptureFlashMode());
cameraScreenBrightnessController.onCameraDirectionChanged(cameraSelector == CameraSelector.DEFAULT_FRONT_CAMERA);
}); });
GestureDetector gestureDetector = new GestureDetector(requireContext(), new GestureDetector.SimpleOnGestureListener() { GestureDetector gestureDetector = new GestureDetector(requireContext(), new GestureDetector.SimpleOnGestureListener() {