1b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi/*
2b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi * Copyright (C) 2014 The Android Open Source Project
3b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi *
4b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License");
5b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi * you may not use this file except in compliance with the License.
6b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi * You may obtain a copy of the License at
7b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi *
8b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi *      http://www.apache.org/licenses/LICENSE-2.0
9b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi *
10b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi * Unless required by applicable law or agreed to in writing, software
11b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS,
12b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi * See the License for the specific language governing permissions and
14b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi * limitations under the License
15b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi */
16b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi
17b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggipackage com.android.systemui.statusbar.policy;
18b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi
19b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggiimport android.content.Context;
20b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggiimport android.view.accessibility.AccessibilityManager;
21b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi
22b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggiimport java.io.FileDescriptor;
23b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggiimport java.io.PrintWriter;
24b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggiimport java.util.ArrayList;
25b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi
26b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggipublic class AccessibilityController implements
27b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi        AccessibilityManager.AccessibilityStateChangeListener,
28b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi        AccessibilityManager.TouchExplorationStateChangeListener {
29b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi
30b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi    private final ArrayList<AccessibilityStateChangedCallback> mChangeCallbacks = new ArrayList<>();
31b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi
32b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi    private boolean mAccessibilityEnabled;
33b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi    private boolean mTouchExplorationEnabled;
34b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi
35b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi    public AccessibilityController(Context context) {
36b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi        AccessibilityManager am =
37b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi                (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
38b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi        am.addTouchExplorationStateChangeListener(this);
39b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi        am.addAccessibilityStateChangeListener(this);
40b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi        mAccessibilityEnabled = am.isEnabled();
41b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi        mTouchExplorationEnabled = am.isTouchExplorationEnabled();
42b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi    }
43b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi
44b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi    public boolean isAccessibilityEnabled() {
45b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi        return mAccessibilityEnabled;
46b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi    }
47b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi
48b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi    public boolean isTouchExplorationEnabled() {
49b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi        return mTouchExplorationEnabled;
50b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi    }
51b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi
52b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
53b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi        pw.println("AccessibilityController state:");
54b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi        pw.print("  mAccessibilityEnabled="); pw.println(mAccessibilityEnabled);
55b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi        pw.print("  mTouchExplorationEnabled="); pw.println(mTouchExplorationEnabled);
56b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi    }
57b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi
58b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi    public void addStateChangedCallback(AccessibilityStateChangedCallback cb) {
59b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi        mChangeCallbacks.add(cb);
60b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi        cb.onStateChanged(mAccessibilityEnabled, mTouchExplorationEnabled);
61b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi    }
62b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi
63b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi    public void removeStateChangedCallback(AccessibilityStateChangedCallback cb) {
64b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi        mChangeCallbacks.remove(cb);
65b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi    }
66b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi
67b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi    private void fireChanged() {
68b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi        final int N = mChangeCallbacks.size();
69b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi        for (int i = 0; i < N; i++) {
70b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi            mChangeCallbacks.get(i).onStateChanged(mAccessibilityEnabled, mTouchExplorationEnabled);
71b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi        }
72b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi    }
73b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi
74b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi    @Override
75b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi    public void onAccessibilityStateChanged(boolean enabled) {
76b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi        mAccessibilityEnabled = enabled;
77b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi        fireChanged();
78b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi    }
79b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi
80b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi    @Override
81b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi    public void onTouchExplorationStateChanged(boolean enabled) {
82b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi        mTouchExplorationEnabled = enabled;
83b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi        fireChanged();
84b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi    }
85b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi
86b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi    public interface AccessibilityStateChangedCallback {
87b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi        void onStateChanged(boolean accessibilityEnabled, boolean touchExplorationEnabled);
88b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi    }
89b2e104f8a26e00cd2437637c7cc2d3133981ef2fJorim Jaggi}
90