From a2c9a97a7a1becbe17efb5d1057ec98e715c4ba4 Mon Sep 17 00:00:00 2001 From: misakuo Date: Mon, 13 Nov 2017 11:37:08 +0800 Subject: [PATCH 1/4] * [android] support role property to accessibility (cherry picked from commit c4721ba) --- .../java/com/alibaba/weex/WXApplication.java | 3 ++ .../DefaultAccessibilityRoleAdapter.java | 44 +++++++++++++++++++ .../java/com/taobao/weex/WXSDKManager.java | 10 +++++ .../adapter/IWXAccessibilityRoleAdapter.java | 27 ++++++++++++ .../com/taobao/weex/common/Constants.java | 1 + .../taobao/weex/ui/component/WXComponent.java | 26 +++++++++++ 6 files changed, 111 insertions(+) create mode 100644 android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/DefaultAccessibilityRoleAdapter.java create mode 100644 android/sdk/src/main/java/com/taobao/weex/adapter/IWXAccessibilityRoleAdapter.java diff --git a/android/playground/app/src/main/java/com/alibaba/weex/WXApplication.java b/android/playground/app/src/main/java/com/alibaba/weex/WXApplication.java index e9c366a60f..5f787c6431 100644 --- a/android/playground/app/src/main/java/com/alibaba/weex/WXApplication.java +++ b/android/playground/app/src/main/java/com/alibaba/weex/WXApplication.java @@ -25,6 +25,7 @@ import com.alibaba.weex.commons.adapter.DefaultWebSocketAdapterFactory; import com.alibaba.weex.commons.adapter.ImageAdapter; import com.alibaba.weex.commons.adapter.JSExceptionAdapter; +import com.alibaba.weex.extend.adapter.DefaultAccessibilityRoleAdapter; import com.alibaba.weex.extend.adapter.InterceptWXHttpAdapter; import com.alibaba.weex.extend.component.RichText; import com.alibaba.weex.extend.component.WXComponentSyncTest; @@ -71,6 +72,8 @@ public void onCreate() { .build() ); + WXSDKManager.getInstance().setAccessibilityRoleAdapter(new DefaultAccessibilityRoleAdapter()); + try { Fresco.initialize(this); WXSDKEngine.registerComponent("synccomponent", WXComponentSyncTest.class); diff --git a/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/DefaultAccessibilityRoleAdapter.java b/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/DefaultAccessibilityRoleAdapter.java new file mode 100644 index 0000000000..cff363cc78 --- /dev/null +++ b/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/DefaultAccessibilityRoleAdapter.java @@ -0,0 +1,44 @@ +package com.alibaba.weex.extend.adapter; + +import android.text.TextUtils; + +import com.taobao.weex.adapter.IWXAccessibilityRoleAdapter; + +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +/** + * Created by moxun on 2017/11/13. + */ + +public class DefaultAccessibilityRoleAdapter implements IWXAccessibilityRoleAdapter { + private static Map CNRoles = new HashMap<>(); + + static { + CNRoles.put("button", "按钮"); + CNRoles.put("link", "链接"); + CNRoles.put("img", "图像"); + CNRoles.put("search", "搜索"); + CNRoles.put("header", "标题"); + } + + @Override + public String getRole(String key) { + if (isCN()) { + String cnRole = CNRoles.get(key); + if (!TextUtils.isEmpty(cnRole)) { + return cnRole; + } + } + return key; + } + + private static boolean isCN() { + try { + return "CN".equals(Locale.getDefault().getCountry()); + } catch (Throwable t) { + } + return false; + } +} diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java b/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java index ea8afdd34e..e41f2c1c40 100644 --- a/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java +++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java @@ -28,6 +28,7 @@ import com.taobao.weex.adapter.ICrashInfoReporter; import com.taobao.weex.adapter.IDrawableLoader; import com.taobao.weex.adapter.ITracingAdapter; +import com.taobao.weex.adapter.IWXAccessibilityRoleAdapter; import com.taobao.weex.adapter.IWXHttpAdapter; import com.taobao.weex.adapter.IWXImgLoaderAdapter; import com.taobao.weex.adapter.IWXJSExceptionAdapter; @@ -76,6 +77,7 @@ public class WXSDKManager { private IDrawableLoader mDrawableLoader; private IWXHttpAdapter mIWXHttpAdapter; private IActivityNavBarSetter mActivityNavBarSetter; + private IWXAccessibilityRoleAdapter mRoleAdapter; private ICrashInfoReporter mCrashInfo; @@ -443,6 +445,14 @@ public void registerInstanceLifeCycleCallbacks(InstanceLifeCycleCallbacks callba mLifeCycleCallbacks.add(callbacks); } + public void setAccessibilityRoleAdapter(IWXAccessibilityRoleAdapter adapter) { + this.mRoleAdapter = adapter; + } + + public IWXAccessibilityRoleAdapter getAccessibilityRoleAdapter() { + return mRoleAdapter; + } + public interface InstanceLifeCycleCallbacks { void onInstanceDestroyed(String instanceId); void onInstanceCreated(String instanceId); diff --git a/android/sdk/src/main/java/com/taobao/weex/adapter/IWXAccessibilityRoleAdapter.java b/android/sdk/src/main/java/com/taobao/weex/adapter/IWXAccessibilityRoleAdapter.java new file mode 100644 index 0000000000..46ca77f049 --- /dev/null +++ b/android/sdk/src/main/java/com/taobao/weex/adapter/IWXAccessibilityRoleAdapter.java @@ -0,0 +1,27 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.taobao.weex.adapter; + +/** + * Created by moxun on 2017/11/13. + */ + +public interface IWXAccessibilityRoleAdapter { + String getRole(String key); +} diff --git a/android/sdk/src/main/java/com/taobao/weex/common/Constants.java b/android/sdk/src/main/java/com/taobao/weex/common/Constants.java index 633d165a7a..3991f2737e 100644 --- a/android/sdk/src/main/java/com/taobao/weex/common/Constants.java +++ b/android/sdk/src/main/java/com/taobao/weex/common/Constants.java @@ -183,6 +183,7 @@ public interface Name { String NORMAL = "normal"; String ARIA_LABEL = "ariaLabel"; String ARIA_HIDDEN = "ariaHidden"; + String ROLE = "role"; String DIRECTION = "direction"; String RTL = "rtl"; diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java index 6f758666ac..07b692b27d 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java @@ -43,7 +43,9 @@ import android.support.annotation.Nullable; import android.support.annotation.RestrictTo; import android.support.annotation.RestrictTo.Scope; +import android.support.v4.view.AccessibilityDelegateCompat; import android.support.v4.view.ViewCompat; +import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; import android.text.TextUtils; import android.view.Menu; import android.view.View; @@ -59,6 +61,7 @@ import com.taobao.weex.WXEnvironment; import com.taobao.weex.WXSDKInstance; import com.taobao.weex.WXSDKManager; +import com.taobao.weex.adapter.IWXAccessibilityRoleAdapter; import com.taobao.weex.bridge.Invoker; import com.taobao.weex.common.Constants; import com.taobao.weex.common.IWXObject; @@ -859,6 +862,9 @@ protected boolean setProperty(String key, Object param) { t.printStackTrace(); } return true; + case Constants.Name.ROLE: + setRole(WXUtils.getString(param, "")); + return true; default: return false; } @@ -974,6 +980,26 @@ protected void setAriaLabel(String label) { } } + protected void setRole(String roleKey) { + View host = getHostView(); + String role = roleKey; + if (host != null && !TextUtils.isEmpty(roleKey)) { + IWXAccessibilityRoleAdapter roleAdapter = WXSDKManager.getInstance().getAccessibilityRoleAdapter(); + if (roleAdapter != null) { + role = roleAdapter.getRole(roleKey); + } + final String finalRole = role; + AccessibilityDelegateCompat delegate = new AccessibilityDelegateCompat() { + @Override + public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) { + super.onInitializeAccessibilityNodeInfo(host, info); + info.setRoleDescription(finalRole); + } + }; + ViewCompat.setAccessibilityDelegate(host, delegate); + } + } + /** * Avoid large size view fail in GPU-Animation. * @param fixedSize From 670cd596197111b1a5a64befd8edc33cdc6cd0ec Mon Sep 17 00:00:00 2001 From: misakuo Date: Mon, 20 Nov 2017 12:47:59 +0800 Subject: [PATCH 2/4] * [android] add license header (cherry picked from commit 2aa3b95) --- .../DefaultAccessibilityRoleAdapter.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/DefaultAccessibilityRoleAdapter.java b/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/DefaultAccessibilityRoleAdapter.java index cff363cc78..fd75ff3923 100644 --- a/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/DefaultAccessibilityRoleAdapter.java +++ b/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/DefaultAccessibilityRoleAdapter.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.alibaba.weex.extend.adapter; import android.text.TextUtils; From e30d333a38674d3d4ca252788149f3e4c51fdc6c Mon Sep 17 00:00:00 2001 From: misakuo Date: Mon, 20 Nov 2017 15:06:13 +0800 Subject: [PATCH 3/4] * [android] remove cn strings (cherry picked from commit 219d0e3) --- .../adapter/DefaultAccessibilityRoleAdapter.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/DefaultAccessibilityRoleAdapter.java b/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/DefaultAccessibilityRoleAdapter.java index fd75ff3923..1dd8657b5b 100644 --- a/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/DefaultAccessibilityRoleAdapter.java +++ b/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/DefaultAccessibilityRoleAdapter.java @@ -31,20 +31,20 @@ */ public class DefaultAccessibilityRoleAdapter implements IWXAccessibilityRoleAdapter { - private static Map CNRoles = new HashMap<>(); + private static Map ENRoles = new HashMap<>(); static { - CNRoles.put("button", "按钮"); - CNRoles.put("link", "链接"); - CNRoles.put("img", "图像"); - CNRoles.put("search", "搜索"); - CNRoles.put("header", "标题"); + ENRoles.put("button", "Button"); + ENRoles.put("link", "HyperLink"); + ENRoles.put("img", "Picture"); + ENRoles.put("search", "Search"); + ENRoles.put("header", "Title"); } @Override public String getRole(String key) { if (isCN()) { - String cnRole = CNRoles.get(key); + String cnRole = ENRoles.get(key); if (!TextUtils.isEmpty(cnRole)) { return cnRole; } @@ -54,7 +54,7 @@ public String getRole(String key) { private static boolean isCN() { try { - return "CN".equals(Locale.getDefault().getCountry()); + return "EN".equals(Locale.getDefault().getCountry()); } catch (Throwable t) { } return false; From bff78798c70713fa8c58cbbffba7e229710dcb8f Mon Sep 17 00:00:00 2001 From: misakuo Date: Mon, 27 Nov 2017 11:04:02 +0800 Subject: [PATCH 4/4] * [android] fix en role (cherry picked from commit 5fe0d9d) --- .../adapter/DefaultAccessibilityRoleAdapter.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/DefaultAccessibilityRoleAdapter.java b/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/DefaultAccessibilityRoleAdapter.java index 1dd8657b5b..21ff24f049 100644 --- a/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/DefaultAccessibilityRoleAdapter.java +++ b/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/DefaultAccessibilityRoleAdapter.java @@ -43,16 +43,16 @@ public class DefaultAccessibilityRoleAdapter implements IWXAccessibilityRoleAdap @Override public String getRole(String key) { - if (isCN()) { - String cnRole = ENRoles.get(key); - if (!TextUtils.isEmpty(cnRole)) { - return cnRole; + if (isEN()) { + String enRole = ENRoles.get(key); + if (!TextUtils.isEmpty(enRole)) { + return enRole; } } return key; } - private static boolean isCN() { + private static boolean isEN() { try { return "EN".equals(Locale.getDefault().getCountry()); } catch (Throwable t) {