diff --git a/plugin.xml b/plugin.xml
index 74196a0..1711ff1 100644
--- a/plugin.xml
+++ b/plugin.xml
@@ -17,8 +17,8 @@
-
-
+
+
diff --git a/src/android/com/phonegap/plugin/mobileaccessibility/AbstractMobileAccessibilityHelper.java b/src/android/com/phonegap/plugin/mobileaccessibility/AbstractMobileAccessibilityHelper.java
index 32d1d2b..52a223d 100644
--- a/src/android/com/phonegap/plugin/mobileaccessibility/AbstractMobileAccessibilityHelper.java
+++ b/src/android/com/phonegap/plugin/mobileaccessibility/AbstractMobileAccessibilityHelper.java
@@ -15,4 +15,6 @@ public abstract class AbstractMobileAccessibilityHelper {
public abstract void addStateChangeListeners();
public abstract void removeStateChangeListeners();
public abstract void announceForAccessibility(CharSequence text);
+ public abstract int getTextZoom();
+ public abstract void setTextZoom(int textZoom);
}
diff --git a/src/android/com/phonegap/plugin/mobileaccessibility/DonutMobileAccessibilityHelper.java b/src/android/com/phonegap/plugin/mobileaccessibility/DonutMobileAccessibilityHelper.java
index 0d6c21b..13dc5ab 100644
--- a/src/android/com/phonegap/plugin/mobileaccessibility/DonutMobileAccessibilityHelper.java
+++ b/src/android/com/phonegap/plugin/mobileaccessibility/DonutMobileAccessibilityHelper.java
@@ -4,8 +4,10 @@ package com.phonegap.plugin.mobileaccessibility;
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
+import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
+import android.webkit.WebSettings;
import android.webkit.WebView;
@TargetApi(Build.VERSION_CODES.DONUT)
@@ -18,7 +20,6 @@ public class DonutMobileAccessibilityHelper extends
public void initialize(MobileAccessibility mobileAccessibility) {
mMobileAccessibility = mobileAccessibility;
mWebView = mobileAccessibility.webView;
- mParent = mobileAccessibility.webView.getParentForAccessibility();
mAccessibilityManager = (AccessibilityManager) mMobileAccessibility.cordova.getActivity().getSystemService(Context.ACCESSIBILITY_SERVICE);
}
@@ -76,5 +77,52 @@ public class DonutMobileAccessibilityHelper extends
mAccessibilityManager.sendAccessibilityEvent(event);
}
-
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public int getTextZoom() {
+ int zoom = 100;
+ WebSettings.TextSize wTextSize = mWebView.getSettings().getTextSize();
+ switch (wTextSize) {
+ case LARGEST:
+ zoom = 200;
+ break;
+ case LARGER:
+ zoom = 150;
+ break;
+ case NORMAL:
+ zoom = 100;
+ break;
+ case SMALLER:
+ zoom = 75;
+ break;
+ case SMALLEST:
+ zoom = 50;
+ break;
+ default:
+ zoom = 100;
+ break;
+ }
+ return zoom;
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public void setTextZoom(int textZoom) {
+ final int zoom = textZoom;
+ WebSettings.TextSize wTextSize = WebSettings.TextSize.NORMAL;
+ if (zoom > 115) {
+ wTextSize = WebSettings.TextSize.LARGEST;
+ } else if (zoom > 100) {
+ wTextSize = WebSettings.TextSize.LARGER;
+ } else if (zoom == 100) {
+ wTextSize = WebSettings.TextSize.NORMAL;
+ } else if (zoom > 50) {
+ wTextSize = WebSettings.TextSize.SMALLER;
+ } else {
+ wTextSize = WebSettings.TextSize.SMALLEST;
+ }
+ //Log.i("MobileAccessibility", "fontScale = " + zoom + ", WebSettings.TextSize = " + wTextSize.toString());
+ mWebView.getSettings().setTextSize(wTextSize);
+ }
}
diff --git a/src/android/com/phonegap/plugin/mobileaccessibility/IceCreamSandwichMobileAccessibilityHelper.java b/src/android/com/phonegap/plugin/mobileaccessibility/IceCreamSandwichMobileAccessibilityHelper.java
index abbcec4..e9562ff 100644
--- a/src/android/com/phonegap/plugin/mobileaccessibility/IceCreamSandwichMobileAccessibilityHelper.java
+++ b/src/android/com/phonegap/plugin/mobileaccessibility/IceCreamSandwichMobileAccessibilityHelper.java
@@ -3,6 +3,7 @@ package com.phonegap.plugin.mobileaccessibility;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.annotation.TargetApi;
import android.os.Build;
+import android.util.Log;
import android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener;
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
@@ -29,6 +30,18 @@ public class IceCreamSandwichMobileAccessibilityHelper extends
mAccessibilityStateChangeListener = null;
}
+ @Override
+ public int getTextZoom() {
+ return mWebView.getSettings().getTextZoom();
+ }
+
+ @Override
+ public void setTextZoom(int textZoom) {
+ final int zoom = textZoom;
+ //Log.i("MobileAccessibility", "setTextZoom(" + zoom + ")");
+ mWebView.getSettings().setTextZoom(zoom);
+ }
+
protected class InternalAccessibilityStateChangeListener
implements AccessibilityStateChangeListener {
diff --git a/src/android/com/phonegap/plugin/mobileaccessibility/JellyBeanMobileAccessibilityHelper.java b/src/android/com/phonegap/plugin/mobileaccessibility/JellyBeanMobileAccessibilityHelper.java
index 5d6d34d..040cc42 100644
--- a/src/android/com/phonegap/plugin/mobileaccessibility/JellyBeanMobileAccessibilityHelper.java
+++ b/src/android/com/phonegap/plugin/mobileaccessibility/JellyBeanMobileAccessibilityHelper.java
@@ -1,5 +1,7 @@
package com.phonegap.plugin.mobileaccessibility;
+import com.phonegap.plugin.mobileaccessibility.MobileAccessibility;
+
import android.annotation.TargetApi;
import android.os.Build;
import android.view.accessibility.AccessibilityEvent;
@@ -8,6 +10,12 @@ import android.view.accessibility.AccessibilityEvent;
public class JellyBeanMobileAccessibilityHelper extends
IceCreamSandwichMobileAccessibilityHelper {
+ @Override
+ public void initialize(MobileAccessibility mobileAccessibility) {
+ super.initialize(mobileAccessibility);
+ mParent = mobileAccessibility.webView.getParentForAccessibility();
+ }
+
@Override
public void announceForAccessibility(CharSequence text) {
if (mAccessibilityManager.isEnabled() && mParent != null) {
diff --git a/src/android/com/phonegap/plugin/mobileaccessibility/MobileAccessibility.java b/src/android/com/phonegap/plugin/mobileaccessibility/MobileAccessibility.java
index 4ac0ce4..21803f7 100644
--- a/src/android/com/phonegap/plugin/mobileaccessibility/MobileAccessibility.java
+++ b/src/android/com/phonegap/plugin/mobileaccessibility/MobileAccessibility.java
@@ -22,6 +22,7 @@ public class MobileAccessibility extends CordovaPlugin {
protected boolean mClosedCaptioningEnabled = false;
protected boolean mTouchExplorationEnabled = false;
protected boolean mCachedIsScreenReaderRunning = false;
+ protected float mFontScale = 1;
@Override
public void initialize(CordovaInterface cordova, CordovaWebView webView) {
@@ -58,6 +59,20 @@ public class MobileAccessibility extends CordovaPlugin {
}
}
return true;
+ } else if(action.equals("getTextZoom")) {
+ getTextZoom(callbackContext);
+ return true;
+ } else if(action.equals("setTextZoom")) {
+ if (args.length() > 0) {
+ int textZoom = args.getInt(0);
+ if (textZoom > 0) {
+ setTextZoom(textZoom, callbackContext);
+ }
+ }
+ return true;
+ } else if(action.equals("updateTextZoom")) {
+ updateTextZoom();
+ return true;
} else if (action.equals("start")) {
start(callbackContext);
return true;
@@ -73,13 +88,13 @@ public class MobileAccessibility extends CordovaPlugin {
}
/**
- * Called when the system is about to start resuming a previous activity.
+ * Called when the system is about to pause the current activity
*
* @param multitasking Flag indicating if multitasking is turned on for app
*/
@Override
public void onPause(boolean multitasking) {
- Log.i("MobileAccessibility", "onPause");
+ //Log.i("MobileAccessibility", "onPause");
mCachedIsScreenReaderRunning = mIsScreenReaderRunning;
}
@@ -90,9 +105,9 @@ public class MobileAccessibility extends CordovaPlugin {
*/
@Override
public void onResume(boolean multitasking) {
- Log.i("MobileAccessibility", "onResume");
+ //Log.i("MobileAccessibility", "onResume");
if (mIsScreenReaderRunning && !mCachedIsScreenReaderRunning) {
- Log.i("MobileAccessibility", "Reloading page on reload because the Accessibility State has changed.");
+ //Log.i("MobileAccessibility", "Reloading page on reload because the Accessibility State has changed.");
mCachedIsScreenReaderRunning = mIsScreenReaderRunning;
stop();
cordova.getActivity().runOnUiThread(new Runnable() {
@@ -100,9 +115,7 @@ public class MobileAccessibility extends CordovaPlugin {
webView.reload();
}
});
-
}
-
}
/**
@@ -198,6 +211,45 @@ public class MobileAccessibility extends CordovaPlugin {
});
}
+ public void getTextZoom(final CallbackContext callbackContext) {
+ cordova.getActivity().runOnUiThread(new Runnable() {
+ public void run() {
+ final int textZoom = mMobileAccessibilityHelper.getTextZoom();
+ if (callbackContext != null) {
+ callbackContext.success(textZoom);
+ }
+ }
+ });
+ }
+
+ public void setTextZoom(final int textZoom, final CallbackContext callbackContext) {
+ cordova.getActivity().runOnUiThread(new Runnable() {
+ public void run() {
+ mMobileAccessibilityHelper.setTextZoom(textZoom);
+ if (callbackContext != null) {
+ callbackContext.success(mMobileAccessibilityHelper.getTextZoom());
+ };
+ }
+ });
+ }
+
+ public void setTextZoom(final int textZoom) {
+ cordova.getActivity().runOnUiThread(new Runnable() {
+ public void run() {
+ mMobileAccessibilityHelper.setTextZoom(textZoom);
+ }
+ });
+ }
+
+ public void updateTextZoom() {
+ float fontScale = cordova.getActivity().getResources().getConfiguration().fontScale;
+ if (fontScale != mFontScale) {
+ mFontScale = fontScale;
+ }
+ int textZoom = Math.round(mFontScale * 100);
+ setTextZoom(textZoom);
+ }
+
protected void sendMobileAccessibilityStatusChangedCallback() {
if (this.mCallbackContext != null) {
PluginResult result = new PluginResult(PluginResult.Status.OK, getMobileAccessibilityStatus());
@@ -213,9 +265,9 @@ public class MobileAccessibility extends CordovaPlugin {
status.put("isScreenReaderRunning", mIsScreenReaderRunning);
status.put("isClosedCaptioningEnabled", mClosedCaptioningEnabled);
status.put("isTouchExplorationEnabled", mTouchExplorationEnabled);
- Log.i("MobileAccessibility", "MobileAccessibility.isScreenReaderRunning == " + status.getString("isScreenReaderRunning") +
- "\nMobileAccessibility.isClosedCaptioningEnabled == " + status.getString("isClosedCaptioningEnabled") +
- "\nMobileAccessibility.isTouchExplorationEnabled == " + status.getString("isTouchExplorationEnabled") );
+ //Log.i("MobileAccessibility", "MobileAccessibility.isScreenReaderRunning == " + status.getString("isScreenReaderRunning") +
+ // "\nMobileAccessibility.isClosedCaptioningEnabled == " + status.getString("isClosedCaptioningEnabled") +
+ // "\nMobileAccessibility.isTouchExplorationEnabled == " + status.getString("isTouchExplorationEnabled") );
} catch (JSONException e) {
e.printStackTrace();
}
@@ -223,14 +275,14 @@ public class MobileAccessibility extends CordovaPlugin {
}
protected void start(CallbackContext callbackContext) {
- Log.i("MobileAccessibility", "MobileAccessibility.start");
+ //Log.i("MobileAccessibility", "MobileAccessibility.start");
mCallbackContext = callbackContext;
mMobileAccessibilityHelper.addStateChangeListeners();
sendMobileAccessibilityStatusChangedCallback();
}
protected void stop() {
- Log.i("MobileAccessibility", "MobileAccessibility.stop");
+ //Log.i("MobileAccessibility", "MobileAccessibility.stop");
if (mCallbackContext != null) {
sendMobileAccessibilityStatusChangedCallback();
mMobileAccessibilityHelper.removeStateChangeListeners();
diff --git a/www/mobile-accessibility.js b/www/mobile-accessibility.js
index 591e198..4f00943 100644
--- a/www/mobile-accessibility.js
+++ b/www/mobile-accessibility.js
@@ -33,6 +33,7 @@ var MobileAccessibility = function() {
this._isInvertColorsEnabled = false;
this._isMonoAudioEnabled = false;
this._isTouchExplorationEnabled = false;
+ this._usePreferredTextZoom = false;
// Create new event handlers on the window (returns a channel instance)
this.channels = {
screenreaderstatuschanged:cordova.addWindowEventHandler("screenreaderstatuschanged"),
@@ -109,6 +110,22 @@ MobileAccessibility.prototype.activateOrDeactivateChromeVox = function(bool) {
console.error(err);
}
}
+
+ if (bool) {
+ if (!mobileAccessibility.hasOrientationChangeListener) {
+ window.addEventListener("orientationchange", mobileAccessibility.onOrientationChange);
+ mobileAccessibility.hasOrientationChangeListener = true;
+ }
+ } else if(mobileAccessibility.hasOrientationChangeListener) {
+ window.removeEventListener("orientationchange", mobileAccessibility.onOrientationChange);
+ mobileAccessibility.hasOrientationChangeListener = false;
+ }
+};
+
+MobileAccessibility.prototype.hasOrientationChangeListener = false;
+MobileAccessibility.prototype.onOrientationChange = function(event) {
+ if (!mobileAccessibility.isChromeVoxActive()) return;
+ cvox.ChromeVox.navigationManager.updateIndicator();
};
MobileAccessibility.prototype.scriptInjected = false;
@@ -176,6 +193,42 @@ MobileAccessibility.prototype.isTouchExplorationEnabled = function(callback) {
exec(callback, null, "MobileAccessibility", "isTouchExplorationEnabled", []);
};
+MobileAccessibility.prototype.getTextZoom = function(callback) {
+ exec(callback, null, "MobileAccessibility", "getTextZoom", []);
+};
+
+MobileAccessibility.prototype.setTextZoom = function(textZoom, callback) {
+ exec(callback, null, "MobileAccessibility", "setTextZoom", [textZoom]);
+};
+
+MobileAccessibility.prototype.updateTextZoom = function() {
+ exec(null, null, "MobileAccessibility", "updateTextZoom", []);
+};
+
+MobileAccessibility.prototype.usePreferredTextZoom = function(bool) {
+ var currentValue = window.localStorage.getItem("MobileAccessibility.usePreferredTextZoom") === "true";
+
+ if (arguments.length === 0) {
+ return currentValue;
+ }
+
+ if (currentValue != bool) {
+ window.localStorage.setItem("MobileAccessibility.usePreferredTextZoom", bool);
+ }
+
+ document.removeEventListener("resume", mobileAccessibility.updateTextZoom);
+
+ if (bool) {
+ // console.log("We should update the text zoom at this point: " + bool)
+ document.addEventListener("resume", mobileAccessibility.updateTextZoom, false);
+ mobileAccessibility.updateTextZoom();
+ } else {
+ mobileAccessibility.setTextZoom(100);
+ }
+
+ return Boolean(bool);
+};
+
MobileAccessibility.prototype.MobileAccessibilityNotifications = {
SCREEN_CHANGED : 1000,
LAYOUT_CHANGED : 1001,