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