Bug 752935 - Decouple Android a11y checking, prepare for ICS on-the-fly a11y toggle events. r=davidb, r=kats

This commit is contained in:
Eitan Isaacson 2012-05-10 10:33:12 -07:00
Родитель 06cdf685b9
Коммит 75e9772da6
3 изменённых файлов: 65 добавлений и 38 удалений

Просмотреть файл

@ -48,8 +48,7 @@ var AccessFu = {
} catch (x) {
}
if (this.amINeeded(accessPref))
this.enable();
this.processPreferences(accessPref);
},
/**
@ -57,6 +56,10 @@ var AccessFu = {
* with arrow keys.
*/
enable: function enable() {
if (this._enabled)
return;
this._enabled = true;
dump('AccessFu enable');
this.addPresenter(new VisualPresenter());
@ -77,6 +80,10 @@ var AccessFu = {
* Disable AccessFu and return to default interaction mode.
*/
disable: function disable() {
if (!this._enabled)
return;
this._enabled = false;
dump('AccessFu disable');
this.presenters.forEach(function(p) { p.detach(); });
@ -91,26 +98,29 @@ var AccessFu = {
this.chromeWin.removeEventListener('TabOpen', this, true);
},
amINeeded: function(aPref) {
switch (aPref) {
case ACCESSFU_ENABLE:
return true;
case ACCESSFU_AUTO:
if (Services.appinfo.OS == 'Android') {
let msg = Cc['@mozilla.org/android/bridge;1'].
getService(Ci.nsIAndroidBridge).handleGeckoMessage(
JSON.stringify(
{ gecko: {
type: 'Accessibility:IsEnabled',
eventType: 1,
text: []
}
}));
return JSON.parse(msg).enabled;
processPreferences: function processPreferences(aPref) {
if (Services.appinfo.OS == 'Android') {
if (aPref == ACCESSFU_AUTO) {
if (!this._observingSystemSettings) {
Services.obs.addObserver(this, 'Accessibility:Settings', false);
this._observingSystemSettings = true;
}
default:
return false;
Cc['@mozilla.org/android/bridge;1'].
getService(Ci.nsIAndroidBridge).handleGeckoMessage(
JSON.stringify({ gecko: { type: 'Accessibility:Ready' } }));
return;
}
if (this._observingSystemSettings) {
Services.obs.removeObserver(this, 'Accessibility:Settings');
this._observingSystemSettings = false;
}
}
if (aPref == ACCESSFU_ENABLE)
this.enable();
else
this.disable();
},
addPresenter: function addPresenter(presenter) {
@ -159,13 +169,15 @@ var AccessFu = {
observe: function observe(aSubject, aTopic, aData) {
switch (aTopic) {
case 'Accessibility:Settings':
if (JSON.parse(aData).enabled)
this.enable();
else
this.disable();
break;
case 'nsPref:changed':
if (aData == 'accessfu') {
if (this.amINeeded(this.prefsBranch.getIntPref('accessfu')))
this.enable();
else
this.disable();
}
if (aData == 'accessfu')
this.processPreferences(this.prefsBranch.getIntPref('accessfu'));
break;
case 'accessible-event':
let event;
@ -392,7 +404,13 @@ var AccessFu = {
},
// A hash of documents that don't yet have an accessible tree.
_pendingDocuments: {}
_pendingDocuments: {},
// So we don't enable/disable twice
_enabled: false,
// Observing accessibility settings
_observingSystemSettings: false
};
function getAccessible(aNode) {

Просмотреть файл

@ -1063,6 +1063,23 @@ abstract public class GeckoApp
accessibilityManager.sendAccessibilityEvent(accEvent);
}
});
} else if (event.equals("Accessibility:Ready")) {
mMainHandler.post(new Runnable() {
public void run() {
JSONObject ret = new JSONObject();
AccessibilityManager accessibilityManager =
(AccessibilityManager) mAppContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
try {
ret.put("enabled", accessibilityManager.isEnabled());
// XXX: A placeholder for future explore by touch support.
ret.put("exploreByTouch", false);
} catch (Exception ex) {
Log.e(LOGTAG, "Error building JSON arguments for Accessibility:Ready:", ex);
}
GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("Accessibility:Settings",
ret.toString()));
}
});
}
} catch (Exception e) {
Log.e(LOGTAG, "Exception handling message \"" + event + "\":", e);
@ -1695,6 +1712,7 @@ abstract public class GeckoApp
GeckoAppShell.registerGeckoEventListener("Session:StatePurged", GeckoApp.mAppContext);
GeckoAppShell.registerGeckoEventListener("Bookmark:Insert", GeckoApp.mAppContext);
GeckoAppShell.registerGeckoEventListener("Accessibility:Event", GeckoApp.mAppContext);
GeckoAppShell.registerGeckoEventListener("Accessibility:Ready", GeckoApp.mAppContext);
if (SmsManager.getInstance() != null) {
SmsManager.getInstance().start();
@ -2039,6 +2057,8 @@ abstract public class GeckoApp
GeckoAppShell.unregisterGeckoEventListener("Tab:HasTouchListener", GeckoApp.mAppContext);
GeckoAppShell.unregisterGeckoEventListener("Session:StatePurged", GeckoApp.mAppContext);
GeckoAppShell.unregisterGeckoEventListener("Bookmark:Insert", GeckoApp.mAppContext);
GeckoAppShell.unregisterGeckoEventListener("Accessibility:Event", GeckoApp.mAppContext);
GeckoAppShell.unregisterGeckoEventListener("Accessibility:Ready", GeckoApp.mAppContext);
if (mFavicons != null)
mFavicons.close();

Просмотреть файл

@ -73,7 +73,6 @@ import android.webkit.MimeTypeMap;
import android.media.MediaScannerConnection;
import android.media.MediaScannerConnection.MediaScannerConnectionClient;
import android.provider.Settings;
import android.view.accessibility.AccessibilityManager;
import android.opengl.GLES20;
import android.util.*;
@ -1844,16 +1843,6 @@ public class GeckoAppShell
return promptServiceResult;
}
if (type.equals("Accessibility:IsEnabled")) {
JSONObject ret = new JSONObject();
AccessibilityManager accessibilityManager =
(AccessibilityManager) GeckoApp.mAppContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
try {
ret.put("enabled", accessibilityManager.isEnabled());
} catch (Exception ex) { }
return ret.toString();
}
CopyOnWriteArrayList<GeckoEventListener> listeners;
synchronized (mEventListeners) {
listeners = mEventListeners.get(type);