1package com.android.camera;
2
3import android.accessibilityservice.AccessibilityServiceInfo;
4import android.content.Context;
5import android.support.v4.view.accessibility.AccessibilityManagerCompat;
6import android.view.View;
7import android.view.accessibility.AccessibilityManager;
8import android.widget.Button;
9import com.android.camera.debug.Log;
10import com.android.camera.ui.MainActivityLayout;
11import com.android.camera.ui.PreviewOverlay;
12import com.android.camera.util.AndroidServices;
13import com.android.camera2.R;
14
15import java.util.List;
16
17/**
18 * AccessibilityUtil provides methods for use when the device is in
19 * accessibility mode
20 */
21public class AccessibilityUtil {
22    private final static Log.Tag TAG = new Log.Tag("AccessibilityUtil");
23    private static final float MIN_ZOOM = 1f;
24
25    // Filters for Google accessibility services
26    private static final String ACCESSIBILITY_PACKAGE_NAME_PREFIX = "com.google";
27    private PreviewOverlay mPreviewOverlay;
28    private Button mZoomPlusButton;
29    private Button mZoomMinusButton;
30    private float mMaxZoom;
31
32    private View.OnClickListener zoomInListener = new View.OnClickListener() {
33        @Override
34        public void onClick(View view) {
35            float currentZoom = mPreviewOverlay.zoomIn(view, mMaxZoom);
36
37            // Zooming in implies that you must be able to subsequently zoom
38            // out.
39            mZoomMinusButton.setEnabled(true);
40
41            // Make sure it doesn't go above max zoom.
42            if (currentZoom == mMaxZoom) {
43                mZoomPlusButton.setEnabled(false);
44            }
45        }
46    };
47
48    private View.OnClickListener zoomOutListener = new View.OnClickListener() {
49        @Override
50        public void onClick(View view) {
51            float currentZoom = mPreviewOverlay.zoomOut(view, mMaxZoom);
52
53            // Zooming out implies that you must be able to subsequently zoom
54            // in.
55            mZoomPlusButton.setEnabled(true);
56
57            // Make sure it doesn't go below min zoom.
58            if (currentZoom == MIN_ZOOM) {
59                mZoomMinusButton.setEnabled(false);
60            }
61        }
62    };
63
64    public AccessibilityUtil(PreviewOverlay previewOverlay, View view) {
65        mPreviewOverlay = previewOverlay;
66        mZoomPlusButton = (Button) view.findViewById(R.id.accessibility_zoom_plus_button);
67        mZoomMinusButton = (Button) view.findViewById(R.id.accessibility_zoom_minus_button);
68        mZoomPlusButton.setOnClickListener(zoomInListener);
69        mZoomMinusButton.setOnClickListener(zoomOutListener);
70    }
71
72    /**
73     * Enables the zoom UI with zoom in/zoom out buttons.
74     *
75     * @param maxZoom is maximum zoom on the given device
76     */
77    public void showZoomUI(float maxZoom) {
78        mMaxZoom = maxZoom;
79        mZoomPlusButton.setVisibility(View.VISIBLE);
80        mZoomMinusButton.setVisibility(View.VISIBLE);
81        mZoomMinusButton.setEnabled(false);
82    }
83
84    public void hideZoomUI() {
85        mZoomPlusButton.setVisibility(View.GONE);
86        mZoomMinusButton.setVisibility(View.GONE);
87    }
88
89    /**
90     * Returns the accessibility manager.
91     */
92    private android.view.accessibility.AccessibilityManager getAccessibilityManager() {
93        return AndroidServices.instance().provideAccessibilityManager();
94    }
95
96    /**
97     * Returns whether touch exploration is enabled.
98     */
99    private boolean isTouchExplorationEnabled() {
100        android.view.accessibility.AccessibilityManager accessibilityManager = getAccessibilityManager();
101        return accessibilityManager.isTouchExplorationEnabled();
102    }
103
104    /**
105     * Checks whether Google accessibility services are enabled, including
106     * TalkBack, Switch Access, and others
107     *
108     * @return boolean
109     */
110    private boolean containsGoogleAccessibilityService() {
111        android.view.accessibility.AccessibilityManager accessibilityManager = getAccessibilityManager();
112        List<AccessibilityServiceInfo> enabledServices =
113                accessibilityManager
114                        .getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
115        if (enabledServices != null) {
116            for (AccessibilityServiceInfo enabledService : enabledServices) {
117                String serviceId = enabledService.getId();
118                if (serviceId != null && serviceId.startsWith(ACCESSIBILITY_PACKAGE_NAME_PREFIX)) {
119                    return true;
120                }
121            }
122        }
123        return false;
124    }
125
126    /**
127     * Returns whether a touch exploration is enabled or a Google accessibility
128     * service is enabled.
129     */
130    public boolean isAccessibilityEnabled() {
131        return isTouchExplorationEnabled()
132                || containsGoogleAccessibilityService();
133    }
134}
135