/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.util.ui.accessibility;
import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;
/**
* Expose system-wide screen reader status for accessibility features.
*/
public class ScreenReader {
public static final String ATK_WRAPPER = "org.GNOME.Accessibility.AtkWrapper";
public static final String ACCESS_BRIDGE = "com.sun.java.accessibility.AccessBridge";
private static boolean myActive = false;
/**
* Components that need to customize their behavior in the presence of an external screen reader
* application should call this method. For example, this can be used to determine if components
* should to be focusable via keyboard -- as opposed to accessible only via the mouse pointer.
*/
public static boolean isActive() {
return myActive;
}
/**
* This method should be called by a central configuration mechanism to enable screen reader
* support for the application.
*/
public static void setActive(boolean active) {
myActive = active;
}
/**
* Checks whether a particular a11y technology is enabled, in order of priority:
* 1) via the sys. property: "javax.accessibility.assistive_technologies"
* 2) in the prop. file: <user home>/.accessibility.properties
* 3) in the prop. file: <jre>/lib/accessibility.properties
*
* @see {@link #ACCESS_BRIDGE}
* @see {@link #ATK_WRAPPER}
* @param a11yClassName the full class name representing the a11y technology
* @return true if enabled, otherwise false
*/
public static boolean isEnabled(String a11yClassName) {
String[] paths = new String[] {System.getProperty("user.home") + File.separator + ".accessibility.properties",
System.getProperty("java.home") + File.separator + "lib" + File.separator + "accessibility.properties"};
Properties properties = new Properties();
for (String path : paths) {
try {
FileInputStream in = new FileInputStream(new File(path));
try {
properties.load(in);
} finally {
if (in != null) in.close();
}
}
catch (Exception ignore) {
continue;
}
if (!properties.isEmpty()) break;
}
if (!properties.isEmpty()) {
// First, check the system property
String classNames = System.getProperty("javax.accessibility.assistive_technologies");
if (classNames == null) {
// If the system property is not set, Toolkit will try to use the properties file.
classNames = properties.getProperty("assistive_technologies", null);
}
if (classNames != null && classNames.contains(a11yClassName)) {
return true;
}
}
return false;
}
}