| package com.android.camera; |
| |
| import android.accessibilityservice.AccessibilityServiceInfo; |
| import android.content.Context; |
| import androidx.core.view.accessibility.AccessibilityManagerCompat; |
| import android.view.View; |
| import android.view.accessibility.AccessibilityManager; |
| import android.widget.Button; |
| import com.android.camera.debug.Log; |
| import com.android.camera.ui.MainActivityLayout; |
| import com.android.camera.ui.PreviewOverlay; |
| import com.android.camera.util.AndroidServices; |
| import com.android.camera2.R; |
| |
| import java.util.List; |
| |
| /** |
| * AccessibilityUtil provides methods for use when the device is in |
| * accessibility mode |
| */ |
| public class AccessibilityUtil { |
| private final static Log.Tag TAG = new Log.Tag("AccessibilityUtil"); |
| private static final float MIN_ZOOM = 1f; |
| |
| // Filters for Google accessibility services |
| private static final String ACCESSIBILITY_PACKAGE_NAME_PREFIX = "com.google"; |
| private PreviewOverlay mPreviewOverlay; |
| private Button mZoomPlusButton; |
| private Button mZoomMinusButton; |
| private float mMaxZoom; |
| |
| private View.OnClickListener zoomInListener = new View.OnClickListener() { |
| @Override |
| public void onClick(View view) { |
| float currentZoom = mPreviewOverlay.zoomIn(view, mMaxZoom); |
| |
| // Zooming in implies that you must be able to subsequently zoom |
| // out. |
| mZoomMinusButton.setEnabled(true); |
| |
| // Make sure it doesn't go above max zoom. |
| if (currentZoom == mMaxZoom) { |
| mZoomPlusButton.setEnabled(false); |
| } |
| } |
| }; |
| |
| private View.OnClickListener zoomOutListener = new View.OnClickListener() { |
| @Override |
| public void onClick(View view) { |
| float currentZoom = mPreviewOverlay.zoomOut(view, mMaxZoom); |
| |
| // Zooming out implies that you must be able to subsequently zoom |
| // in. |
| mZoomPlusButton.setEnabled(true); |
| |
| // Make sure it doesn't go below min zoom. |
| if (currentZoom == MIN_ZOOM) { |
| mZoomMinusButton.setEnabled(false); |
| } |
| } |
| }; |
| |
| public AccessibilityUtil(PreviewOverlay previewOverlay, View view) { |
| mPreviewOverlay = previewOverlay; |
| mZoomPlusButton = (Button) view.findViewById(R.id.accessibility_zoom_plus_button); |
| mZoomMinusButton = (Button) view.findViewById(R.id.accessibility_zoom_minus_button); |
| mZoomPlusButton.setOnClickListener(zoomInListener); |
| mZoomMinusButton.setOnClickListener(zoomOutListener); |
| } |
| |
| /** |
| * Enables the zoom UI with zoom in/zoom out buttons. |
| * |
| * @param maxZoom is maximum zoom on the given device |
| */ |
| public void showZoomUI(float maxZoom) { |
| mMaxZoom = maxZoom; |
| mZoomPlusButton.setVisibility(View.VISIBLE); |
| mZoomMinusButton.setVisibility(View.VISIBLE); |
| mZoomMinusButton.setEnabled(false); |
| } |
| |
| public void hideZoomUI() { |
| mZoomPlusButton.setVisibility(View.GONE); |
| mZoomMinusButton.setVisibility(View.GONE); |
| } |
| |
| /** |
| * Returns the accessibility manager. |
| */ |
| private android.view.accessibility.AccessibilityManager getAccessibilityManager() { |
| return AndroidServices.instance().provideAccessibilityManager(); |
| } |
| |
| /** |
| * Returns whether touch exploration is enabled. |
| */ |
| private boolean isTouchExplorationEnabled() { |
| android.view.accessibility.AccessibilityManager accessibilityManager = getAccessibilityManager(); |
| return accessibilityManager.isTouchExplorationEnabled(); |
| } |
| |
| /** |
| * Checks whether Google accessibility services are enabled, including |
| * TalkBack, Switch Access, and others |
| * |
| * @return boolean |
| */ |
| private boolean containsGoogleAccessibilityService() { |
| android.view.accessibility.AccessibilityManager accessibilityManager = getAccessibilityManager(); |
| List<AccessibilityServiceInfo> enabledServices = |
| accessibilityManager |
| .getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK); |
| if (enabledServices != null) { |
| for (AccessibilityServiceInfo enabledService : enabledServices) { |
| String serviceId = enabledService.getId(); |
| if (serviceId != null && serviceId.startsWith(ACCESSIBILITY_PACKAGE_NAME_PREFIX)) { |
| return true; |
| } |
| } |
| } |
| return false; |
| } |
| |
| /** |
| * Returns whether a touch exploration is enabled or a Google accessibility |
| * service is enabled. |
| */ |
| public boolean isAccessibilityEnabled() { |
| return isTouchExplorationEnabled() |
| || containsGoogleAccessibilityService(); |
| } |
| } |