Skip to content

Commit

Permalink
Fix issue #32 Doesn't work with cordova-plugin-crosswalk-webview
Browse files Browse the repository at this point in the history
Use reflection for getView, getSettings, getTextSize/getTextZoom, and
setTextSize/setTextZoom so that the View does not need to be cast as an
android.webkit.WebView.
  • Loading branch information
majornista committed Feb 11, 2016
1 parent 9714162 commit e3ac5fc
Show file tree
Hide file tree
Showing 6 changed files with 112 additions and 87 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@

import android.view.ViewParent;

public abstract class AbstractMobileAccessibilityHelper {
protected MobileAccessibility mMobileAccessibility;
protected ViewParent mParent;
abstract class AbstractMobileAccessibilityHelper {
MobileAccessibility mMobileAccessibility;
ViewParent mParent;
public abstract void initialize(MobileAccessibility mobileAccessibility);
public abstract boolean isClosedCaptioningEnabled();
public abstract boolean isScreenReaderRunning();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import android.os.Build;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;

Expand All @@ -36,19 +37,20 @@
@TargetApi(Build.VERSION_CODES.DONUT)
public class DonutMobileAccessibilityHelper extends
AbstractMobileAccessibilityHelper {
protected AccessibilityManager mAccessibilityManager;
protected WebView mWebView;
AccessibilityManager mAccessibilityManager;
View mView;

@Override
public void initialize(MobileAccessibility mobileAccessibility) {
mMobileAccessibility = mobileAccessibility;

WebView view;
try {
mWebView = (WebView) mobileAccessibility.webView;
view = (WebView) mobileAccessibility.webView;
mView = view;
} catch(ClassCastException ce) { // cordova-android 4.0+
try {
Method getView = mobileAccessibility.webView.getClass().getMethod("getView");
mWebView = (WebView) getView.invoke(mobileAccessibility.webView);
mView = (View) getView.invoke(mobileAccessibility.webView);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
Expand Down Expand Up @@ -108,9 +110,9 @@ public void announceForAccessibility(CharSequence text) {
final int eventType = AccessibilityEvent.TYPE_VIEW_FOCUSED;
final AccessibilityEvent event = AccessibilityEvent.obtain(eventType);
event.getText().add(text);
event.setEnabled(mWebView.isEnabled());
event.setClassName(mWebView.getClass().getName());
event.setPackageName(mWebView.getContext().getPackageName());
event.setEnabled(mView.isEnabled());
event.setClassName(mView.getClass().getName());
event.setPackageName(mView.getContext().getPackageName());
event.setContentDescription(null);

mAccessibilityManager.sendAccessibilityEvent(event);
Expand All @@ -120,47 +122,66 @@ public void announceForAccessibility(CharSequence text) {
@Override
public double getTextZoom() {
double zoom = 100;
WebSettings.TextSize wTextSize = mWebView.getSettings().getTextSize();
WebSettings.TextSize wTextSize = WebSettings.TextSize.NORMAL;

try {
Method getSettings = mView.getClass().getMethod("getSettings");
Object wSettings = getSettings.invoke(mView);
Method getTextSize = wSettings.getClass().getMethod("getTextSize");
wTextSize = (WebSettings.TextSize) getTextSize.invoke(wSettings);
} catch(ClassCastException ce) {
ce.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}

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(double textZoom) {
final double zoom = textZoom;
WebSettings.TextSize wTextSize = WebSettings.TextSize.NORMAL;
if (zoom > 115) {
WebSettings.TextSize wTextSize = WebSettings.TextSize.SMALLEST;
if (textZoom > 115) {
wTextSize = WebSettings.TextSize.LARGEST;
} else if (zoom > 100) {
} else if (textZoom > 100) {
wTextSize = WebSettings.TextSize.LARGER;
} else if (zoom == 100) {
} else if (textZoom == 100) {
wTextSize = WebSettings.TextSize.NORMAL;
} else if (zoom > 50) {
} else if (textZoom > 50) {
wTextSize = WebSettings.TextSize.SMALLER;
} else {
wTextSize = WebSettings.TextSize.SMALLEST;
}
//Log.i("MobileAccessibility", "fontScale = " + zoom + ", WebSettings.TextSize = " + wTextSize.toString());
mWebView.getSettings().setTextSize(wTextSize);
try {
Method getSettings = mView.getClass().getMethod("getSettings");
Object wSettings = getSettings.invoke(mView);
Method setTextSize = wSettings.getClass().getMethod("setTextSize", WebSettings.TextSize.class);
setTextSize.invoke(wSettings, wTextSize);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,14 @@
import android.os.Build;
import android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener;

import java.lang.IllegalAccessException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public class IceCreamSandwichMobileAccessibilityHelper extends
DonutMobileAccessibilityHelper {
protected AccessibilityStateChangeListener mAccessibilityStateChangeListener;
private AccessibilityStateChangeListener mAccessibilityStateChangeListener;

@Override
public boolean isScreenReaderRunning() {
Expand All @@ -52,17 +56,44 @@ public void removeStateChangeListeners() {

@Override
public double getTextZoom() {
return mWebView.getSettings().getTextZoom();
double zoom = 100;
try {
Method getSettings = mView.getClass().getMethod("getSettings");
Object wSettings = getSettings.invoke(mView);
Method getTextZoom = wSettings.getClass().getMethod("getTextZoom");
zoom = Double.valueOf(getTextZoom.invoke(wSettings).toString());
} catch (ClassCastException ce) {
ce.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return zoom;
}

@Override
public void setTextZoom(double textZoom) {
final double zoom = textZoom;
//Log.i("MobileAccessibility", "setTextZoom(" + zoom + ")");
mWebView.getSettings().setTextZoom((int) zoom);
try {
Method getSettings = mView.getClass().getMethod("getSettings");
Object wSettings = getSettings.invoke(mView);
Method setTextZoom = wSettings.getClass().getMethod("setTextZoom", Integer.TYPE);
setTextZoom.invoke(wSettings, (int) textZoom);
} catch (ClassCastException ce) {
ce.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}

protected class InternalAccessibilityStateChangeListener
private class InternalAccessibilityStateChangeListener
implements AccessibilityStateChangeListener {

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,38 +26,15 @@
import android.annotation.TargetApi;
import android.os.Build;
import android.view.accessibility.AccessibilityEvent;
import android.webkit.WebView;

import java.lang.IllegalAccessException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public class JellyBeanMobileAccessibilityHelper extends
IceCreamSandwichMobileAccessibilityHelper {

@Override
public void initialize(MobileAccessibility mobileAccessibility) {
WebView view;
super.initialize(mobileAccessibility);

try {
view = (WebView) mobileAccessibility.webView;
mParent = view.getParentForAccessibility();
} catch(ClassCastException ce) { // cordova-android 4.0+
try {
Method getView = mobileAccessibility.webView.getClass().getMethod("getView");
view = (WebView) getView.invoke(mobileAccessibility.webView);
mParent = view.getParentForAccessibility();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}

mParent = mView.getParentForAccessibility();
}

@Override
Expand All @@ -66,10 +43,10 @@ public void announceForAccessibility(CharSequence text) {
mAccessibilityManager.interrupt();
AccessibilityEvent event = AccessibilityEvent.obtain(
AccessibilityEvent.TYPE_ANNOUNCEMENT);
mWebView.onInitializeAccessibilityEvent(event);
mView.onInitializeAccessibilityEvent(event);
event.getText().add(text);
event.setContentDescription(null);
mParent.requestSendAccessibilityEvent(mWebView, event);
mParent.requestSendAccessibilityEvent(mView, event);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@
@TargetApi(19)
public class KitKatMobileAccessibilityHelper extends
JellyBeanMobileAccessibilityHelper {
protected CaptioningManager mCaptioningManager;
protected CaptioningChangeListener mCaptioningChangeListener;
protected TouchExplorationStateChangeListener mTouchExplorationStateChangeListener;
private CaptioningManager mCaptioningManager;
private CaptioningChangeListener mCaptioningChangeListener;
private TouchExplorationStateChangeListener mTouchExplorationStateChangeListener;

@Override
public void initialize(MobileAccessibility mobileAccessibility) {
Expand Down Expand Up @@ -61,7 +61,6 @@ public void addStateChangeListeners() {
super.addStateChangeListeners();
if (mCaptioningChangeListener == null) {
mCaptioningChangeListener = new CaptioningChangeListener() {
/** @hide */
@Override
public void onEnabledChanged(boolean enabled) {
onCaptioningEnabledChanged(enabled);
Expand Down Expand Up @@ -89,7 +88,7 @@ public void removeStateChangeListeners() {
}
}

protected class InternalTouchExplorationStateChangeListener
private class InternalTouchExplorationStateChangeListener
implements TouchExplorationStateChangeListener {

@Override
Expand Down

0 comments on commit e3ac5fc

Please sign in to comment.