mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-21 10:34:31 +08:00
Finish AccessibilityInfo implementation
Summary: This PR is based on files ericvicenti gave me. Specifically, he gave me: - AccessibilityInfo.android.js - AccessibilityInfo.ios.js - AccessibilityInfoModule.java Before this change, only a native iOS implementation of AccessibilityInfo existed. This change includes: - A native Android implementation of AccessibilityInfo. - JavaScript wrappers for the AccessibilityInfo module for both iOS and Android. - UIExplorer changes to illustrate how to use AccessibilityInfo on iOS and Android. - Documentation for the AccessibilityInfo APIs. **Test plan (required)** Tested the UIExplorer AccessibilityInfo example on iOS and Android with the screen reader both enabled and disabled. Adam Comella Microsoft Corp. Closes https://github.com/facebook/react-native/pull/12273 Reviewed By: mkonicek Differential Revision: D4527224 Pulled By: ericvicenti fbshipit-source-id: d04638465ccbdbb35ecfc9504daaeb8e33aab57a
This commit is contained in:
committed by
Facebook Github Bot
parent
41f1bcc5ac
commit
04790f1a78
@@ -0,0 +1,98 @@
|
||||
// Copyright 2004-present Facebook. All Rights Reserved.
|
||||
|
||||
package com.facebook.react.modules.accessibilityinfo;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.content.Context;
|
||||
import android.os.Build;
|
||||
import android.view.accessibility.AccessibilityManager;
|
||||
|
||||
import com.facebook.react.bridge.Callback;
|
||||
import com.facebook.react.bridge.LifecycleEventListener;
|
||||
import com.facebook.react.bridge.ReactApplicationContext;
|
||||
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
||||
import com.facebook.react.bridge.ReactMethod;
|
||||
import com.facebook.react.module.annotations.ReactModule;
|
||||
import com.facebook.react.modules.core.DeviceEventManagerModule;
|
||||
|
||||
/**
|
||||
* Module that monitors and provides information about the state of Touch Exploration service
|
||||
* on the device. For API >= 19.
|
||||
*/
|
||||
@ReactModule(name = "AccessibilityInfo")
|
||||
public class AccessibilityInfoModule extends ReactContextBaseJavaModule
|
||||
implements LifecycleEventListener {
|
||||
|
||||
@TargetApi(19)
|
||||
private class ReactTouchExplorationStateChangeListener
|
||||
implements AccessibilityManager.TouchExplorationStateChangeListener {
|
||||
|
||||
@Override
|
||||
public void onTouchExplorationStateChanged(boolean enabled) {
|
||||
updateAndSendChangeEvent(enabled);
|
||||
}
|
||||
}
|
||||
|
||||
private @Nullable AccessibilityManager mAccessibilityManager;
|
||||
private @Nullable ReactTouchExplorationStateChangeListener mTouchExplorationStateChangeListener;
|
||||
private boolean mEnabled = false;
|
||||
|
||||
private static final String EVENT_NAME = "touchExplorationDidChange";
|
||||
|
||||
public AccessibilityInfoModule(ReactApplicationContext context) {
|
||||
super(context);
|
||||
mAccessibilityManager = (AccessibilityManager) getReactApplicationContext()
|
||||
.getSystemService(Context.ACCESSIBILITY_SERVICE);
|
||||
mEnabled = mAccessibilityManager.isTouchExplorationEnabled();
|
||||
if (Build.VERSION.SDK_INT >= 19) {
|
||||
mTouchExplorationStateChangeListener = new ReactTouchExplorationStateChangeListener();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "AccessibilityInfo";
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void isTouchExplorationEnabled(Callback successCallback) {
|
||||
successCallback.invoke(mEnabled);
|
||||
}
|
||||
|
||||
private void updateAndSendChangeEvent(boolean enabled) {
|
||||
if (mEnabled != enabled) {
|
||||
mEnabled = enabled;
|
||||
getReactApplicationContext().getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
|
||||
.emit(EVENT_NAME, mEnabled);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onHostResume() {
|
||||
if (Build.VERSION.SDK_INT >= 19) {
|
||||
mAccessibilityManager.addTouchExplorationStateChangeListener(
|
||||
mTouchExplorationStateChangeListener);
|
||||
}
|
||||
updateAndSendChangeEvent(mAccessibilityManager.isTouchExplorationEnabled());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onHostPause() {
|
||||
if (Build.VERSION.SDK_INT >= 19) {
|
||||
mAccessibilityManager.removeTouchExplorationStateChangeListener(
|
||||
mTouchExplorationStateChangeListener);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
getReactApplicationContext().addLifecycleEventListener(this);
|
||||
updateAndSendChangeEvent(mAccessibilityManager.isTouchExplorationEnabled());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onHostDestroy() {
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
include_defs("//ReactAndroid/DEFS")
|
||||
|
||||
android_library(
|
||||
name = "accessibilityinfo",
|
||||
srcs = glob(["**/*.java"]),
|
||||
visibility = [
|
||||
"PUBLIC",
|
||||
],
|
||||
deps = [
|
||||
react_native_dep("libraries/fbcore/src/main/java/com/facebook/common/logging:logging"),
|
||||
react_native_dep("third-party/java/infer-annotations:infer-annotations"),
|
||||
react_native_dep("third-party/java/jsr-305:jsr-305"),
|
||||
react_native_target("java/com/facebook/react/bridge:bridge"),
|
||||
react_native_target("java/com/facebook/react/common:common"),
|
||||
react_native_target("java/com/facebook/react/module/annotations:annotations"),
|
||||
react_native_target("java/com/facebook/react/modules/core:core"),
|
||||
],
|
||||
)
|
||||
|
||||
project_config(
|
||||
src_target = ":accessibilityinfo",
|
||||
)
|
||||
@@ -19,6 +19,7 @@ android_library(
|
||||
react_native_target("java/com/facebook/react/devsupport:devsupport"),
|
||||
react_native_target("java/com/facebook/react/flat:flat"),
|
||||
react_native_target("java/com/facebook/react/module/model:model"),
|
||||
react_native_target("java/com/facebook/react/modules/accessibilityinfo:accessibilityinfo"),
|
||||
react_native_target("java/com/facebook/react/modules/appstate:appstate"),
|
||||
react_native_target("java/com/facebook/react/modules/camera:camera"),
|
||||
react_native_target("java/com/facebook/react/modules/clipboard:clipboard"),
|
||||
|
||||
@@ -36,6 +36,7 @@ import com.facebook.react.flat.RCTViewManager;
|
||||
import com.facebook.react.flat.RCTViewPagerManager;
|
||||
import com.facebook.react.flat.RCTVirtualTextManager;
|
||||
import com.facebook.react.module.model.ReactModuleInfoProvider;
|
||||
import com.facebook.react.modules.accessibilityinfo.AccessibilityInfoModule;
|
||||
import com.facebook.react.modules.appstate.AppStateModule;
|
||||
import com.facebook.react.modules.camera.CameraRollManager;
|
||||
import com.facebook.react.modules.camera.ImageEditingManager;
|
||||
@@ -102,6 +103,12 @@ public class MainReactPackage extends LazyReactPackage {
|
||||
@Override
|
||||
public List<ModuleSpec> getNativeModules(final ReactApplicationContext context) {
|
||||
return Arrays.asList(
|
||||
new ModuleSpec(AccessibilityInfoModule.class, new Provider<NativeModule>() {
|
||||
@Override
|
||||
public NativeModule get() {
|
||||
return new AccessibilityInfoModule(context);
|
||||
}
|
||||
}),
|
||||
new ModuleSpec(AppStateModule.class, new Provider<NativeModule>() {
|
||||
@Override
|
||||
public NativeModule get() {
|
||||
|
||||
Reference in New Issue
Block a user